Kubernetes 개념 한판 정리

Kubernetes의 정의

  • Container화 된 application을 배포/관리해주는 오픈소스 Container Orchestrator Framework

Kubernetes에서 제공하는 기능

  1. Service Discovery

DNS 이름 또는 자체 IP주소를 사용해서 Client가 사용할 Container를 노출할 수 있음. Traffic을 Load Balancing하고, AutoScaling이 가능하다.

  1. Storage Orchestration

원하는 저장소 시스템을 탑재할 수 있다.

  1. 자동화된 binPacking

container화된 작업을 실행하는데 사용할 수 있는 kubernetes cluster 노드를 제공하며, 각 container가 필요로 하는 CPU , RAM을 설정하면 kubernetes가 container를 resource를 가장 잘 사용할 수 있는 node에 배포한다.

  1. self-healing

실패한 container 재시작, 교체기능을 가지고 있다.

Kubernetes Object 이해하기

object란 k8s cluster에 대해 의도한 상태를 명세해놓은 하나의 “의도를 담은 레코드”이다.
( https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/kubernetes-objects/ )

object에는 대표적으로 pod, service, volume, namespace등 이 있다.

object를 관리하는 controller는 사용자가 바라는 상태와 현재 상태가 일치하도록 object를 생성/삭제한다.

controller에는 대표적으로 ReplicaSet, Deployment, DemonSet, Job등이 있다.

스쿼드별로 하나의 kubernetes cluster를 공유하기

  • namespace는 하나의 k8s cluster를 여러 개의 논리적인 단위로 쪼개서 사용한다.
  • namespace를 통해 하나의 k8s cluster를 공유하되, 논리적으로 구분할 수 있다.
k8s namespace
  • 기본적으로 k8s 를 실행하면 몇 개의 namespace가 자동으로 생성됩니다. 이 중 default namespace는 기본 namespace로 별도로 k8s에 namespace를 지정하지 않으면 항상 이 default namespace에 명령이 적용된다.

Kubernetes Object 기술하기

kubernetes에서는 object를 생성할때, object의 spec을 지정해주어야 한다.
대부분 yaml파일로 kubectl CLI에 제공한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

대표적으로 사용되는 필드값들은 다음의 의미를 나타낸다.

  • apiVersion : object를 생성하기 위한 Kubernetes버전
  • kind : 생성할 object의 종류
  • metadata : object를 유일하게 구분지어 줄 데이터
  • spec : object에 의도하는 상태값들

Kubernetes - Pod Object

  • kubernetes에서 배포 가능한 가장 작은 컴퓨팅 단위이다.
  • 하나 이상의 Container의 그룹이며, 동일한 스토리지 * 네트워크 * 해당 컨테이너 구동방식에 대한 명세를 공유한다.
  • 한 pod내에서 container들간의 port가 중복될 수는 없다.
  • pod별로 ip가 할당되는데 이는 동적으로 변경되는 내부 IP이다.
  • pod를 포함한 kubernetes object에는 key-value 형태의 label을 달 수 있다.
    (metadata.labels.type)
    type - production , type - develop과 같이 사용 목적에 따라 원하는 pod를 선택할 수 있다.
  • pod가 어떤 물리 node에 띄워질지는 직접 선택 또는 node scheduler에 의해 자동 선택될 수 있다.
  • 직접 선택하는 경우는 spec.nodeSelector.hostname: 노드명꼴로 배포할 노드명을 선택할 수 있다.
  • 자동 선택되는 경우에는 pod에서 요구되는 resource(예: spec.containers.reqeusts.memory: 2Gi )를 수용할 수 있는 적합한 물리 node에서 배포된다.

Pod * Service 생성 예시

  1. pod생성
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ## Pod yaml
    apiVersion: v1
    kind: Pod
    metadata:
    name: pod-2
    labels:
    lo: dev ## label (lo[key] - dev[value])꼴로 지정할 수 있다.
    spec:
    containers:
    - name: container
    image: kubetm/init
  2. service 생성
    1
    2
    3
    4
    5
    6
    7
    8
    9
    apiVersion: v1
    kind: Service
    metadata:
    name: svc-1
    spec:
    selector:
    lo: dev
    ports:
    - port: 8080
    다음과 같이 spec.selector 를 이용하면 특정 label을 가진 pod를 선택할 수 있다.
Pod 생성 후 Service Object에서 Selector를 통한 Pod 선택
  • 다음과 같이 특정 물리 node에 pod를 띄우도록 설정할 수 있다.
1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
name: pod-test
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1 ## 특정 물리노드 지정
containers:
- name: container
image: kubetm/init
  • nodeSelector에 특정 노드를 명시하지 않은 경우에는 node Scheduler에 의해 pod에 명시된 resource 필드값을 충족시킬 수 있는 node에 pod가 배포된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Pod
metadata:
name: pod-test
spec:
containers:
- name: container
image: kubetm/init
resources:
requests:
memory: 2Gi
limits:
memory: 3Gi
[1] Node Scheduler

Reference

Comments