테인트, 톨러레이션
개요
스케줄링 중 필터링 단계 해당하는 설정 기법 중 하나이다.
테인트는 노드에 남기는 얼룩(taint)을 말한다.
테인트가 걸리면 아무런 파드가 노드에 배치될 수 없도록 필터링이 걸린다.
파드가 해당 노드에 배치되고 싶다면 해당 얼룩을 용인(toleration)할 수 있도록 명시적으로 설정을 해줘야만 한다.
보통 마스터 노드에는 일반 파드가 배치되지 않는데, 그 이유가 바로 마스터 노드 관련 테인트가 걸려 있기 때문이다.
또한 노드를 드레인할 때 역시, 노드에 얼룩을 남김으로써 파드들이 더 이상 스케줄링되지 못하도록 막게 된다.
미리 말하지만, 테인트는 스케줄링에서만 활용되는 게 아니라 이미 존재하는 파드를 축출시키는 것도 가능하다.
테인트 효과
노드에 거는 테인트는 크게 세 가지 효과를 설정할 수 있다.
- PreferNoSchedule
- 새로운 파드가 가급적 이 노드에 스케줄링을 하지 못하도록 막는다.
- 즉 스코어링에서 매우 낮은 점수를 받게 만든다.
- NoSchedule
- 새로운 파드가 절대 이 노드에 스케줄링을 하지 못하도록 막는다.
- 이건 필터링 단계로 완벽하게 제어된다.
- NoExecute
- 스케줄링도 막는데, 이미 노드에 배치돼있는 파드들까지 꺼내버린다!
- 이 효과를 용인하지 않는 파드들은 그 즉시 종료되고 다른 노드에 배치될 것이다.
보다시피 이 효과들은 단계적으로 강화된다.
사용법
kubectl taint nodes node1 key1=value1:NoSchedule
사용법은 굉장히 간단하다.
그냥 어떤 노드에 테인트라고 해서 키=값:효과
를 적어주면 된다.
같은 키값에 다른 효과를 넣는 것도 가능은 한데, 어차피 NoExecute는 NoSchedule까지 포함하니 굳이 그렇게 사용은 안 한다.
kubectl taint nodes node1 key1=value1:NoSchedule-
없앨 때는 마이너스를 끝에 붙인다.
그렇다면 파드에서 이 얼룩을 용인하려면 어떻게 해야 하는가?
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
---
tolerations:
- key: "key1"
operator: "Exists"
effect: "NoSchedule"
이것도 간단하게, 그저 파드 스펙에 tolerations
를 작성하고 어떤 키에 대해 어떤 효과를 용인할지 지정하면 된다.
effect에 단순히 ""를 넣으면 모든 효과들이 용인된다.
tolerations:
- key: "key1"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 3600
NoExecute를 용인한 파드는 해당 노드에서 종료되지 않는다.
다만 tolerationSeconds
를 지정하면 이 언제까지 용인을 할지 지정할 수 있고, 이 시간을 넘겨서도 노드에 테인트가 있다면 해당 파드도 얄짤 없이 날아간다.
노익시 허용 파드가 노스케 노드에 배치되나?
기본 테인트
쿠버네티스에는 기본적으로 설정되는 테인트가 여러 종류 있다.
이것들은 노드 컨트롤러가 노드의 상태를 보고 건다.
다음은 특정 상황에 세팅되는 테인트이다.
node.kubernetes.io/not-ready
- 노드가 Ready가 아닐 때 걸리는데, 보통 CNI가 없을 때 걸려있다.node.kubernetes.io/unreachable
- 노드 Ready가 Unknown일 때, 보통 kubelet과 통신이 안 될 때node.kubernetes.io/network-unavailable
- 노드 네트워크가 끊긴 게 확실시되는 상황에 걸린다.node.kubernetes.io/unschedulable
- 노드가 보통 자원 부족일 때 잠시 스케줄할 수 없다며 걸린다.node.kubernetes.io/memory-pressure
node.kubernetes.io/disk-pressure
node.kubernetes.io/pid-pressure
tolerations:
- key: "node.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 6000
실제 파드들을 뜯어보면 보통 이런 값이 있는 것을 볼 수 있다.
이건 승인 제어 단계에서 알아서 주입된 값으로, 노드와의 통신에 잠시 문제가 생겨도 바로 퇴출당하지 않도록 막는다.
노드가 드레인된다고 하면 not-ready, unreachable 두 테인트가 걸린다.
데몬셋의 경우 해당 테인트에 대해 시간 제한 없이 용인하도록 세팅이 돼있어 항상 유지된다.
이건 데몬셋이 보통 노드를 관리하는 어플리케이션을 배치하는데 사용되기 때문이다.
관련 문서
이름 | noteType | created |
---|---|---|
테인트, 톨러레이션 | knowledge | 2025-03-19 |