Kubernetes의 Pod Topology Spread Constraints 개념 및 활용

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이 있는 토폴로지 간의 최대 차이
topologyKeyPod을 분산할 기준 (예: Zone, Node 등)
whenUnsatisfiablePod을 원하는 대로 배치할 수 없을 때의 동작 방식
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-AffinityTopology 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 배포, 노드 부하 균형, 가용성 향상 등에 효과적

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다