Kubernetes 이론 (2)
Pod
쿠버네티스는 파드라는 컴퓨팅 단위를 사용하여 어플리케이션을 관리 배포한다. 어학사전을 찾아보면 pod는 콩이 들어있는 꼬투리라 되어있다. 하나의 콩 꼬투리 안에 여러개의 콩이 들어있는것 처럼, 하나의 파드 안에는 여러개의 컨테이너가 있을 수 있다.
위 그림 처럼 모든 파드는 최소 1개 이상의 컨테이너로 이루어져 있다. 하나의 파드 안의 컨테이너들은 1개의 private IP를 공유하며 사용한다.
쿠버네티스에서 파드를 최소 단위로 사용하고 있기 때문에 개발자 역시 어플리케이션을 파드 단위로 개발 및 실행방식을 명시해야 한다. 보통 yaml 파일을 이용하게 된다. yaml 파일은 YAML Ain't Markup Language 라는 재귀적인 이름을 가지고 있지만 원래 Yet Another Markup Language 에서 시작하였다. 아래는 nginx 이미지를 사용한 파드를 실행시키기 위한 yaml 파일의 예시이다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
위 파일은 쿠버네티스 공식 홈페이지에서 제공하는 예시 yaml파일로, 아래처럼 링크를 바로 연결하여 실행 할 수 있다.
kubectl apply -f https://k8s.io/examples/pods/simple-pod.yaml
또 다른 방법은 위 파일을 로컬 경로에 저장하여 실행시키는 방법이 있다.
kubectl apply -f simple-pod.yaml
위 예시는 단순한 nginx 컨테이너로 cpu, memory 등 자원에 대한 명세도 없다.
일반적으로 쿠버네티스는 파드를 직접 실행시키지는 않는다. 레플리카 셋, 스테이트풀 셋, 디플로이먼트 등을 이용하여 파드를 관리, 생성하게 된다.
Controller
쿠버네티스는 자동 롤아웃과 롤백을 지원해주고, 자동화된 복구를 지원한다. 이를 위해 쿠버네티스는 컨테이너의 개수를 보장하고 실패한 컨테이너를 새실행 시켜주기 위한 controller 들을 사용한다. Replica set 과 Deployment도 컨트롤러의 한 종류이다. 컨트롤러는 대표적으로 아래 4가지의 기능을 한다.
1. Auto Healing - Pod 또는 Pod이 실행되고 있는 Node에 문제가 생겼을 경우 자동으로 복구하는 기능
ex) ReplicaSet, DaemonSet
2. Software Update - Pod을 업데이트 하는 기능, 롤백 기능도 제공
ex) Deployment
3. Auto Scaling - Pod의 리소스가 부족할 때 Pod을 추가적으로 생성하는 기능
ex) HPA(Horizontal Pod Autoscaler),VPA(Vertical Pod Autoscaler)
4. Job - 일시적인 작업을 위해 필요한 순간에만 Pod을 만들었다가 삭제할 수 있는 기능
ex) job, cron job
Replica Set
레플리카셋은 파드의 숫자를 보장해 주기 위한 컨트롤러이다. 레플리카셋의 선언 방식은 파드의 선언방식과 비슷하지만, 파드의 개수가 replicas 항목에 추가되어 있다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
# 케이스에 따라 레플리카를 수정한다.
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
위의 yaml을 저장하거나, kubectl apply -f https://kubernetes.io/examples/controllers/frontend.yaml 을 통해 실행시키면 php-redis 이미지를 가진 세개의 파드가 실행되게 된다.
위의 YAML 파일을 보면 중간의 selector 부분에 match labels 부분이 있는 것을 확인할 수 있다. 레플리카셋은 각 파드가 해당 라벨을 가지고 있는지를 확인한다. 해당 라벨을 가진 파드의 수가 명시된 레플리카의 개수보다 적으면 아래 템플렛을 이용하여 파드를 추가적으로 생성해준다. 추가적으로 해당 라벨을 가진 파드 임의로 생성할 경우 레플리카의 개수보다 많아지면 때문에 해당 파드를 삭제시킨다. 추가적인 예시는 실습 포스팅에서 진행하도록 하겠다.
Deployment
레플리카셋은 업데이트 기능을 지원해 주지 않기 때문에 Deployment 라는 별도의 컨트롤러를 이용하게 된다. 결과적으로 Deployment 를 생성하면 Deployment 가 Replica Set을 생성하고, Replica Set이 Pod를 생성하게 된다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
위의 YAML을 사용하여 nginx-deployment 디플로이먼트를 생성하면 뒤에 임의의 해쉬값이 붙은
nginx-deployment-75675f5897 이라는 레플리카셋이 생성된다. 이 레플리카셋은 3개의 파드를 유지하라 명시되어 있기 때문에 3개의 파드를 생성하게 된다. 파드 역시 임의의 해쉬값이 붙은 형태로 생성된다.
nginx-deployment-75675f5897-7ci7o
nginx-deployment-75675f5897-kzszj
nginx-deployment-75675f5897-qqcnn
업데이트 기능을 확인하기 위해 nginx 버전을 업데이트하면 새로운 레플리카셋이 생성된다. 새로운 레플리카셋에 하나의 파드가 생성되면, 원래 있었던 레플리카셋에 파드 하나가 없어진다. 이와같이 deployment에 명시된 파드의 개수인 3개보다 많은 파드의 개수를 유지하며 업데이트를 진행하게 된다. 결과적으로 레플리카셋을 확인하게 되면 아래와 같이 보이게 된다.
DESIRED CURRENT READY
(기존) nginx-deployment-75675f5897 0 0 0
(변경) nginx-deployment-2035384211 3 3 3