1. 개요
Kubernetes에서 Pod의 배포 방식은 서비스 안정성과 성능에 큰 영향을 미친다.
특히 특정 노드나 영역(Zone)에 Pod이 집중되는 문제를 방지하려면, Pod Topology Spread Constraints(토폴로지 분산 제약) 기능을 활용해야 한다.
이 문서에서는 Pod Topology Spread Constraints의 개념, 필요성, 적용 방법, 활용 사례를 살펴본다.
2. Pod Topology Spread Constraints란?
Pod Topology Spread Constraints는 Kubernetes 스케줄러가 특정 토폴로지(Key) 기준으로 Pod을 균등하게 배치하도록 제약을 설정하는 기능이다.
2.1. 주요 특징
✅ 특정 기준(Zone, Node, Rack 등)에 따라 Pod을 분산 배치
✅ 한 곳에 Pod이 몰리지 않도록 조절 가능
✅ 서비스 가용성 및 부하 분산 향상
✅ Pod Anti-Affinity보다 더 정교한 컨트롤 가능
3. Pod Topology Spread Constraints가 필요한 이유
💡 문제 상황
- 한 데이터센터(Zone)에 Pod이 집중되면, 해당 Zone 장애 발생 시 서비스 전체가 다운될 위험이 있음.
- 리소스 사용량이 특정 노드에 집중되면, 일부 노드에서 과부하가 발생할 수 있음.
- 부하 분산을 위해 Pod을 균등하게 배포하고 싶음.
✅ Pod Topology Spread Constraints를 적용하면?
✔ Pod이 여러 Zone, Node로 자동 분산
✔ 특정 Zone/Node 장애에도 서비스 지속 가능
✔ 부하가 균등하게 분산됨
4. Pod Topology Spread Constraints 적용 방법
4.1. 기본 구조
Pod 배포 시 .spec.topologySpreadConstraints
필드를 설정하여 적용한다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 6
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app: my-app
containers:
- name: my-container
image: nginx
5. 주요 필드 설명
필드명 | 설명 |
---|---|
maxSkew | 가장 많은 Pod이 있는 토폴로지(Zone/Node)와 가장 적은 Pod이 있는 토폴로지 간의 최대 차이 |
topologyKey | Pod을 분산할 기준 (예: Zone, Node 등) |
whenUnsatisfiable | Pod을 원하는 대로 배치할 수 없을 때의 동작 방식 |
labelSelector | 특정 라벨을 가진 Pod만 적용 |
6. topologyKey
설정 예시
6.1. Zone별 균등 분산
✅ Pod을 서로 다른 Zone에 분산 배치
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: my-app
👉 각 Zone에 배포되는 Pod 개수 차이가 최대 1개 이하가 되도록 조절
6.2. 노드(Node)별 균등 분산
✅ Pod이 특정 노드에 몰리지 않도록 균등 분산
topologySpreadConstraints:
- maxSkew: 2
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app: my-app
👉 각 노드에 배포되는 Pod 개수 차이가 최대 2개 이하가 되도록 조절
7. whenUnsatisfiable
동작 방식
값 | 동작 방식 |
---|---|
DoNotSchedule | 원하는 분산 조건을 만족하지 못하면 Pod을 생성하지 않음 |
ScheduleAnyway | 원하는 분산 조건을 만족하지 못해도 가능한 범위 내에서 배포 |
💡 일반적으로 ScheduleAnyway
를 사용하여 유연한 배포를 권장
8. Pod Anti-Affinity vs. Topology Spread Constraints
비교 항목 | Pod Anti-Affinity | Topology Spread Constraints |
---|---|---|
적용 방식 | 특정 노드에 Pod이 배치되지 않도록 설정 | 특정 기준(Zone, Node)으로 균등 분산 |
주요 목적 | 특정 Pod 간의 충돌 방지 | Pod 분산 배포 |
예제 | 같은 Node에 특정 Pod이 위치하지 않도록 설정 | 모든 Zone에 Pod이 골고루 배치되도록 설정 |
💡 Pod Anti-Affinity는 특정 Pod과 함께 배치되지 않도록 설정하는 반면,
💡 Pod Topology Spread Constraints는 Pod이 균등하게 분산되도록 설정하는 것이 차이점!
9. 실전 적용 사례
9.1. 멀티존 클러스터에서 Pod 분산 배포
✅ 가용성을 위해 여러 Zone에 분산 배포 필요
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app: frontend
👉 us-east-1a
, us-east-1b
, us-east-1c
등에 균등 배포 가능
9.2. 노드 그룹 간의 부하 분산
✅ CPU 사용률이 높은 Pod이 특정 노드에 몰리지 않도록 배포
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app: high-cpu-app
👉 CPU 부하를 여러 노드로 분산하여 성능 최적화 가능
10. 결론
✔ Pod Topology Spread Constraints는 Kubernetes에서 Pod을 균형 있게 배포하는 기능
✔ 특정 Zone/Node로 트래픽 집중을 방지하고, 부하를 분산 가능
✔ Multi-Zone 배포, 노드 부하 균형, 가용성 향상 등에 효과적