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