쿠버네티스 토폴로지 분배 제약 조건

도람·2025년 11월 24일
post-thumbnail

토폴로지 분배 제약 조건이란?

공식 문서에서는 Pod Topology Spread Constraints 를

"파드를 리전, 존, 노드 같은 장애 도메인(failure-domain)에 고르게 분산시키기 위한 방법"
이라고 설명한다.

쉽게 말하면,
“app=nginx 인 파드들은 각 AZ(또는 노드)에 최대 1개 차이까지만 배치하도록" 하는 규칙을 spec에 적어두는 것이라고 보면 된다.

이 제약조건의 이점은 다음과 같다.

  • 특정 노드(또는 AZ)에 파드가 몰리는 것 방지
  • 한 AZ / 노드가 죽었을 때, 전체 서비스가 한 번에 다 나가는 것을 줄일 수 있다
  • 클러스터 리소스를 좀 더 균형 있게 쓸 수 있다

핵심 필드

spec.template.spec.topologySpreadConstraints 아래에 아래 네 가지 필드를 적는다.

topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: topology.kubernetes.io/zone
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        app: spread-nginx

각각 의미는 이렇다.

topologyKey – 어떤 기준으로 나눌 것인지

노드에 붙어있는 레이블 키 이름이다.
예시:
- topology.kubernetes.io/zone → AZ 단위로 나눔
- topology.kubernetes.io/region → 리전 단위
- kubernetes.io/hostname → 노드(hostname) 단위

같은 topologyKey 값이 같은 도메인으로 묶인다.
예를 들어,

  • topology.kubernetes.io/zone=ap-northeast-2a
  • topology.kubernetes.io/zone=ap-northeast-2b

이렇게 라벨링 되어 있으면, 2a, 2b 가 서로 다른 “리전"에 배치되는 느낌이다.


maxSkew – 도메인 사이 개수 차이를 몇 개까지 허용할지

공식 문서 표현을 빌리면,

"어떤 두 도메인 사이에 존재할 수 있는 파드 개수 차이의 최대값"
이라고 나와있다.

예를 들어,

  • zone A: 4개
  • zone B: 3개
  • zone C: 3개
    이면, 제일 많은 곳(4)과 제일 적은 곳(3)의 차이가 1 → maxSkew: 1 만족.
    이며,

만약

  • zone A: 6개
  • zone B: 1개

이면 차이가 5 → maxSkew: 1 규칙을 깨는 상황인 것이다.


whenUnsatisfiable – 규칙을 못 지킬 경우

두 가지 값이 있다.

  • DoNotSchedule

    • 규칙을 지킬 수 없으면 아예 새 파드를 스케줄하지 않는다.
    • 파드는 Pending 상태로 남는다.
  • ScheduleAnyway

    • 규칙을 100% 지키진 못해도, 가능한 한 균등하게 배치하려고 시도한 뒤
      일단 스케줄은 한다.


참고자료:
[쿠버네티스 공식 문서 – Pod Topology Spread Const]
https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/?utm_source=chatgpt.com

profile
정도를 걷는 엔지니어

0개의 댓글