DevOps/K8S

[K8S] 테인트와 톨러레이션

kyoulho 2024. 10. 14. 21:57

테인트(Taints)

테인트는 특정 노드에 파드가 스케줄링되지 않도록 노드 자체에 부여하는 속성입니다. 테인트는 일반적인 파드가 해당 노드에 스케줄링되는 것을 방지합니다. 테인트는 다음과 같은 세 가지 속성으로 구성됩니다:

  • Key: 테인트의 키를 지정합니다.
  • Value: 테인트의 값을 지정합니다.
  • Effect: 테인트가 파드 스케줄링에 미치는 영향을 정의합니다.

Effect는 다음 중 하나일 수 있습니다:

  • NoSchedule: 톨러레이션이 없는 파드는 해당 노드에 스케줄링되지 않습니다.
  • PreferNoSchedule: 가능하면 해당 노드에 스케줄링하지 않지만, 불가피할 경우 스케줄링됩니다.
  • NoExecute: 해당 노드에 이미 스케줄 된 파드는 즉시 퇴거되며, 톨러레이션이 없는 새로운 파드는 스케줄 되지 않습니다.

톨러레이션(Tolerations)

톨러레이션은 파드가 특정 테인트를 “허용”하도록 정의하는 속성입니다. 톨러레이션을 설정하면 파드는 해당 노드에 스케줄링될 수 있습니다. 톨러레이션 역시 다음과 같은 속성으로 구성됩니다:

  • Key: 허용할 테인트의 키를 지정합니다.
  • Operator: Exists 또는 Equal을 사용할 수 있습니다.
    • Exists: 특정 키를 가진 모든 Taints를 허용합니다. 설정이 간단하고 유연성이 높지만, 세밀한 제어가 어렵습니다.
    • Equal: 특정 키, 값, 효과를 모두 일치시켜 Taints를 허용합니다. 설정이 복잡하지만, 보안 및 제어 측면에서 우수합니다.
  • Value: 허용할 테인트의 값을 지정합니다.
  • Effect: 허용할 테인트의 효과를 지정합니다.
  • TolerationSeconds: NoExecute 효과에 대해 파드가 노드에 머무를 수 있는 시간을 초 단위로 지정합니다.


테인트와 톨러레이션의 작동 원리

테인트와 톨러레이션은 Kubernetes의 스케줄링 정책의 일부로 작동하여 파드가 특정 노드에 스케줄링되거나 제외되는 방식에 영향을 줍니다. 기본적으로 테인트는 노드에 “제약”을 추가하고, 톨러레이션은 파드가 이 제약을 “허용”할 수 있도록 합니다.

작동 과정

  1. 테인트 추가: 관리자는 특정 노드에 테인트를 추가하여 해당 노드에 일반적인 파드가 스케줄링되지 않도록 합니다.
  2. 톨러레이션 설정: 파드에 톨러레이션을 설정하여 특정 테인트를 허용하거나 무시하도록 합니다.
  3. 스케줄링 결정: 스케줄러는 각 파드의 톨러레이션을 확인하고, 해당 파드가 테인트가 있는 노드에 스케줄링될 수 있는지 판단합니다.

이를 통해 관리자는 클러스터 내에서 자원의 할당을 더욱 세밀하게 제어할 수 있습니다.


테인트와 톨러레이션 설정하기

테인트와 톨러레이션을 설정하는 방법을 단계별로 살펴보겠습니다.

노드에 테인트 추가하기

노드에 테인트를 추가하려면 kubectl taint 명령어를 사용합니다. 예를 들어, node1이라는 노드에 key=value:NoSchedule 테인트를 추가하려면 다음과 같이 실행합니다:

kubectl taint nodes node1 dedicated=frontend:NoSchedule

이 명령어는 node1 노드에 dedicated=frontend:NoSchedule 테인트를 추가하여, 기본적으로 이 노드에 파드가 스케줄링되지 않도록 설정합니다.

파드에 톨러레이션 추가하기

파드에 톨러레이션을 추가하려면 파드의 YAML 파일에 tolerations 필드를 추가합니다. 다음은 톨러레이션을 설정하는 예제입니다.

apiVersion: v1
kind: Pod
metadata:
  name: frontend-pod
spec:
  containers:
  - name: frontend
    image: nginx
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "frontend"
    effect: "NoSchedule"

이 예제에서는 dedicated=frontend:NoSchedule 테인트를 허용하는 톨러레이션을 추가하여, 해당 파드가 dedicated=frontend 테인트가 있는 노드에 스케줄링될 수 있도록 합니다.


실제 사용 사례

테인트와 톨러레이션은 다양한 시나리오에서 유용하게 사용될 수 있습니다. 몇 가지 대표적인 사용 사례를 소개합니다.

전용 노드 구성

특정 애플리케이션 또는 서비스가 전용으로 사용할 노드를 설정하고자 할 때 테인트와 톨러레이션을 사용할 수 있습니다.

  • 테인트 추가:
kubectl taint nodes node1 dedicated=database:NoSchedule
  • 파드 설정:
tolerations:
- key: "dedicated"
  operator: "Equal"
  value: "database"
  effect: "NoSchedule"

이를 통해 dedicated=database 테인트가 있는 노드에는 데이터베이스 관련 파드만 스케줄링되도록 제한할 수 있습니다.

특정 하드웨어 요구 사항

GPU, 고속 스토리지 등 특정 하드웨어 리소스가 필요한 파드를 특정 노드에 스케줄링할 때 유용합니다.

  • 테인트 추가:
kubectl taint nodes gpu-node gpu=true:NoSchedule
  • 파드 설정:
tolerations:
- key: "gpu"
  operator: "Equal"
  value: "true"
  effect: "NoSchedule"

이 설정을 통해 GPU가 장착된 노드에만 GPU를 필요로 하는 파드가 스케줄링되도록 할 수 있습니다.

유지보수 모드 설정

노드를 유지보수 모드로 설정하여 새로운 파드가 스케줄링되지 않도록 하고, 기존 파드를 안전하게 이동할 수 있습니다.

  • 테인트 추가:
kubectl taint nodes node1 maintenance=true:NoSchedule
  • 기존 파드 퇴거:
kubectl drain node1 --ignore-daemonsets --delete-local-data

이렇게 하면 node1 노드에 새 파드가 스케줄링되지 않고, 기존 파드가 다른 노드로 이동됩니다.

728x90

'DevOps > K8S' 카테고리의 다른 글

[K8S] 클러스터 버전 업그레이드  (0) 2024.10.16
[K8S] StatefulSet  (1) 2024.10.10
[K8S] Metric Server  (0) 2024.10.10
[K8S] MetalLB  (1) 2024.10.10
[K8S] 인그레스와 관련 리소스  (1) 2024.10.08