
이번 벨로그 글은 “Node cordon & drain 실습”을 주제로,
노드 하나를 스케줄 불가로 만들고(cordon),
파드를 안전하게 내보내는(drain) 실습 중심으로 구성된다.
homebrew로 kind를 설치해주고
파일명 :kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
로 워커노드 3개를 만드는 config 파일을 만든 후,
kind create cluster --name multi-node --config kind-config.yaml
이 명령어를 통해 노드를 만들어준 뒤 확인해준다.

그럼 다음과 같이 워커노드 3개가 생긴것을 확인할 수 있다.
파일명: nginx-deploy.yaml
먼저 파드 3개를 생성하는 디플로이먼트를 생성한다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
kubectl apply -f nginx-deploy.yaml
를 사용하여 배포 한다.
그러면 nginx-deploy로 시작하는 파드 3개를 볼 수 있으며 각 노드에 할당된 것을 확인할 수 있다.

한 노드를 스케줄 불가(unschedulable) 상태로 바꾸는 명령어다.
기존 파드는 그대로 두지만, 새 파드는 해당 노드에 배치되지 않게 된다.
kubectl cordon multi-node-worker2


그러면 SchedulingDisabled 표시가 뜨면서 multi-node-worker2가 cordon 상태가 된다.
cordon시킨 multi-node-worker2노드에서 이제 해당 노드에서 파드를 안전하게 퇴출시킨다.
그러면 다른 노드로 파드가 자동 재배치된다.
kubectl drain multi-node-worker2 --ignore-daemonsets --delete-emptydir-data

-ignore-daemonsets : 시스템 파드(예: kube-proxy)는 무시
-delete-emptydir-data : emptyDir 볼륨 가진 파드 강제 삭제

그러면 cordon 시킨 노드에는 배치되지 않는 것을 확인할 수 있다.
다시 cordon시킨 노드를 uncordon 시켜본다.
kubectl uncordon multi-node-worker2
다음 명령어를 통해 원래 상태로 되돌릴 수 있다.

그럼 이렇게 STATUS에서 SchedulingDisabled가 사라진 것을 확인할 수 있다.
아까 단일 노드였던 것을 kind를 통해 워커노드 3개를 추가했는데 그것을 삭제해보겠다.
kind delete cluster --name multi-node
이 명령어를 사용하면 멀티노드가 삭제된다 .
그런 다음 현재 연결된 컨텍스트를 확인한 후, 기존에 쓰던 것으로 연결한다.
kubectl config get-contexts
kubectl config use-context rancher-desktop
참고자료
[쿠버네티스 공식 홈페이지 - kubectl cordon]
https://kubernetes.io/docs/reference/kubectl/generated/kubectl_cordon/
[쿠버네티스 공식 홈페이지 - Safely Drain a Node]
https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/