[MacOS 환경 #17] 쿠버네티스 Cordon, Drain

도람·2025년 11월 19일
post-thumbnail

이번 벨로그 글은 “Node cordon & drain 실습”을 주제로,
노드 하나를 스케줄 불가로 만들고(cordon),
파드를 안전하게 내보내는(drain) 실습 중심으로 구성된다.

실습 개요

  • Deployment로 replica=3짜리 NGINX 파드를 배포함
  • 클러스터에는 노드가 3개 있다고 가정
  • 이 중 한 노드를 cordon → drain 명령어로 유지보수 모드로 전환

# 0-1. 노드 3개 생성 지금 실습환경에서는 노드가 1개밖에 출력되지 않아서 노드 3개를 먼저 구성해줬다. ```bash brew install kind kind version ```

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개가 생긴것을 확인할 수 있다.


1. Depolyment 생성

파일명: 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개를 볼 수 있으며 각 노드에 할당된 것을 확인할 수 있다.


2. Node Cordon (스케줄 중단)

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

kubectl cordon multi-node-worker2


그러면 SchedulingDisabled 표시가 뜨면서 multi-node-worker2가 cordon 상태가 된다.


3. Node drain(노드 퇴출)

cordon시킨 multi-node-worker2노드에서 이제 해당 노드에서 파드를 안전하게 퇴출시킨다.
그러면 다른 노드로 파드가 자동 재배치된다.

kubectl drain multi-node-worker2 --ignore-daemonsets --delete-emptydir-data

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


그러면 cordon 시킨 노드에는 배치되지 않는 것을 확인할 수 있다.


4. 노드 복귀 (uncordon)

다시 cordon시킨 노드를 uncordon 시켜본다.

kubectl uncordon multi-node-worker2

다음 명령어를 통해 원래 상태로 되돌릴 수 있다.


그럼 이렇게 STATUS에서 SchedulingDisabled가 사라진 것을 확인할 수 있다.


0-2. 노드 클러스터 삭제하기

아까 단일 노드였던 것을 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/

profile
정도를 걷는 엔지니어

0개의 댓글