본문 바로가기

[Kubernetes] taint, toleration (테인트 톨러레이션)

인포꿀팁 발행일 : 2022-02-14

테인트와 톨러레이션

*노드 어피니티*는 노드 셋을 (기본 설정 또는 어려운 요구 사항으로) 끌어들이는 파드의 속성이다. 테인트 는 그 반대로, 노드가 파드 셋을 제외할 수 있다.

톨러레이션 은 파드에 적용되며, 파드를 일치하는 테인트가 있는 노드에 스케줄되게 하지만 필수는 아니다.

테인트와 톨러레이션은 함께 작동하여 파드가 부적절한 노드에 스케줄되지 않게 한다. 하나 이상의 테인트가 노드에 적용된다. 이것은 노드가 테인트를 용인하지 않는 파드를 수용해서는 안 되는 것을 나타낸다.

노드에 테인트를 설정하면 톨러레이션을 주지 않는 파드는 해당 노드에 스케쥴링이 불가하다.

핵심은

taint ⇒ nodes 에 설정하는 것

tolerations ⇒ pods 에 설정하는 것

kubectl taint nodes node-name key=value:taint-effect
taint-effect
1: NoSchedule
2: PreferNoSchedule
3: NoExecute
  • NoSchedule 이펙트가 있는 무시되지 않은 테인트가 하나 이상 있으면 쿠버네티스는 해당 노드에 파드를 스케줄하지 않는다.
  • NoSchedule 이펙트가 있는 무시되지 않은 테인트가 없지만 PreferNoSchedule 이펙트가 있는 무시되지 않은 테인트가 하나 이상 있으면 쿠버네티스는 파드를 노드에 스케쥴하지 않으려고 시도 한다
  • NoExecute 이펙트가 있는 무시되지 않은 테인트가 하나 이상 있으면 파드가 노드에서 축출되고(노드에서 이미 실행 중인 경우), 노드에서 스케줄되지 않는다(아직 실행되지 않은 경우).

노드 컨트롤러는 특정 조건이 참일 때 자동으로 노드를 테인트시킨다. 다음은 빌트인 테인트이다.

  • node.kubernetes.io/not-ready: 노드가 준비되지 않았다. 이는 NodeCondition Ready 가 "False"로 됨에 해당한다.
  • node.kubernetes.io/unreachable: 노드가 노드 컨트롤러에서 도달할 수 없다. 이는 NodeCondition Ready 가 "Unknown"로 됨에 해당한다.
  • node.kubernetes.io/memory-pressure: 노드에 메모리 할당 압박이 있다.
  • node.kubernetes.io/disk-pressure: 노드에 디스크 할당 압박이 있다.
  • node.kubernetes.io/pid-pressure: 노드에 PID 할당 압박이 있다.
  • node.kubernetes.io/network-unavailable: 노드의 네트워크를 사용할 수 없다.
  • node.kubernetes.io/unschedulable: 노드를 스케줄할 수 없다.
  • node.cloudprovider.kubernetes.io/uninitialized: "외부" 클라우드 공급자로 kubelet을 시작하면, 이 테인트가 노드에서 사용 불가능으로 표시되도록 설정된다. 클라우드-컨트롤러-관리자의 컨트롤러가 이 노드를 초기화하면, kubelet이 이 테인트를 제거한다.

노드가 축출될 경우, 노드 컨트롤러 또는 kubelet은 NoExecute 이펙트로 관련 테인트를 추가한다. 장애 상태가 정상으로 돌아오면 kubelet 또는 노드 컨트롤러가 관련 테인트를 제거할 수 있다.


operators

-equal : key value effect 가 모두 같은 경우만

-exists : key effect가 같은 경우만 ( value는 비어야함)

노드에 테인트 확인

k describe node controlplane | grep Taint

노드에 테인트 생성

k taint nodes node01 spray=mortein:NoSchedule

노드 pending 시 오류 확인

#명령어 팁

kubectl explain pod --recursive | less
kubectl explain pod --recursive | grep -A5 tolerations ( 해당부분 아래5줄까지 출력

파드에 tolerations 설정

kubectl run bee --image=nginx --dry-run -o yaml > bee.yaml
vi bee.yaml
spec
  tolerations:
  - effect: NoSchedule
    key: spray
    operator: Equal
    value: mortein

 

댓글