4.8. Pod 토폴로지 분배 제약 조건을 사용하여 Pod 배치 제어


포드 토폴로지 확산 제약 조건을 사용하면 노드, 영역, 지역 또는 기타 사용자 정의 토폴로지 도메인에서 포드 배치를 세부적으로 제어할 수 있습니다. 장애 도메인 전반에 포드를 분산하면 높은 가용성과 보다 효율적인 리소스 활용을 달성하는 데 도움이 될 수 있습니다.

4.8.1. 사용 사례 예

  • 관리자로서, 저는 작업 부하가 2개에서 15개 포드 사이로 자동으로 확장되기를 원합니다. 포드가 두 개만 있는 경우 단일 장애 지점을 방지하기 위해 동일한 노드에 배치되지 않도록 하려고 합니다.
  • 관리자로서, 지연 시간과 네트워크 비용을 줄이기 위해 여러 인프라 영역에 포드를 균등하게 분산하고 싶습니다. 문제가 발생할 경우 클러스터가 스스로 복구될 수 있도록 하고 싶습니다.

4.8.2. 중요한 고려 사항

  • OpenShift Container Platform 클러스터의 Pod는 배포, 상태 집합 또는 데몬 집합과 같은 워크로드 컨트롤러 에 의해 관리됩니다. 이러한 컨트롤러는 클러스터의 노드에 포드를 분산하고 크기를 조정하는 방법을 포함하여 포드 그룹의 원하는 상태를 정의합니다. 혼란을 피하기 위해 그룹 내 모든 포드에 동일한 포드 토폴로지 확산 제약 조건을 설정해야 합니다. 배포와 같은 워크로드 컨트롤러를 사용하는 경우 일반적으로 Pod 템플릿이 이를 처리합니다.
  • 다양한 Pod 토폴로지 확산 제약 조건을 혼합하면 OpenShift Container Platform의 동작이 혼란스러워지고 문제 해결이 더 어려워질 수 있습니다. 토폴로지 도메인의 모든 노드에 일관된 레이블이 지정되어 있는지 확인하면 이를 방지할 수 있습니다. OpenShift Container Platform은 kubernetes.io/hostname 과 같은 잘 알려진 레이블을 자동으로 채웁니다. 이렇게 하면 노드에 수동으로 레이블을 지정할 필요가 없습니다. 이러한 레이블은 필수적인 토폴로지 정보를 제공하여 클러스터 전체에서 일관된 노드 레이블을 보장합니다.
  • 제약 조건으로 인해 분배 시 동일한 네임스페이스 내의 Pod만 일치하고 함께 그룹화됩니다.
  • 여러 Pod 토폴로지 분배 제약 조건을 지정할 수 있지만 서로 충돌하지 않도록 해야 합니다. Pod를 배치하려면 모든 Pod 토폴로지 분배 제약 조건을 충족해야 합니다.

4.8.3. skew와 maxSkew 이해하기

비대칭은 영역이나 노드와 같은 다양한 토폴로지 도메인에서 지정된 레이블 선택기와 일치하는 포드 수의 차이를 말합니다.

각 도메인에 대한 왜곡은 해당 도메인의 포드 수와 예약된 포드 수가 가장 적은 도메인의 포드 수의 절대값 차이를 구하여 계산됩니다. maxSkew 값을 설정하면 스케줄러가 균형 잡힌 포드 분포를 유지하도록 안내합니다.

4.8.3.1. 예시 비대칭 계산

세 개의 구역(A, B, C)이 있고, 각 구역에 포드를 균등하게 분배하려고 합니다. 영역 A에 포드가 5개, 영역 B에 포드가 3개, 영역 C에 포드가 2개 있는 경우, 비대칭도를 찾으려면 각 영역에 현재 예약된 포드 수에서 예약된 포드 수가 가장 적은 도메인의 포드 수를 뺍니다. 즉, A구역의 왜도는 3, B구역의 왜도는 1, C구역의 왜도는 0입니다.

4.8.3.2. maxSkew 매개변수

maxSkew 매개변수는 두 토폴로지 도메인 사이의 포드 수에서 허용되는 최대 차이 또는 비대칭도를 정의합니다. maxSkew가 1 로 설정된 경우, 모든 토폴로지 도메인의 포드 수는 다른 도메인과 1 이상 차이가 나면 안 됩니다. 비대칭이 maxSkew를 초과하면 스케줄러는 제약 조건을 준수하면서 비대칭을 줄이는 방식으로 새로운 포드를 배치하려고 시도합니다.

이전 예제의 비대칭 계산을 사용하면 비대칭 값이 기본 maxSkew 값인 1을 초과합니다. 스케줄러는 비대칭을 줄이고 더 균형 잡힌 분포를 달성하기 위해 영역 B와 영역 C에 새로운 포드를 배치하여 어떠한 토폴로지 도메인도 비대칭도 1을 초과하지 않도록 보장합니다.

4.8.4. 포드 토폴로지 확산 제약에 대한 예시 구성

어떤 포드를 그룹화할지, 어떤 토폴로지 도메인에 분산할지, 허용되는 비대칭도를 지정할 수 있습니다.

다음 예제에서는 Pod 토폴로지 분배 제약 조건 구성을 보여줍니다.

지정된 레이블과 일치하는 포드를 해당 구역을 기준으로 배포하는 예

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    region: us-east
spec:
  securityContext:
    runAsNonRoot: true
    seccompProfile:
      type: RuntimeDefault
  topologySpreadConstraints:
  - maxSkew: 1 
1

    topologyKey: topology.kubernetes.io/zone 
2

    whenUnsatisfiable: DoNotSchedule 
3

    labelSelector: 
4

      matchLabels:
        region: us-east 
5

    matchLabelKeys:
      - my-pod-label 
6

  containers:
  - image: "docker.io/ocpqe/hello-pod"
    name: hello-pod
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop: [ALL]
Copy to Clipboard Toggle word wrap

1
두 토폴로지 도메인 간 최대 Pod 수 차이입니다. 기본값은 1이고 값 0은 지정할 수 없습니다.
2
노드 라벨의 키입니다. 이 키 및 동일한 값이 있는 노드는 동일한 토폴로지에 있는 것으로 간주됩니다.
3
분배 제약 조건을 충족하지 않는 경우 Pod를 처리하는 방법입니다. 기본값은 스케줄러에 Pod를 예약하지 않도록 지시하는 DoNotSchedule입니다. Pod를 계속 예약하기 위해 ScheduleAnyway로 설정하지만 스케줄러는 클러스터의 불균형이 더 심해지지 않도록 불일치에 따라 우선순위를 부여합니다.
4
이 라벨 선택기와 일치하는 Pod는 제약 조건을 충족하기 위해 분배될 때 계산되고 그룹으로 인식됩니다. 라벨 선택기를 지정해야 합니다. 그러지 않으면 일치하는 Pod가 없습니다.
5
Pod 사양도 나중에 올바르게 계산되도록 하려면 해당 라벨을 이 라벨 선택기와 일치하도록 설정해야 합니다.
6
어느 포드에 분포할지 계산하기 위한 포드 레이블 키 목록입니다.

단일 포드 토폴로지 확산 제약을 보여주는 예

kind: Pod
apiVersion: v1
metadata:
  name: my-pod
  labels:
    region: us-east
spec:
  securityContext:
    runAsNonRoot: true
    seccompProfile:
      type: RuntimeDefault
  topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: topology.kubernetes.io/zone
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        region: us-east
  containers:
  - image: "docker.io/ocpqe/hello-pod"
    name: hello-pod
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop: [ALL]
Copy to Clipboard Toggle word wrap

이전 예제에서는 하나의 Pod 토폴로지 확산 제약 조건이 있는 Pod 사양을 정의합니다. region: us-east로 라벨이 지정된 포드와 일치하고, 여러 구역에 분산하고, 비대칭도를 1 로 지정하고, 이러한 요구 사항을 충족하지 못하면 포드를 예약하지 않습니다.

여러 포드 토폴로지 확산 제약 조건을 보여주는 예

kind: Pod
apiVersion: v1
metadata:
  name: my-pod-2
  labels:
    region: us-east
spec:
  securityContext:
    runAsNonRoot: true
    seccompProfile:
      type: RuntimeDefault
  topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: node
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        region: us-east
  - maxSkew: 1
    topologyKey: rack
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        region: us-east
  containers:
  - image: "docker.io/ocpqe/hello-pod"
    name: hello-pod
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop: [ALL]
Copy to Clipboard Toggle word wrap

이전 예제에서는 두 개의 Pod 토폴로지 확산 제약 조건이 있는 Pod 사양을 정의합니다. 둘 다 region: us-east로 라벨이 지정된 포드에서 일치하고, 비대칭도를 1 로 지정하고, 이러한 요구 사항을 충족하지 않으면 포드를 예약하지 않습니다.

첫 번째 제약 조건에서는 사용자 정의 라벨 node를 기반으로 Pod를 배포하고, 두 번째는 제약 조건에서는 사용자 정의 라벨 rack을 기반으로 Pod를 배포합니다. Pod를 예약하려면 두 제약 조건을 모두 충족해야 합니다.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat