Kubernetes/Kubernetes Advanced

📌 [DaemonSet 심화편 #19] DaemonSet의 Scheduling 제한: 특정 Zone 또는 Region만 대상으로 설정하기

ygtoken 2025. 3. 22. 20:56
728x90

1️⃣ 개요

Kubernetes 클러스터는 클라우드 또는 온프레미스 환경에서 여러 Zone 또는 Region에 걸쳐 구성될 수 있습니다.
이때 DaemonSet을 클러스터 전체가 아닌 **특정 영역(Zone 또는 Region)**에만 배포하고 싶은 경우,
Node Affinity를 활용하여 스케줄링 대상을 제한할 수 있습니다.

이번 글에서는 DaemonSet Pod이 특정 Zone/Region에만 배포되도록 제어하는 방법과 설정 전략을 소개합니다.


2️⃣ Zone / Region 설정 키

Kubernetes에서는 클라우드 환경이나 클러스터 구성 도구를 통해 자동으로 아래 라벨이 노드에 추가됩니다.

라벨 키 설명
topology.kubernetes.io/zone 노드가 위치한 Zone 정보
topology.kubernetes.io/region 노드가 속한 Region 정보

✅ 이전에는 failure-domain.beta.kubernetes.io/zone 등이 사용되었으나, 현재는 위의 표준 키로 통일되어 사용됩니다.


3️⃣ 특정 Zone만 대상으로 하는 Node Affinity 설정

spec:
  template:
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: topology.kubernetes.io/zone
                    operator: In
                    values:
                      - zone-a
                      - zone-b

📌 설명

  • 이 설정을 통해 zone-a, zone-b에 해당하는 노드에만 DaemonSet Pod이 배포됩니다.
  • requiredDuringSchedulingIgnoredDuringExecution은 스케줄 시 반드시 조건을 만족해야 함을 의미합니다.

4️⃣ 특정 Region만 대상으로 하는 설정 예시

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        - matchExpressions:
            - key: topology.kubernetes.io/region
              operator: In
              values:
                - asia-northeast1

📌 설명

  • 지정한 Region(asia-northeast1)에 속한 노드에만 Pod을 배포합니다.

5️⃣ 전체 DaemonSet 구성 예제 (Zone 기반 제한)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: zone-agent
spec:
  selector:
    matchLabels:
      app: zone-agent
  template:
    metadata:
      labels:
        app: zone-agent
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: topology.kubernetes.io/zone
                    operator: In
                    values:
                      - zone-a
                      - zone-b
      containers:
        - name: zone-agent
          image: busybox
          command: ["sh", "-c", "echo Running in specific zone; sleep 3600"]

📌 설명 요약

  • 클러스터 내 여러 Zone 중 일부에만 DaemonSet Pod이 배포되도록 제어합니다.
  • 배포 대상 노드가 제한되기 때문에, 전체 노드에 반드시 배포해야 하는 목적이라면 사용에 주의가 필요합니다.

6️⃣ 배포 대상 확인 방법

kubectl get nodes --show-labels | grep topology.kubernetes.io/zone

📌 설명

  • 해당 키가 포함된 노드 라벨을 통해 DaemonSet이 어느 Zone에 배포될지 미리 확인할 수 있습니다.

7️⃣ 구성 시 주의할 점

항목 주의 사항
일부 Zone만 선택 시 해당 Zone 외 노드에는 DaemonSet이 배포되지 않음
필수 에이전트 배포 시 전체 노드에 필수인 경우 이 설정 사용 주의
Zone/Region 라벨 없을 시 사전 라벨 확인 필수 (kubectl get nodes --show-labels)
클라우드 환경 자동 설정 대부분의 클라우드에서는 해당 라벨이 기본 설정됨 (GKE, EKS, AKS 등)

🔥 8️⃣ 결론

DaemonSet은 기본적으로 모든 노드에 배포되지만, Node Affinity를 활용하면 특정 Zone 또는 Region에만 배포하도록 제어할 수 있습니다.
지리적 분산, 네트워크 분리, 장애 영역 분리 등을 고려하여 DaemonSet 배포 범위를 제한할 수 있습니다.
스케줄 조건이 너무 제한적이면 일부 노드에 DaemonSet이 배포되지 않을 수 있으므로 구성 시 노드 라벨을 반드시 확인해야 합니다.

 

728x90