1. Let us explore the environment first. How many nodes do you see in the cluster?
Including the controlplane and worker nodes.
controlplane ~ ➜ k get nodes
NAME STATUS ROLES AGE VERSION
controlplane Ready control-plane 8m43s v1.30.0
node01 Ready <none> 7m55s v1.30.0
answer : 2
2. How many applications do you see hosted on the cluster?
Check the number of deployments in the default namespace.
controlplane ~ ➜ k get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
blue 3/3 3 3 86s
answer : 1
3. Which nodes are the applications hosted on?
controlplane ~ ➜ k get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
blue-fffb6db8d-chr86 1/1 Running 0 47s 10.244.0.5 controlplane <none> <none>
blue-fffb6db8d-dj8d7 1/1 Running 0 47s 10.244.0.6 node01 <none> <none>
blue-fffb6db8d-klmz6 1/1 Running 0 4m26s 10.244.0.4 controlplane <none> <none>
answer : controlplane, node01
4. We need to take node01 out for maintenance. Empty the node of all applications and mark it unschedulable.
controlplane ~ ✖ k drain node01 --ignore-daemonsets
node/node01 already cordoned
Warning: ignoring DaemonSet-managed Pods: kube-flannel/kube-flannel-ds-vwp7x, kube-system/kube-proxy-4mjk4
evicting pod default/blue-fffb6db8d-p56pt
evicting pod default/blue-fffb6db8d-8lghd
pod/blue-fffb6db8d-8lghd evicted
pod/blue-fffb6db8d-p56pt evicted
node/node01 drained
https://kubernetes.io/docs/reference/kubectl/generated/kubectl_drain/
5. What nodes are the apps on now?
controlplane ~ ➜ k get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
blue-fffb6db8d-chr86 1/1 Running 0 47s 10.244.0.5 controlplane <none> <none>
blue-fffb6db8d-dj8d7 1/1 Running 0 47s 10.244.0.6 controlplane <none> <none>
blue-fffb6db8d-klmz6 1/1 Running 0 4m26s 10.244.0.4 controlplane <none> <none>
answer : controlplane
6. The maintenance tasks have been completed. Configure the node node01 to be schedulable again.
controlplane ~ ➜ k uncordon node01
node/node01 uncordone
7. How many pods are scheduled on node01 now in the default namespace?
controlplane ~ ➜ k get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
blue-fffb6db8d-chr86 1/1 Running 0 5m11s 10.244.0.5 controlplane <none> <none>
blue-fffb6db8d-dj8d7 1/1 Running 0 5m11s 10.244.0.6 controlplane <none> <none>
blue-fffb6db8d-klmz6 1/1 Running 0 8m50s 10.244.0.4 controlplane <none> <none>
answer : 0
8. Why are there no pods on node01?
uncordon 하여도 이미 drain 되어진 pod는 옮겨지지 않는다.
새로 만들어진 pod 인 경우에만 스케쥴링 될수 있다.
answer : Only when new pods are created they will be scheduled.
9. Why are the pods placed on the controlplane node?
Check the controlplane node details.
answer : controlplane node does not have any tains
10. Time travelling to the next maintenance window…
11. We need to carry out a maintenance activity on node01 again. Try draining the node again using the same command as before: kubectl drain node01 --ignore-daemonsets
Did that work?
answer : NO
12. Why did the drain command fail on node01? It worked the first time!
controlplane ~ ➜ k get nodes
NAME STATUS ROLES AGE VERSION
controlplane Ready control-plane 24m v1.30.0
node01 Ready,SchedulingDisabled <none> 24m v1.30.0
controlplane ~ ➜ k get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
blue-fffb6db8d-chr86 1/1 Running 0 13m 10.244.0.5 controlplane <none> <none>
blue-fffb6db8d-dj8d7 1/1 Running 0 13m 10.244.0.6 controlplane <none> <none>
blue-fffb6db8d-klmz6 1/1 Running 0 16m 10.244.0.4 controlplane <none> <none>
hr-app 1/1 Running 0 3m33s 10.244.1.4 node01 <none> <none>
controlplane ~ ➜ k drain node01
node/node01 already cordoned
error: unable to drain node "node01" due to error:[cannot delete cannot delete Pods that declare no controller (use --force to override): default/hr-app, cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-flannel/kube-flannel-ds-vwp7x, kube-system/kube-proxy-4mjk4], continuing command...
There are pending nodes to be drained:
node01
cannot delete cannot delete Pods that declare no controller (use --force to override): default/hr-app
cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-flannel/kube-flannel-ds-vwp7x, kube-system/kube-proxy-4mjk4
hr-app 은 replicaset 으로 만들어진 pod 가 아니기 때문에 삭제후에 drain 해야한다.
answer : there is a pod in node01 which is not part of a replicaset
13. What is the name of the POD hosted on node01 that is not part of a replicaset?
answer : hr-app
14. What would happen to hr-app if node01 is drained forcefully?
Try it and see for yourself.
force 로 drain 한다면 해당 파드는 삭제되고 재 스케쥴링 될수 없다.
answer : hr-app will be lost forever
15. Oops! We did not want to do that! hr-app is a critical application that should not be destroyed. We have now reverted back to the previous state and re-deployed hr-app as a deployment.
16. hr-app is a critical app and we do not want it to be removed and we do not want to schedule any more pods on node01.
Mark node01 as unschedulable so that no new pods are scheduled on this node.
Make sure that hr-app is not affected.
controlplane ~ ➜ k cordon node01
node/node01 cordoned
drain 과 cordon 차이
cordon
cordon 명령어는 특정 노드에 새로운 Pod가 스케줄링되지 않도록 설정합니다. 이 명령어는 기존에 노드에 있는 Pod에는 영향을 주지 않으며, 단순히 해당 노드에 새로운 Pod가 할당되지 않도록 막는 역할을 합니다.
주요 특징:
• 새로운 Pod 스케줄링 방지: cordon된 노드에는 새로운 Pod가 스케줄링되지 않습니다.
• 기존 Pod 유지: 기존에 노드에 있는 Pod는 그대로 유지됩니다.
• 비파괴적: 노드의 상태를 변경하지 않고 단순히 새로운 Pod 할당을 방지합니다.
drain
drain 명령어는 특정 노드에서 모든 Pod를 안전하게 제거합니다. 이는 노드를 유지보수 모드로 전환하거나 클러스터에서 제거할 때 주로 사용됩니다. drain 명령어는 ReplicaSet, Deployment, DaemonSet, StatefulSet 등에 의해 관리되는 Pod를 다른 노드로 이동시키고, ReplicaSet으로 관리되지 않는 Pod는 기본적으로 삭제하지 않습니다.
주요 특징:
• Pod 제거: 노드에서 모든 Pod를 제거합니다.
• Pod 이동: ReplicaSet, Deployment, DaemonSet, StatefulSet 등에 의해 관리되는 Pod를 다른 노드로 이동시킵니다.
• 강제 옵션: --force 옵션을 사용하여 관리되지 않는 Pod도 제거할 수 있습니다.
• 데이터 보존 옵션: --delete-emptydir-data 옵션을 사용하여 emptyDir 볼륨의 데이터를 삭제할 수 있습니다.
요약 비교
특성 | cordon | drain |
새로운 Pod 스케줄링 | 차단 | 차단 |
기존 Pod | 유지 | 제거 |
ReplicaSet 관리 Pod | 영향을 주지 않음 | 다른 노드로 이동 |
관리되지 않는 Pod | 영향을 주지 않음 | 기본적으로 영향을 주지 않음 (--force 필요) |
주 용도 | 노드 유지보수 전 스케줄링 방지 | 노드 유지보수 또는 제거 시 안전한 Pod 이동 |
주요 옵션 | 없음 | --ignore-daemonsets, --force, --delete-emptydir-data |
'IT 기술 > k8s' 카테고리의 다른 글
[cka] Backup and Restore Methods (0) | 2024.07.12 |
---|---|
[cka] Cluster Upgrade Process (0) | 2024.07.11 |
[cka] Init Containers (0) | 2024.07.06 |
[cka] Multi Container PODs (0) | 2024.07.05 |
[cka] Secrets (0) | 2024.07.05 |
댓글