Deployment의 동작 확인 1

11569 단어 kubectlkubernetes

소개



지금까지 Pod, ReplicaSet의 동작을 확인해 왔으므로 이번에는 Deployment의 동작을 확인합니다.
Deployment는 ReplicaSet, Pod의 상위 개념으로 다음과 같은 관계가 있습니다.


Deployment 작성



yaml 파일 만들기 및 apply



다음 yaml 파일을 만들었습니다.

sampleDep.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-pod4
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-dep
  template:
    metadata:
      labels:
        app: nginx-dep
    spec:
      containers:
        - name: nginx
          image: nginx:1.16

apply합니다.
$ kubectl apply -f sampleDep.yaml
deployment.apps/sample-pod4 created

확인



만든 Deployment를 확인합니다.
$ kubectl get deployment
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
sample-pod4   3/3     3            3           30s
$ kubectl get rs
NAME                     DESIRED   CURRENT   READY   AGE
sample-pod4-597898b879   3         3         3       40s
$ kubectl get pod
NAME                           READY   STATUS    RESTARTS   AGE
sample-pod4-597898b879-29zwd   1/1     Running   0          49s
sample-pod4-597898b879-phfrf   1/1     Running   0          49s
sample-pod4-597898b879-rwtd5   1/1     Running   0          49s

Deployment가 ReplicaSet을 만들고 ReplicaSet이 Pod를 만들고 있음을 알 수 있습니다.
· ReplicaSet 이름은 "[Deploymet 이름] + 임의 문자열"
・Pod명은, 「[ReplicaSet명]+임의의 문자열」
되어 있습니다.

kubectl describe 명령을 사용하여 자세한 내용을 확인합니다.
$ kubectl describe rs sample-pod4-597898b879
・・・
Annotations:    deployment.kubernetes.io/desired-replicas: 3
                deployment.kubernetes.io/max-replicas: 4
                deployment.kubernetes.io/revision: 1
・・・
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  115s  replicaset-controller  Created pod: sample-pod4-597898b879-rwtd5
  Normal  SuccessfulCreate  115s  replicaset-controller  Created pod: sample-pod4-597898b879-phfrf
  Normal  SuccessfulCreate  115s  replicaset-controller  Created pod: sample-pod4-597898b879-29zwd

롤링 업데이트 및 버전 제어



Deployment의 특징인 롤링 업데이트 및 버전 관리 동작을 확인합니다.

롤링 업데이트



yaml 파일을 편집하여 nginx 버전을 1.16에서 '1.17'로 변경합니다.
수정한 yaml 파일을 적용합니다.
$ kubectl apply -f sampleDep.yaml
deployment.apps/sample-pod4 configured

업데이트 상태를 kubectl rollout 명령으로 확인합니다.
$ kubectl rollout status deployment sample-pod4
Waiting for deployment "sample-pod4" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "sample-pod4" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "sample-pod4" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "sample-pod4" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "sample-pod4" rollout to finish: 1 old replicas are pending termination...
deployment "sample-pod4" successfully rolled out

1.17의 복제본이 만들어졌으며 1.16의 복제본이 중지되었음을 알 수 있습니다.

업데이트 후 상태를 확인합니다.
$ kubectl get deployments sample-pod4
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
sample-pod4   3/3     3            3           6m15s
$ kubectl get rs -o wide
NAME                     DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES       SELECTOR
sample-pod4-597898b879   0         0         0       6m48s   nginx        nginx:1.16   app=nginx-dep,pod-template-hash=597898b879
sample-pod4-65fb458568   3         3         3       59s     nginx        nginx:1.17   app=nginx-dep,pod-template-hash=65fb458568
$ kubectl get pod
NAME                           READY   STATUS    RESTARTS   AGE
sample-pod4-65fb458568-cnqvv   1/1     Running   0          71s
sample-pod4-65fb458568-rfhkj   1/1     Running   0          69s
sample-pod4-65fb458568-vqtj5   1/1     Running   0          73s

1.16의 ReplicaSet(sample-pod4-597898b879)의 복제본 수는 '0'이고 1.17의 ReplicaSet(sample-pod4-65fb458568)은 '3'이며 새 Pod가 배포되었음을 확인할 수 있습니다. .

버전 관리



kubectl describe 명령을 사용하여 각 ReplicaSet 버전을 확인합니다.
$ kubectl describe rs sample-pod4-65fb458568
Name:           sample-pod4-65fb458568
・・・
Annotations:    deployment.kubernetes.io/desired-replicas: 3
                deployment.kubernetes.io/max-replicas: 4
                deployment.kubernetes.io/revision: 2
・・・
  Containers:
   nginx:
    Image:        nginx:1.17
・・・

1.17 ReplicaSet의 Revision이 Annotation으로 설정되어 있고 "2"로 올라가는 것을 확인할 수 있습니다.

1.16 분도 확인해 둡니다.
$ kubectl describe rs sample-pod4-597898b879
Name:           sample-pod4-597898b879
・・・
Annotations:    deployment.kubernetes.io/desired-replicas: 3
                deployment.kubernetes.io/max-replicas: 4
                deployment.kubernetes.io/revision: 1
・・・
  Containers:
   nginx:
    Image:        nginx:1.16
・・・
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  10m    replicaset-controller  Created pod: sample-pod4-597898b879-rwtd5
  Normal  SuccessfulCreate  10m    replicaset-controller  Created pod: sample-pod4-597898b879-phfrf
  Normal  SuccessfulCreate  10m    replicaset-controller  Created pod: sample-pod4-597898b879-29zwd
  Normal  SuccessfulDelete  4m59s  replicaset-controller  Deleted pod: sample-pod4-597898b879-rwtd5
  Normal  SuccessfulDelete  4m57s  replicaset-controller  Deleted pod: sample-pod4-597898b879-phfrf
  Normal  SuccessfulDelete  4m55s  replicaset-controller  Deleted pod: sample-pod4-597898b879-29zwd

이쪽은 Revision은 「1」인 채입니다. 또한 Pod 생성/삭제 내역을 확인할 수 있습니다.

(덤) ReplicaSet의 롤링 업데이트



문득, ReplicaSet에서도 yaml 파일의 버전 바꾸면, 롤링 업데이트 할 수 있을까? ? 라고 생각해 보았습니다.

작성한 yaml 파일은 이쪽.

sampleRS.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: sample-pod5
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-dep
  template:
    metadata:
      labels:
        app: nginx-dep
    spec:
      containers:
        - name: nginx
          image: nginx:1.16

apply합니다.
$ kubectl apply -f sampleRS.yaml
replicaset.apps/sample-pod5 created

확인합니다.
$ kubectl get rs -o wide
NAME          DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES       SELECTOR
sample-pod5   3         3         3       18s   nginx        nginx:1.16   app=nginx-dep
$ kubectl get pod
NAME                READY   STATUS    RESTARTS   AGE
sample-pod5-2t5tx   1/1     Running   0          4s
sample-pod5-6xd6b   1/1     Running   0          4s
sample-pod5-xhvk2   1/1     Running   0          4s
$ kubectl describe rs
Name:         sample-pod5
・・・
  Containers:
   nginx:
    Image:        nginx:1.16
・・・

만약 컨테이너에 로그인하여 버전을 확인합니다.
$ kubectl exec -it sample-pod5-xhvk2 /bin/bash
root@sample-pod5-xhvk2:/# nginx -v
nginx version: nginx/1.16.1
root@sample-pod5-xhvk2:/# exit
exit

ReplicaSet에서 롤링 업데이트가 가능한지 확인



yaml 파일의 버전을 다시 작성하고 적용합니다.
$ kubectl apply -f sampleRS.yaml
replicaset.apps/sample-pod5 configured

확인합니다.
$ kubectl get rs -o wide
NAME          DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES       SELECTOR
sample-pod5   3         3         3       4m11s   nginx        nginx:1.17   app=nginx-dep

이미지 버전은 올라가고 있습니다.

포드를 확인합니다.
$ kubectl get pod
NAME                READY   STATUS    RESTARTS   AGE
sample-pod5-2t5tx   1/1     Running   0          4m15s
sample-pod5-6xd6b   1/1     Running   0          4m15s
sample-pod5-xhvk2   1/1     Running   0          4m15s

포드는 변하지 않습니다.

kubectl describe에서도 확인합니다.
$ kubectl describe rs
Name:         sample-pod5
・・・
  Containers:
   nginx:
    Image:        nginx:1.17
・・・
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  4m30s  replicaset-controller  Created pod: sample-pod5-xhvk2
  Normal  SuccessfulCreate  4m30s  replicaset-controller  Created pod: sample-pod5-2t5tx
  Normal  SuccessfulCreate  4m30s  replicaset-controller  Created pod: sample-pod5-6xd6b

이쪽도 이미지의 버전은 바뀌고 있지만, Pod는 그대로군요.

로그인하여 확인합니다.
$ kubectl exec -it sample-pod5-xhvk2 /bin/bash
root@sample-pod5-xhvk2:/# nginx -v
nginx version: nginx/1.16.1
root@sample-pod5-xhvk2:/# exit
exit

역시 1.16 그대로입니다.

요약



Deployment/ReplicaSet/Pod의 기능을 아래에 정리합니다.



Deployment
ReplicaSet
포드


롤링 업데이트



버전 관리



자기 치유



스케일링



컨테이너 생성





큰 것은 소를 겸하는 것은 아니지만, 기능적으로 Deployment는 모두 포함하고 있으므로, 만일 1Pod/1 컨테이너 밖에 사용하지 않는 경우에서도 Deployment를 사용하는 것이 추천되고 있습니다.

Deployment의 동작에 대해서는 좀 더 조사해보고 싶습니다.

좋은 웹페이지 즐겨찾기