본문 바로가기

About/Kubernetes

[k8s] 노드 스케쥴링 - Taints와 Toleratioin(테인트와 톨러레이션)

테인트(Taints)와 톨러레이션(Toleration)

쿠버네티스 클러스터의 특정 노드에 테인트(Taint)를 설정할 수 있습니다. Node Affinity는 Pod가 특정 노드를 선택하게 하는 Pod의 속성이었다면 테인트(Taint)는 반대로 노드가 파드 셋을 제외하도록하는 노드에 설정하는 속성입니다. 

기본적으로 테인트를 설정한 노드는 파드들을 스케줄링하지 않습니다. 테인트를 설정한 노드에 파드들을 스케줄링하려면 파드에 톨러레이션(Toleration)을 설정해야 합니다. 그럼 테인트는 톨러레이션에서 설정한 특정 파드들만 실행하고 다른 파드는 실행하지 못하게 합니다.

테인트와 톨러레이션은 주로 노드를 특정 역할만 하도록 만들 때 사용합니다. 예를 들어 데이터베이스용 파드를 실행한 후 노드 전체의 CPU나 RAM 자원을 독점해서 사용할 수 있도록 설정하는 것입니다. GPU가 있는 노드에는 실제로 GPU 자원을 사용하는 파드들만 실행되도록 설정할 수도 있습니다.

 

테인트(Taints)와 톨러레이션(Toleration) 설정

테인트(Taint)

 테인트(Taint) 키(key), 값(value), 효과(effects)의 세 가지로 구성됩니다. 노드에 테인트를 설정하는 명령어는 다음과 같습니다.

kubectl taint nodes <노드 이름> <key>=<value>:<effect>

# 테인트 적용 예시
$ kubectl taint nodes node1 key1=value1:NoSchedule 
-> key1=value가 일치하는 톨러레이션이 없으면 파드를 node1에 스키줄 할 수 없음

# 적용한 테인트 삭제 시 기존 명령어에 '-' 추가
$ kubectl taint nodes node1 key1=value1:NoSchedule-

테인트에 사용하는 key 필드 값의 첫 문자는 영문이나 숫자로 시작해야하며 영문, 숫자, 하이픈(-), 점(,), 밑줄(_) 등을 사용할 수 있습니다. 최대 253자 까지 작성할 수 있습니다. value 필드 값은 key 필드와 조건이 동일하나 최대 63자까지 작성할 수 있다는 차이가 있습니다.

effect 필드 값은 NoSchedule, PreferNoSchedule, NoExecute 로 설정합니다. 필드 값 각각의 효과는 다음과 같습니다.

effect 필드 값 설명
NoSchedule 톨러레이션 설정이 없으면 파드를 스케쥴링하지 않습니다. 기존에 실행되던 파드에는 적용되지 않습니다.
PreferNoSchedule 톨러레이션 설정이 없으면 파드를 스케쥴링하지 않습니다. 하지만 클러스터안 자원이 부족하면 테인트를 설정한 노드에서도 파드를 스케쥴링할 수 있습니다.
NoExecute 톨러레이션 설정이 없으면 새로운 파드를 스케줄링하지 않으며, 기존 파드도 톨러레이션 설정이 없으면 종료시킵니다.

톨러레이션(Toleration)

톨러레이션(Toleration) 은 PodSpec에서 지정할 수 있습니다. torelations 필드 하위의 key, value,effect 필드 값을 원하는 테인트의 설정값을 넣습니다. operator 필드 값은 EqualExists가 있습니다.

Equalkey value effect 필드 값이 테인트의 설정값과 모두 같은 지 확인합니다. Exists는 앞 세 가지 필드를 선별해서 사용할 때 설정합니다. ( operator 가 Exists 인 경우에는 value 필드를 사용할 수 없습니다.)

예를들어 다음 두 설정 모두 톨러레이션은 위에서 생성하는 테인트와 '일치'하므로 node1에 스케줄링 될 수 있게 됩니다.

tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"

 

tolerations:
- key: "key1"
  operator: "Exists"
  effect: "NoSchedule"

 

톨러레이션을 사용하는 파드의 예시는 다음과 같습니다.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  tolerations:
  - key: "example-key"
    operator: "Exists"
    effect: "NoSchedule"