Cordon시킨 노드에 Pod 배치하기
February 2024 (229 Words, 2 Minutes)
TL;DR
노드에 Cordon을 하게되면, 노드에 Taints: node.kubernetes.io/unschedulable:NoSchedule 를 부여해 스케줄링이 일어나지 않도록 설정합니다.
저 Taint에 대해 Toleration을 똑같이 부여하면 Cordon 된 노드에 Pod를 배치 할 수 있습니다.
Cordon시킨 노드에 Pod 배치하기
이번에 설명드린 팁은 Cordon 된 노드도 일반적인 Taint 와 Toleration 개념의 연장선이기 때문에 Pod를 배치 할 수 있다는 겁니다.
Taint 가 걸려있는 노드는 Pod에 Toleration값을 부여해서 배치가 가능합니다.
Taint & Toleration
Taint (테인트): 노드에 테인트를 적용하면, 해당 노드는 테인트를 용인하지 않는 Pod를 수용하지 않게 됩니다. 즉, 특정 노드가 특정 Pod들 에게 덜 바람직하게 만드는 데 사용됩니다. 테인트는 kubectl taint 명령어를 사용하여 노드에 추가할 수 있습니다.
Toleration (톨러레이션): 톨러레이션은 Pod에 적용되며, 톨러레이션을 가진 Pod는 테인트가 있는 노드에 스케줄링될 수 있습니다. 즉, 특정 테인트를 용인할 수 있는 파드를 지정하는 데 사용됩니다. 톨러레이션은 Pod 스펙(PodSpec)에서 지정할 수 있습니다.
Taint Effect에는 세가지 종류가 있습니다.
NoSchedule
이펙트가 있는 무시되지 않은 테인트가 하나 이상 있으면 쿠버네티스는 해당 노드에 Pod를 스케줄하지 않는다.NoSchedule
이펙트가 있는 무시되지 않은 테인트가 없지만PreferNoSchedule
이펙트가 있는 무시되지 않은 테인트가 하나 이상 있으면 쿠버네티스는 Pod를 노드에 스케쥴하지 않으려고 시도 한다NoExecute
이펙트가 있는 무시되지 않은 테인트가 하나 이상 있으면 Pod가 노드에서 축출되고(노드에서 이미 실행 중인 경우), 노드에서 스케줄되지 않는다(아직 실행되지 않은 경우).
예를들어 노드에 Taint로 두개를 걸었으면
kubectl taint nodes node1 key1=value1:NoSchedule
kubectl taint nodes node1 key1=value1:NoExecute
에 대해서 Pod에는 해당 Toleration들이 있어야 합니다.
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
Cordon 시킨 노드의 Taint
쿠버네티스 노드의 Cordon도 같은 방식으로 이루어집니다.
배포할 deployment에 toleration으로 cordon 명령어를 수행 할 때 추가되는 taint값을 넣으면 강제로 배치할 수 있습니다
tolerations:
- effect: NoSchedule
key: node.kubernetes.io/unschedulable
예제 yaml파일 첨부합니다
apiVersion: apps/v1
kind: Deployment
metadata:
name: mont-test
namespace: test
spec:
template:
metadata:
name: mont-test
namespace: test
spec:
nodeSelector:
kubernetes.io/hostname: node3
tolerations:
- effect: NoSchedule
key: node.kubernetes.io/unschedulable
해당 방식대로 Toleration 값을 넣고, nodeSelector로 cordon된 노드의 nodename을 넣어주면 pod scheduling이 가능해집니다.