# (옵션) 마스터 - 터미널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 옵션을 추가
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
# 리비전 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