Kubernetes/Kubernetes Advanced

📌 [DaemonSet 심화편 #11] DaemonSet Pod의 고가용성을 위한 Anti-Affinity 구성 전략

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

1️⃣ 개요

DaemonSet은 클러스터의 모든 노드에 Pod를 하나씩 배포하는 구조입니다.
그러나 클러스터 내에 스케줄링이 중복되거나, 특수한 노드 그룹 간 충돌을 방지하고 싶을 때,
Pod 간 격리 또는 분산 전략을 설정하는 것이 필요합니다.

이를 위한 대표적인 방법이 Pod Anti-Affinity 설정입니다.
이번 글에서는 DaemonSet Pod가 특정 노드에 몰리지 않도록 설정하거나, 다른 워크로드와 격리하는 전략을 소개합니다.


2️⃣ Affinity와 Anti-Affinity 기본 정리

유형 설명 대표 키
Node Affinity 특정 노드에 배포를 유도하거나 제한 nodeAffinity
Pod Affinity 특정 Pod와 같은 노드에 배포되도록 설정 podAffinity
Pod Anti-Affinity 특정 Pod와 다른 노드에 배포되도록 설정 podAntiAffinity

✅ **DaemonSet에서 자주 활용되는 방식은 podAntiAffinity**로, 다른 워크로드 또는 같은 종류의 Pod 간 충돌을 피할 수 있습니다.


3️⃣ 예제: 동일한 App 라벨을 가진 Pod가 같은 노드에 배포되지 않도록 설정

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: log-agent              # 동일한 app 라벨을 가진 Pod
        topologyKey: "kubernetes.io/hostname"

 

📌 설명

  • requiredDuringSchedulingIgnoredDuringExecution: 스케줄링 시 반드시 조건을 만족해야 배포됨
  • matchLabels: 분산시키려는 대상 Pod의 라벨
  • topologyKey: 분산 단위 기준으로 사용되는 노드 식별 키 (노드 이름)

✅ 이 설정을 통해 같은 노드에 중복 배포되는 것을 방지하고, 서로 다른 노드에 분산 배포되도록 강제할 수 있습니다.


4️⃣ 전체 DaemonSet 구성 예제

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-agent
spec:
  selector:
    matchLabels:
      app: log-agent
  template:
    metadata:
      labels:
        app: log-agent
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                  app: log-agent       # 같은 앱끼리 분산 배치
              topologyKey: "kubernetes.io/hostname"
      containers:
        - name: log-agent
          image: busybox
          command: ["sh", "-c", "echo Log agent running; sleep 3600"]

 

📌 설명 요약

  • 이 DaemonSet은 log-agent 앱을 모든 노드에 배포하되,
  • 동일 노드에 같은 라벨을 가진 Pod이 여러 개 생성되지 않도록 제어합니다.
  • DaemonSet이 아닌 일반 Pod과의 충돌 방지용으로도 활용 가능합니다.

5️⃣ Node 수보다 Pod 수가 많을 경우 주의

podAntiAffinity는 강제(required) 조건이기 때문에,

  • Pod 수가 노드 수보다 많을 경우 배포되지 않는 Pod이 생길 수 있습니다.

이 경우 다음과 같은 메시지를 보게 됩니다:

0/3 nodes are available: 3 node(s) didn't match pod anti-affinity rules.

✅ 이럴 땐 preferredDuringSchedulingIgnoredDuringExecution으로 조건 완화를 고려할 수 있습니다.


✅ 조건 완화 예시

affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchLabels:
              app: log-agent
          topologyKey: "kubernetes.io/hostname"

📌 설명

  • 반드시 조건을 만족하지 않아도 스케줄링이 가능한 대신, 최대한 분산되도록 유도합니다.

6️⃣ 다양한 활용 사례

목적 예시  설정 방법
같은 앱이 같은 노드에 몰리는 것 방지 Pod Anti-Affinity (matchLabels: app)
다른 워크로드와 분리 matchLabels에 대상 앱 라벨 지정
GPU 노드와 일반 노드 분리 topologyKey에 zone 또는 node label 사용
노드 단위 분산 topologyKey: kubernetes.io/hostname 사용

🔥 7️⃣ 결론

Pod Anti-Affinity는 DaemonSet이 특정 노드에 몰리는 것을 방지하고 분산 배포를 유도할 수 있습니다.
노드 수보다 Pod 수가 많을 경우 required 조건은 충돌이 발생할 수 있으므로 주의가 필요합니다.
분산 배포가 중요하거나 노드 간 부하 분산이 필요한 경우 적극적으로 활용할 수 있습니다.

728x90