쿠버네티스에서는 일부 노드를 특정 애플리케이션에만 할당하거나, 특정 워크로드가 특정 노드에서만 실행되도록 제한할 필요가 있습니다.
이를 위해 Taint 및 Toleration을 활용하여 특정 노드에서만 Pod이 실행되도록 설정하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1. Taint를 설정하여 특정 노드에서만 특정 Pod이 실행되도록 제한하는 방법
2. Toleration을 추가하여 특정 Pod이 Taint가 적용된 노드에서 실행되도록 허용하는 방법
3. kubectl을 활용한 Taint 및 Toleration 설정 검증 및 적용 상태 확인
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ Taint를 설정하여 특정 노드에서만 특정 Pod이 실행되도록 제한하는 방법
❓ 문제 상황
운영팀에서 일반적인 애플리케이션이 특정 노드에서 실행되지 않도록 제한하고, 오직 특정 워크로드만 해당 노드에서 실행되도록 설정해야 합니다.
이를 위해 Taint를 설정하여 기본적으로 해당 노드에서 실행할 수 없는 상태로 만들고, 특정 애플리케이션만 허용해야 합니다.
• 대상 노드: node-special
• Taint 키: special-node
• Taint 값: true
• Taint 효과: NoSchedule (해당 노드에 Toleration이 없는 Pod은 스케줄링되지 않음)
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. kubectl taint 명령어를 사용하여 특정 노드에 Taint를 추가합니다.
2. kubectl get nodes 명령어를 사용하여 Taint가 정상적으로 적용되었는지 확인합니다.
✅ Taint 설정을 위한 명령어 실행
🔹 특정 노드에 Taint 추가
kubectl taint nodes node-special special-node=true:NoSchedule
💡 예상 출력 값
node/node-special tainted
🔹 노드의 Taint 확인
kubectl describe node node-special | grep Taints
💡 예상 출력 값
Taints: special-node=true:NoSchedule
✅ 이제 node-special 노드에는 Toleration이 없는 Pod이 스케줄링되지 않음
2️⃣ Toleration을 추가하여 특정 Pod이 Taint가 적용된 노드에서 실행되도록 허용하는 방법
❓ 문제 상황
운영팀에서 특정 Pod을 node-special 노드에서 실행해야 하지만, 해당 노드는 NoSchedule Taint가 설정되어 있어 기본적으로 배포되지 않습니다.
이를 해결하기 위해 Pod에 Toleration을 추가하여 Tainted 노드에서도 실행되도록 설정해야 합니다.
• Pod 이름: special-app
• Toleration 키: special-node
• Toleration 값: true
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Toleration을 Pod의 spec에 추가하여 Tainted 노드에서도 실행되도록 설정합니다.
2. kubectl describe pod 명령어를 사용하여 Pod이 정상적으로 실행되었는지 확인합니다.
✅ 정답 Manifest (Toleration 설정)
apiVersion: v1
kind: Pod
metadata:
name: special-app
spec:
tolerations:
- key: "special-node"
operator: "Equal"
value: "true"
effect: "NoSchedule"
containers:
- name: special-container
image: nginx
📌 적용 후 예상 결과 값
1. Pod 배포 후 스케줄링 상태 확인
kubectl get pods -o wide
💡 예상 출력 값
NAME READY STATUS NODE AGE
special-app 1/1 Running node-special 10s
✅ Toleration이 적용된 Pod이 Tainted 노드에서 정상적으로 실행됨
3️⃣ kubectl을 활용한 Taint 및 Toleration 설정 검증 및 적용 상태 확인
❓ 문제 상황
운영팀에서 현재 클러스터에서 어떤 노드에 Taint가 적용되었는지, 특정 Pod이 적절히 배포되었는지 확인해야 합니다.
kubectl 명령어를 활용하여 Taint 및 Toleration 설정 상태를 점검해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. kubectl describe nodes 명령어를 사용하여 Taint가 올바르게 설정되었는지 확인합니다.
2. kubectl get pods 명령어를 활용하여 특정 Pod이 올바른 노드에서 실행되고 있는지 확인합니다.
✅ Taint 및 Toleration 설정 검증 명령어
🔹 클러스터 내 모든 노드의 Taint 상태 확인
kubectl get nodes -o json | jq '.items[].spec.taints'
💡 예상 출력 값 (Taint가 설정된 노드)
[
{
"effect": "NoSchedule",
"key": "special-node",
"value": "true"
}
]
🔹 특정 Pod이 Tainted 노드에서 실행되고 있는지 확인
kubectl get pod special-app -o wide
💡 예상 출력 값
NAME READY STATUS NODE AGE
special-app 1/1 Running node-special 20s
✅ Taint 및 Toleration이 올바르게 적용되었으며, 특정 Pod이 지정된 노드에서 실행됨