1. 개념 요약
Topology Spread Constraints는 다음을 정의
"특정 레이블을 가진 파드들이, 지정한 Topology Key에 따라 최대한 균등하게 분산되도록 하라."
•
예: app=web 파드를 각 노드 혹은 가용 영역(zone) 에 균등하게 퍼뜨리기
•
이를 통해 한 곳에 몰려 배치되는 것을 방지함
2. 구성 요소 설명
Topology Spread Constraints는 다음 필드를 포함
필드명 | 설명 |
maxSkew | 허용 가능한 최대 불균형 정도 |
topologyKey | 파드를 분산시킬 기준. 예: kubernetes.io/hostname, topology.kubernetes.io/zone |
whenUnsatisfiable | 조건을 만족하지 못할 경우 처리 방법. DoNotSchedule 또는 ScheduleAnyway |
labelSelector | 어떤 파드 그룹을 기준으로 분산할지 선택. 보통 같은 앱의 레이블 사용 |
matchLabelKeys (1.28+) | 해당 키를 가진 파드 레이블만 고려함 |
minDomains (1.25+) | 최소한 분산되어야 하는 도메인 개수 |
3. 주요 필드 예시
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: myapp
YAML
복사
이 예시는 다음을 의미
•
같은 app=myapp 레이블을 가진 파드들 간에
•
kubernetes.io/hostname (즉, 노드) 기준으로
•
파드 수의 차이가 1 이하가 되도록 분산
•
만약 조건을 맞출 수 없으면 → 스케줄하지 않기 (DoNotSchedule)
4. 필드별 상세 설명
maxSkew (최대 스큐)
•
파드가 분산된 각 topology group 간 최대 편차(차이) 를 의미
•
예: 5개의 노드에 파드를 배치할 때, maxSkew: 1이면 모든 노드 간 파드 수 차이가 1 이하가 되어야 함
topologyKey
•
파드를 분산시킬 기준
•
예:
◦
kubernetes.io/hostname → 각 노드에 균등하게
◦
topology.kubernetes.io/zone → 각 AZ(가용영역)에 균등하게
whenUnsatisfiable
•
조건이 만족되지 않을 때 어떻게 할지 설정
값 | 설명 |
DoNotSchedule | 조건을 만족하지 못하면 파드를 스케줄링하지 않음(hard) |
ScheduleAnyway | 조건을 만족하지 않더라도 파드 스케줄링 강행(soft) |
대부분의 고가용성 워크로드에서는 DoNotSchedule을 사용한다고함
5. 실전 예제
예제 1: 노드 간 균등 분산
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: frontend
YAML
복사
→ 같은 app=frontend 파드는 가능한 한 모든 노드에 균등하게 배치됨
예제 2: AZ(가용 영역) 분산
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: backend
YAML
복사
→ app=backend 파드는 가능한 한 모든 가용영역(zone) 에 균등하게 배치됨
예제 3: 다중 조건 분산
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: myservice
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: myservice
YAML
복사
→ 파드가 zone과 노드 둘 다에서 균등하게 퍼지도록 설정됨
→ 단일 노드나 단일 AZ에 몰리는 것 방지
6. Affinity vs Spread Constraint 차이
항목 | Affinity | TopologySpreadConstraints |
목적 | 특정 위치에 배치 | 균등하게 분산 배치 |
적용 대상 | 파드 또는 노드 선택 | 파드 간 분산 조절 |
필수 조건 | required, preferred | maxSkew, topologyKey 등 |
제어 방식 | 위치 기반 선호/제한 | 분산 기준과 균등성 보장 |
7. 제한 사항 및 주의사항
•
TopologyKey에 해당하는 레이블이 없는 노드는 무시됨
•
labelSelector를 통해 기준 파드 집합을 명확히 지정해야 함
•
클러스터 규모가 작으면 DoNotSchedule로 인해 파드가 Pending 상태에 빠질 수 있음
•
ReplicaSet과 함께 사용할 때 복제본 간 분산에 매우 유용
요약
용도 | 설명 |
파드 분산 | 여러 노드, 영역 등에 파드를 균등하게 분산 |
장애 격리 | 하나의 장애 도메인에 몰리는 것 방지 |
고가용성 | 리전/존 단위로 균형 있게 파드 배치 가능 |
조합 가능 | 여러 SpreadConstraint 조합으로 세밀한 제어 가능 |