노드 어피니티(Node affinity)는 특정 노드에 대한 파드를 유인하는 속성으로, 이는 선택적(preference)일 수도 있고 필수적(hard requirement)일 수도 있습니다. 반면, 테인트(Taint)는 그 반대로, 특정 파드가 특정 노드에서 실행되지 않도록 하는 기능입니다.
톨러레이션(Toleration)은 파드에 적용됩니다. 톨러레이션은 테인트가 있는 노드에 파드를 스케줄링할 수 있도록 허용하지만, 반드시 스케줄링이 보장되는 것은 아닙니다. 쿠버네티스 스케줄러는 다른 조건들도 함께 고려합니다.
테인트와 톨러레이션은 협력하여 부적절한 노드에 파드가 스케줄링되지 않도록 합니다. 하나 이상의 테인트가 노드에 적용되면, 해당 테인트를 허용하지 않는 파드는 해당 노드에 스케줄링되지 않습니다.
개념
노드에 테인트를 추가하려면 kubectl taint 명령어를 사용합니다. 예를 들어:
kubectltaintnodesnode1key1=value1:NoSchedule
위 명령어는 node1에 key1=value1의 테인트를 추가하며, NoSchedule 효과를 적용합니다. 이는 해당 테인트를 허용하는 톨러레이션이 없는 한, 파드가 node1에 스케줄링되지 않도록 합니다.
이 테인트를 제거하려면 다음 명령어를 실행합니다:
kubectltaintnodesnode1key1=value1:NoSchedule-
톨러레이션(Toleration)
파드의 PodSpec에서 톨러레이션을 지정할 수 있습니다. 아래 두 가지 톨러레이션 예시는 위에서 설정한 테인트와 매칭되며, 따라서 해당 톨러레이션을 가진 파드는 node1에 스케줄링될 수 있습니다.
kubectl -n taint-toleration get pods -o wide
kubectl get nodes -o jsonpath="{range .items[*]}{.metadata.name}{': '}{.spec.taints}{'\n'}{end}"
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-no-toleration 1/1 Running 0 35s 10.11.93.240 ip-10-11-81-255.ap-northeast-2.compute.internal <none> <none>