Kubernetes/Kubernetes Advanced

📌 [DaemonSet 심화편 #14] DaemonSet과 NodeSelector vs Node Affinity 비교: 어떤 기준으로 사용할 것인가

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

1️⃣ 개요

DaemonSet은 기본적으로 모든 노드에 하나씩 Pod을 배포하지만,
운영 환경에 따라 특정 노드에만 배포하고 싶을 때가 있습니다.
예를 들어, GPU 노드, 특정 가용 영역(zone), 특정 라벨이 붙은 노드 등만 대상으로 DaemonSet을 배포하고 싶을 때
NodeSelector 또는 Node Affinity 설정을 활용할 수 있습니다.

이번 글에서는 두 설정 방식의 차이점, 장단점, 사용 기준을 비교하고
DaemonSet에 어떻게 적용할 수 있는지 설명합니다.


2️⃣ NodeSelector vs Node Affinity 비교

항목 NodeSelector Node Affinity
구문 복잡도 단순 (key=value) 복잡한 조건 구성 가능
조건 표현 단일 key/value만 가능 In, NotIn, Exists 등 다양
유연성 낮음 높음
복수 조건 처리 불가능 가능
스케줄러 적용 방식 하드 조건 (무조건 일치) required 또는 preferred 선택 가능

NodeSelector는 간단한 조건에 적합,
Node Affinity는 복잡한 조건이 필요할 때 적합합니다.


3️⃣ NodeSelector 예제: GPU 노드에만 배포

✅ 노드에 라벨 추가

kubectl label node node-1 gpu=true

✅ DaemonSet 설정

spec:
  template:
    spec:
      nodeSelector:
        gpu: "true"  # 노드 라벨이 정확히 일치해야 배포됨

📌 설명

  • 매우 단순하고 명확한 방식이며,
  • 조건이 하나인 경우 사용하기 적합합니다.

4️⃣ Node Affinity 예제: 특정 영역(zone) 내에서만 배포

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

📌 설명

  • matchExpressions를 사용하여 여러 조건을 조합할 수 있습니다.
  • requiredDuringSchedulingIgnoredDuringExecution은 스케줄링 시 반드시 조건을 만족해야 함을 의미합니다.

✅ 조건 완화 예시 (preferred 사용)

affinity:
  nodeAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        preference:
          matchExpressions:
            - key: node-role.kubernetes.io/edge
              operator: In
              values:
                - "true"

📌 설명

  • preferred는 조건을 만족하면 좋지만, 그렇지 않아도 스케줄링은 가능하게 합니다.
  • 유연한 스케줄링이 필요한 경우 적합합니다.

5️⃣ DaemonSet 전체 구성 예제 (Node Affinity 기반)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: gpu-agent
spec:
  selector:
    matchLabels:
      app: gpu-agent
  template:
    metadata:
      labels:
        app: gpu-agent
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: gpu
                    operator: In
                    values:
                      - "true"    # 라벨이 gpu=true인 노드만 배포 대상
      containers:
        - name: gpu-agent
          image: busybox
          command: ["sh", "-c", "echo Running on GPU node; sleep 3600"]

6️⃣ 선택 기준 요약

조건 추천 방식
단일 key/value 조건 NodeSelector
복잡한 조건 (여러 키, 부정 조건 포함) Node Affinity
조건이 반드시 만족되어야 함 required (Node Affinity) 또는 NodeSelector
조건 만족이 "우선시되지만 필수는 아님" preferred (Node Affinity)
운영 중 조건 확장 가능성 있음 Node Affinity (유연성 확보 목적)

🔥 7️⃣ 결론

DaemonSet을 특정 노드에만 배포하고자 할 때는 NodeSelector 또는 Node Affinity를 활용할 수 있습니다.
NodeSelector는 단순하고 직관적인 방식으로, 조건이 하나일 때 적합합니다.
Node Affinity는 복잡한 조건을 다룰 수 있어 유연한 제어가 가능합니다.
운영 환경의 특성에 따라 두 방식 중 적절한 방법을 선택하여 설정하는 것이 중요합니다.

 

728x90