Kubernetes/Kubernetes Advanced

📌 [DaemonSet 심화편 #7] DaemonSet과 Tolerations: Taint가 적용된 노드에 Pod 배포하기

ygtoken 2025. 3. 22. 19:33
728x90

1️⃣ 개요

Kubernetes에서는 특정 노드에 Taint(얼룩)를 적용하여 일반적인 Pod가 스케줄되지 않도록 차단할 수 있습니다.
DaemonSet은 모든 노드에 배포되는 특성상, Taint가 설정된 노드에도 Pod를 배포해야 할 필요가 있습니다.

이 글에서는 Tolerations을 설정하여 DaemonSet이 Taint된 노드에서도 정상적으로 배포되도록 구성하는 방법을 정리합니다.


2️⃣ Taint와 Toleration의 관계

 

항목  설명
Taint 노드에 적용되는 제한 규칙. 기본적으로 해당 조건을 허용하지 않은 Pod의 스케줄링을 차단함
Toleration Taint를 허용하겠다는 Pod의 설정. Taint 조건과 일치하는 경우 스케줄링 가능

 

📌 요약하면:

  • Taint: “나는 이 노드에 아무나 못 오게 하겠다”
  • Toleration: “나는 그 조건을 감수하겠다. 나를 넣어줘”

3️⃣ 예제: 특정 노드에 Taint 적용

kubectl taint nodes node-1 dedicated=monitoring:NoSchedule

 

📌 설명

  • node-1 노드에 dedicated=monitoring이라는 Taint를 추가합니다.
  • NoSchedule은 해당 조건을 허용하지 않은 Pod는 절대 이 노드에 스케줄되지 않도록 차단합니다.

4️⃣ Taint가 있는 노드에 DaemonSet을 배포하기 위한 Toleration 설정

spec:
  template:
    spec:
      tolerations:
        - key: "dedicated"
          operator: "Equal"
          value: "monitoring"
          effect: "NoSchedule"

 

📌 설명

  • key, value, effect 값이 Taint와 정확히 일치해야 해당 노드에 Pod를 배포할 수 있습니다.
  • 이 설정이 없으면 DaemonSet Pod도 이 노드에 생성되지 않습니다.

5️⃣ 전체 DaemonSet 예제 (Toleration 포함)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: monitoring-agent
spec:
  selector:
    matchLabels:
      app: monitoring-agent
  template:
    metadata:
      labels:
        app: monitoring-agent
    spec:
      containers:
        - name: monitoring-agent
          image: busybox
          command: ["sh", "-c", "echo Monitoring Agent Running; sleep 3600"]
      tolerations:
        - key: "dedicated"
          operator: "Equal"
          value: "monitoring"
          effect: "NoSchedule"   # Taint 조건과 정확히 일치해야 허용됨

 

📌 설명 요약

  • 이 DaemonSet은 dedicated=monitoring:NoSchedule Taint가 설정된 노드에서도 정상적으로 배포됩니다.
  • tolerations 항목이 없으면 해당 노드에 Pod가 배포되지 않으며, 해당 노드는 DaemonSet 대상에서 제외됩니다.

6️⃣ 다양한 Taint 효과(Effect)와 그에 따른 Toleration 구성

Effect 의미 Toleration 예시 설정
NoSchedule 조건이 맞지 않으면 절대 스케줄 안됨 effect: NoSchedule
PreferNoSchedule 되도록이면 피함 (강제는 아님) effect: PreferNoSchedule
NoExecute 조건이 맞지 않으면 즉시 종료됨 effect: NoExecute + tolerationSeconds 필요

✅ NoExecute 예시

tolerations:
  - key: "maintenance"
    operator: "Equal"
    value: "true"
    effect: "NoExecute"
    tolerationSeconds: 3600  # 1시간 동안 유지

 

📌 설명

  • 해당 Taint가 적용되더라도 최대 3600초 동안은 Pod를 유지합니다.
  • 이 시간을 초과하면 Pod는 종료됩니다.

7️⃣ Taint와 Toleration 확인 방법

✅ 현재 노드의 Taint 확인

kubectl get node node-1 -o json | jq '.spec.taints'

 

또는 간단히:

kubectl describe node node-1

 

📌 설명

  • 출력된 Taint 값과 DaemonSet의 tolerations 설정이 정확히 일치하는지 확인합니다.

🔥 8️⃣ 결론

Taint가 설정된 노드에는 기본적으로 DaemonSet도 Pod를 배포하지 않습니다.
Tolerations를 설정하면 Taint 조건을 감수하고 해당 노드에 배포할 수 있습니다.
운영 중인 노드 중 일부에만 DaemonSet을 적용하고자 할 때 매우 유용한 방식입니다.
NoSchedule, PreferNoSchedule, NoExecute 각각의 효과에 따라 Toleration 전략을 다르게 설계할 수 있습니다.

728x90