DevOps/Kubernetes

Kubernetes Master(Node)에서 Pod 스케줄링 방지하기

DEBTOLEE 2025. 4. 9. 11:54

Kubernetes에서 Master Node(Control Plane)는 클러스터의 중심 역할을 수행합니다. 통상적으로 이 노드에는 일반 워크로드(Pod)를 배치하지 않지만, 특별한 설정이 없다면 스케줄될 수 있습니다. 이 포스트에서는 Master Node에서 일반 Pod가 실행되지 않도록 설정하는 방법을 안내합니다.


🧱 핵심 개념: Taint

Kubernetes는 특정 노드에 "Taint"(오염값)를 부여해, 조건을 만족하지 않는 Pod가 해당 노드에 스케줄되지 않도록 합니다.

Master Node는 아래와 같은 Taint가 기본적으로 설정되어 있습니다:

kubectl describe node <마스터노드이름>

예시:

Taints: node-role.kubernetes.io/control-plane:NoSchedule

이 설정이 적용되어 있으면, toleration이 없는 일반 Pod는 해당 노드에 올라갈 수 없습니다.


🛠 Taint가 없다면 수동 추가

만약 위 Taint가 빠져 있다면, 아래 명령어로 수동으로 추가할 수 있습니다:

kubectl taint nodes <마스터노드이름> node-role.kubernetes.io/control-plane=:NoSchedule

이전 버전에서는 아래 명령어도 사용됩니다:

kubectl taint nodes <마스터노드이름> node-role.kubernetes.io/master=:NoSchedule

📌 NoSchedule은 해당 조건을 만족하지 않는 Pod는 절대 이 노드에 배치되지 않도록 제한합니다.


⚙️ kubelet 설정 시 Taint 자동 등록

kubeadm 등을 통해 클러스터를 구성하거나, kubelet을 개별 설정할 때 다음 파라미터를 사용하면 taint를 자동 부여할 수 있습니다:

--register-with-taints=node-role.kubernetes.io/control-plane=:NoSchedule

이 설정은 Master 노드 등록 시 자동으로 taint가 설정되도록 도와줍니다.


🔍 현재 Taint 확인하기

현재 노드들의 Taint 상태를 확인하려면:

kubectl get nodes -o json | jq '.items[].spec.taints'

또는 간단히 전체 노드에서 Taint만 확인할 수도 있습니다:

kubectl describe nodes | grep Taints

✅ 정리

이제 Master Node에는 일반 Pod가 배치되지 않도록 안전하게 차단되었습니다. 추가적으로 필요에 따라 Toleration이나 Node Affinity를 활용해 조건부 허용도 가능합니다.

☁️ 클러스터 안정성과 보안을 위해, Control Plane 노드는 전용 관리용도로만 사용하는 것이 바람직합니다.