위 yaml파일로 실행한 파드는 tolerationSeconds로 인해 10초 동안만 유지되다가 종료된다.
이와 같이 노드에 테인트를 설정하고 파드에 톨러레이션을 설정하여 스케줄되는 위치를 좀 더 엄격하게 지정할 수 있다.
테인트 기반 축출
노드 컨트롤러는 특정 컨디션이 참일 때 자동으로 노드를 테인트시킨다.
다음은 빌트인 테인트이다.
built-in taints
설명
node.kubernetes.io/not-ready
노드가 준비되지 않았다. 이는 NodeCondition Ready 가 "False"로 됨에 해당한다.
node.kubernetes.io/unreachable
노드가 노드 컨트롤러에서 도달할 수 없다. 이는 NodeCondition Ready 가 "Unknown"로 됨에 해당한다.
node.kubernetes.io/memory-pressure
노드의 가용 메모리가 부족하다. memory-pressure 이 False인 상태다.
node.kubernetes.io/disk-pressure
노드의 가용 디스크 공간이 부족하다. disk-pressure 이 False인 상태다.
node.kubernetes.io/pid-pressure
노드에서 사용 가능한 PID 리소스가 부족하다. pid-pressure이 False인 상태다.
node.kubernetes.io/network-unavailable
노드의 네트워크를 사용할 수 없다. network-unavailable 이 False인 상태다.
node.kubernetes.io/unschedulable
노드를 스케줄할 수 없다.
node.cloudprovider.kubernetes.io/uninitialized
"외부" 클라우드 공급자로 kubelet을 시작하면, 이 테인트가 노드에서 사용 불가능으로 표시되도록 설정된다. 클라우드-컨트롤러-관리자의 컨트롤러가 이 노드를 초기화하면, kubelet이 이 테인트를 제거한다.
노드가 축출될 경우, 노드 컨트롤러 또는 kubelet은 NoExecute 이펙트로 관련 테인트를 추가한다.
장애 상태가 정상으로 돌아오면 kubelet 또는 노드 컨트롤러가 관련 테인트를 제거할 수 있다.
노드의 상세 내역을 보면 위 표와 같은 컨디션 정보가 나온다.
kubectl describe node <노드 이름>
큰 문제가 없다면 모두 이와 같은 상태일 것이다.
참고1 : 쿠버네티스는 사용자나 컨트롤러에서 명시적으로 설정하지 않았다면, 자동으로 node.kubernetes.io/not-ready 와 node.kubernetes.io/unreachable 에 대해 tolerationSeconds=300 으로 톨러레이션을 추가한다. 자동으로 추가된 이 톨러레이션은 이러한 문제 중 하나가 감지된 후 5분 동안 파드가 노드에 바인딩된 상태를 유지함을 의미한다. 기본 설정
참고2 : 데몬셋의 경우는 노드마다 반드시 하나의 파드가 스케줄되어야 하기 때문에 기본 톨러레이션 설정이 조금 특이하다. 노드의 Ready 상태에 대한 컨디션에 대해서는 NoExecute로 파드의 스케줄과 축출되지 않는 내성을 가지고 있지만 그 이외의 컨디션 문제에서는 NoSchedule로 스케줄에 대한 내성을 가지고 있다. 데몬셋 기본 설정
위 컨디션 정보를 바탕으로 테인트 혹은 톨러레이션을 설정할 때 노드의 상태를 기반으로 파드를 스케줄하거나 축출하는 다양한 케이스를 구성할 수 있다.