Skip to content

Instantly share code, notes, and snippets.

@ianychoi
Last active July 26, 2021 15:47
Show Gist options
  • Select an option

  • Save ianychoi/4d31a9aa72eb1d20b0ccda4b9cfb5b15 to your computer and use it in GitHub Desktop.

Select an option

Save ianychoi/4d31a9aa72eb1d20b0ccda4b9cfb5b15 to your computer and use it in GitHub Desktop.
쿠버네티스 - Deployment
  • 디플로이먼트 생성 및 확인
# (옵션) 마스터 - 터미널1
watch -d 'kubectl get pods,rs,deploy -o wide'
# (옵션) 노드 - 터미널1
watch -d 'docker ps --format "table {{.Image}}\t{{.Status}}\t{{.Names}}" | grep -v pause'

# 생성
curl -s -O https://raw.githubusercontent.com/gasida/DKOS/main/4/deployment-cndk.yaml
kubectl apply -f deployment-cndk.yaml

# 한꺼번에 디플로이먼트, 레플리카셋, 파드 확인
kubectl get deploy,rs,pods
root@k8s-m:~# kubectl get deploy,rs,pods
NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment-cndk   3/3     3            3           10s

NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-cndk-5f5d7bfcb8   3         3         3       9s

NAME                                   READY   STATUS    RESTARTS   AGE
pod/deployment-cndk-5f5d7bfcb8-74bkl   1/1     Running   0          9s
pod/deployment-cndk-5f5d7bfcb8-ht6hn   1/1     Running   0          9s
pod/deployment-cndk-5f5d7bfcb8-ldlbr   1/1     Running   0          9s

# 디플로이먼트 확인
kubectl get deployments.apps -o wide
root@k8s-m:~# kubectl get deployments.apps -o wide
NAME              READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
deployment-cndk   3/3     3            3           20s   nginx        nginx:latest   app=cndk-nginx-pods

kubectl describe deployments.apps deployment-cndk
...
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
...

# 레플리카셋 확인 : 이름 뒤에 디플로이먼트가 랜덤 생성한 해쉬값이 붙어있음
kubectl get replicasets.apps -o wide
root@k8s-m:~# kubectl get replicasets.apps -o wide
NAME                         DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR
deployment-cndk-5f5d7bfcb8   3         3         3       46s   nginx        nginx:latest   app=cndk-nginx-pods,pod-template-hash=5f5d7bfcb8

root@k8s-m:~# kubectl describe replicasets.apps deployment-cndk-#####
...

#  확인 : 파드의 이름 맨 뒤부분-##### 부분은 레플리카셋이 해쉬 랜덤값을 붙였음
kubectl get pod --show-labels
root@k8s-m:~# kubectl get pod --show-labels
NAME                               READY   STATUS    RESTARTS   AGE   LABELS
deployment-cndk-5f5d7bfcb8-74bkl   1/1     Running   0          81s   app=cndk-nginx-pods,pod-template-hash=5f5d7bfcb8
deployment-cndk-5f5d7bfcb8-ht6hn   1/1     Running   0          81s   app=cndk-nginx-pods,pod-template-hash=5f5d7bfcb8
deployment-cndk-5f5d7bfcb8-ldlbr   1/1     Running   0          81s   app=cndk-nginx-pods,pod-template-hash=5f5d7bfcb8

# 디플로이먼트에 관리되는 파드 갯수를 증가시켜보기
kubectl scale deployment --replicas=6 deployment-cndk

# 파드를 삭제해보자! >> 어떻게 동작할까요?
kubectl delete pod --all

# 레플리카셋을 삭제해보자! >> 어떻게 동작할까요?
kubectl delete replicasets.apps --all

# 다음 실습을 위해 디플로이먼트 삭제
kubectl delete deployments.apps deployment-cndk
  • 롤링 업데이트 및 롤백
    • deployment-nginx-1.yaml : nginx v1.11 확인
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: cndk-nginx-pods
  template:
    metadata:
      name: cndk-nginx-pod
      labels:
        app: cndk-nginx-pods
    spec:
      containers:
      - name: nginx
        image: nginx:1.11
  • 디플로이먼트 생성 시 record 옵션 사용
    • 참고: --record 플래그를 지정해서 실행된 명령을 kubernetes.io/change-cause 리소스 어노테이션에 작성할 수 있다. 기록된 변경사항은 향후 인트로스펙션(introspection)에 유용하다. 예를 들면, 디플로이먼트의 각 수정 버전에서 실행된 명령을 볼 수 있다. (URL: https://kubernetes.io/ko/docs/concepts/workloads/controllers/deployment/ )
# 생성 시 --record 옵션을 추가
curl -s -O https://raw.githubusercontent.com/gasida/DKOS/main/4/deployment-nginx-1.yaml
kubectl apply -f deployment-nginx-1.yaml --record

# 파드 정보 확인
kubectl get pod -o wide
root@k8s-m:~# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
deployment-nginx-77b4cbf48d-bcgcw   1/1     Running   0          46s   172.16.46.12    k8s-w2   <none>           <none>
deployment-nginx-77b4cbf48d-hq54p   1/1     Running   0          46s   172.16.228.78   k8s-w1   <none>           <none>
deployment-nginx-77b4cbf48d-wz578   1/1     Running   0          46s   172.16.197.11   k8s-w3   <none>           <none>

# 파드 이미지 확인
kubectl get pod -o yaml | grep "image: nginx"
root@k8s-m:~# kubectl get pod -o yaml | grep "image: nginx"
    - image: nginx:1.11
      image: nginx:1.11
...

# --record 옵션의 정보 확인
kubectl rollout history deployment deployment-nginx
root@k8s-m:~# kubectl rollout history deployment deployment-nginx
deployment.apps/deployment-nginx
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=deployment-nginx-1.yaml --record=true
  • 버전 (롤링) 업데이트 실행 및 확인 : 기존 v1.11 → 업데이트 v1.12 ⇒ 파드 종료와 생성이 어떤 순서대로 되는지 확인!
# 터미널2
while true; do kubectl rollout status deployment deployment-nginx && echo "--------------" && date; sleep 1; done

# v1.12 로 버전 업데이트 실행
kubectl set image deployment deployment-nginx nginx=nginx:1.12 --record && kubectl get pod -w
kubectl get pod -o yaml | grep "image: nginx"

# 한 번 더: v1.13으로
kubectl set image deployment deployment-nginx nginx=nginx:1.13 --record && kubectl get pod -w
kubectl get pod -o yaml | grep "image: nginx"

# 이번에는 v1.14로!
kubectl set image deployment deployment-nginx nginx=nginx:1.14 --record && kubectl get pod -w
kubectl get pod -o yaml | grep "image: nginx"

# 버전 업데이트 히스토리 확인
kubectl rollout history deployment deployment-nginx
root@k8s-m:~# kubectl rollout history deployment deployment-nginx
deployment.apps/deployment-nginx
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=deployment-nginx-1.yaml --record=true
2         kubectl set image deployment deployment-nginx nginx=nginx:1.12 --record=true
3         kubectl set image deployment deployment-nginx nginx=nginx:1.13 --record=true
4         kubectl set image deployment deployment-nginx nginx=nginx:1.14 --record=true
  • 버전 롤백 : 기존 v1.14 → v1.2
# 리비전 2로 버전 롤백
kubectl rollout undo deployment deployment-nginx --to-revision=2
kubectl get pod -o yaml | grep "image: nginx"

# 버전별 롤백이 가능한 이유 : 레플리카셋 정보(기록)을 가지고 있으며, 라벨로 구별되어 있음
kubectl get replicasets.apps --show-labels
root@k8s-m:~# kubectl get replicasets.apps --show-labels
NAME                          DESIRED   CURRENT   READY   AGE     LABELS
deployment-nginx-5cbcc59b4c   0         0         0       5m12s   app=cndk-nginx-pods,pod-template-hash=5cbcc59b4c
deployment-nginx-67cc8cd4f4   0         0         0       7m23s   app=cndk-nginx-pods,pod-template-hash=67cc8cd4f4
deployment-nginx-77b4cbf48d   0         0         0       9m53s   app=cndk-nginx-pods,pod-template-hash=77b4cbf48d
deployment-nginx-78bc6dfdf7   3         3         3       8m24s   app=cndk-nginx-pods,pod-template-hash=78bc6dfdf7

# 디플로이먼트 상세 정보 확인
kubectl describe deployments.apps deployment-nginx
root@k8s-m:~# kubectl describe deployments.apps deployment-nginx
Name:                   deployment-nginx
Namespace:              default
CreationTimestamp:      Thu, 24 Jun 2021 04:11:30 +0000
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 5
                        kubernetes.io/change-cause: kubectl set image deployment deployment-nginx nginx=nginx:1.12 --record=true
Selector:               app=cndk-nginx-pods
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=cndk-nginx-pods
  Containers:
   nginx:
    Image:        nginx:1.12
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   deployment-nginx-78bc6dfdf7 (3/3 replicas created)
Events:
  Type    Reason             Age                     From                   Message
  ----    ------             ----                    ----                   -------
  Normal  ScalingReplicaSet  11m                     deployment-controller  Scaled up replica set deployment-nginx-77b4cbf48d to 3
  Normal  ScalingReplicaSet  9m47s                   deployment-controller  Scaled up replica set deployment-nginx-78bc6dfdf7 to 1
  Normal  ScalingReplicaSet  9m34s                   deployment-controller  Scaled down replica set deployment-nginx-77b4cbf48d to 2
  Normal  ScalingReplicaSet  9m17s                   deployment-controller  Scaled down replica set deployment-nginx-77b4cbf48d to 1
  Normal  ScalingReplicaSet  9m4s                    deployment-controller  Scaled down replica set deployment-nginx-77b4cbf48d to 0
  Normal  ScalingReplicaSet  8m46s                   deployment-controller  Scaled up replica set deployment-nginx-67cc8cd4f4 to 1
  Normal  ScalingReplicaSet  8m36s                   deployment-controller  Scaled down replica set deployment-nginx-78bc6dfdf7 to 2
  Normal  ScalingReplicaSet  2m47s (x2 over 9m34s)   deployment-controller  Scaled up replica set deployment-nginx-78bc6dfdf7 to 2
  Normal  ScalingReplicaSet  2m45s (x2 over 9m17s)   deployment-controller  Scaled up replica set deployment-nginx-78bc6dfdf7 to 3
  Normal  ScalingReplicaSet  2m43s (x14 over 8m36s)  deployment-controller  (combined from similar events): Scaled down replica set deployment-nginx-5cbcc59b4c to 0

# 다음 실습을 위해 삭제
kubectl delete deployments.apps --all
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment