이 페이지에서는 Google Kubernetes Engine(GKE)에서 영역 토폴로지를 사용하여 Google Cloud 의 특정 영역에 있는 노드에서 포드를 실행하도록 지시하는 방법을 보여줍니다. 이러한 유형의 배치는 다음과 같은 상황에 유용합니다.
- 포드는 영역 Compute Engine 영구 디스크에 저장된 데이터에 액세스해야 합니다.
- 포드는 Cloud SQL 인스턴스와 같은 다른 영역 리소스와 함께 실행되어야 합니다.
또한 영역 배치와 토폴로지 인식 트래픽 라우팅을 사용하여 클라이언트와 워크로드 간의 지연 시간을 줄일 수 있습니다. 토폴로지 인식 트래픽 라우팅에 대한 자세한 내용은 토폴로지 인식 라우팅을 참조하세요.
영역 토폴로지를 사용하여 포드 배치를 제어하는 것은 포드가 특정 영역에서 실행되어야 하는 경우에만 사용해야 하는 고급 Kubernetes 메커니즘입니다. 대부분의 프로덕션 환경에서는 가능하면 GKE 기본값인 리전 리소스를 사용하는 것이 좋습니다.
영역 배치 방법
영역 토폴로지는 topology.kubernetes.io/zone: ZONE 노드 라벨이 있는 Kubernetes에 기본 제공됩니다. 포드를 특정 영역에 배치하도록 GKE에 지시하려면 다음 방법 중 하나를 사용합니다.
- nodeAffinity: Google Cloud 영역 하나 이상의 포드 사양에 nodeAffinity 규칙을 지정합니다. 이 방법은 포드를 여러 영역에 배치할 수 있으므로 nodeSelector보다 유연합니다.
nodeSelector: 단일 Google Cloud 영역의 포드 사양에 nodeSelector를 지정합니다.
컴퓨팅 클래스: GKE 컴퓨팅 클래스를 사용하도록 포드를 구성합니다. 이 접근 방식을 사용하면 우선순위가 지정된 Google Cloud 영역 집합 목록을 정의할 수 있습니다. 이 기능을 사용하면 해당 영역에 노드가 존재할 경우 워크로드를 우선 순위가 가장 높은 영역 집합으로 동적으로 이동시킬 수 있습니다. 자세한 내용은 커스텀 컴퓨팅 클래스 정보를 참조하세요.
고려사항
영역 토폴로지를 사용하는 영역별 포드 배치에서는 다음 사항을 고려해야 합니다.
- 클러스터는 요청된 영역과 동일한 Google Cloud 리전에 있어야 합니다.
- 표준 클러스터에서는 노드 자동 프로비저닝을 사용하거나 요청된 영역의 노드가 포함된 노드 풀을 만들어야 합니다. Autopilot 클러스터에서 이 프로세스를 자동으로 관리합니다.
- 표준 클러스터는 리전 클러스터여야 합니다.
가격 책정
영역 토폴로지는 Kubernetes 예약 기능이며 GKE에서 추가 비용 없이 제공됩니다.
자세한 가격 책정 정보는 GKE 가격 책정을 참조하세요.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면
gcloud components update명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
- 포드를 배치할 영역과 동일한Google Cloud 리전에 기존 GKE 클러스터가 있는지 확인합니다. 새 클러스터를 만들려면 Autopilot 클러스터 만들기를 참조하세요.
nodeAffinity를 사용하여 여러 영역에 포드 배치
Kubernetes nodeAffinity는 여러 라벨 선택기와 논리 연산자를 지원하는 유연한 예약 제어 메커니즘을 제공합니다. 영역 집합 중 하나(예: us-central1-a 또는 us-central1-f)에서 포드를 실행하려면 nodeAffinity를 사용합니다.
다음 매니페스트를
multi-zone-affinity.yaml로 저장합니다.apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx-multi-zone template: metadata: labels: app: nginx-multi-zone spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - us-central1-a - us-central1-f이 매니페스트는 복제본 3개가 있는 배포를 만들고 노드 가용성을 기준으로 포드를
us-central1-a또는us-central1-f에 배치합니다.클러스터가
us-central1리전에 있는지 확인합니다. 클러스터가 다른 리전에 있으면 매니페스트의 값 필드에 있는 영역을 클러스터 리전의 유효한 영역으로 변경합니다.선택사항: TPU VM을 프로비저닝하는 경우
us-central1-ai1a와 같은 AI 영역을 사용합니다. AI 영역은 Google Cloud 리전 내에서 AI/ML 워크로드에 최적화된 특수 위치입니다.배포를 만듭니다.
kubectl create -f multi-zone-affinity.yamlGKE에서 지정된 영역 중 하나에 있는 노드에 포드를 만듭니다. 여러 포드가 같은 노드에서 실행될 수 있습니다. 선택적으로 포드 안티-어피니티를 사용하여 각 노드를 개별 노드에 배치하라고 GKE에 지시할 수 있습니다.
nodeSelector를 사용하여 단일 영역에 포드 배치
단일 영역에 포드를 배치하려면 포드 사양에서 nodeSelector를 사용합니다. nodeSelector는 단일 영역이 지정된 requiredDuringSchedulingIgnoredDuringExecution nodeAffinity 규칙과 동일합니다.
다음 매니페스트를
single-zone-selector.yaml로 저장합니다.apiVersion: apps/v1 kind: Deployment metadata: name: nginx-singlezone spec: replicas: 3 selector: matchLabels: app: nginx-singlezone template: metadata: labels: app: nginx-singlezone spec: nodeSelector: topology.kubernetes.io/zone: "us-central1-a" containers: - name: nginx image: nginx:latest ports: - containerPort: 80이 매니페스트는
us-central1-a영역에 있는 배포에 모든 복제본을 배치하라고 GKE에 지시합니다.배포를 만듭니다.
kubectl create -f single-zone-selector.yaml
컴퓨팅 클래스를 사용하여 선택한 영역에서 포드 배치 우선순위 지정
GKE 컴퓨팅 클래스는 노드 구성 우선순위 목록을 정의할 수 있는 제어 메커니즘을 제공합니다. 영역 선호도를 사용하면 GKE가 포드를 배치하길 원하는 영역을 정의할 수 있습니다. 컴퓨팅 클래스에서 영역 선호도를 정의하려면 GKE 버전 1.33.1-gke.1545000 이상이 필요합니다.
다음 예시에서는 포드에 선호되는 영역 목록을 지정하는 컴퓨팅 클래스를 만듭니다.
이 단계에서는 클러스터가 us-central1 리전에 있다고 가정합니다. 클러스터가 다른 리전에 있으면 매니페스트에서 영역 값을 클러스터 리전의 유효한 영역으로 변경합니다.
다음 매니페스트를
zones-custom-compute-class.yaml로 저장합니다.apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: zones-custom-compute-class spec: priorities: - location: zones: [us-central1-a, us-central1-b] - location: zones: [us-central1-c] activeMigration: optimizeRulePriority: true nodePoolAutoCreation: enabled: true whenUnsatisfiable: ScaleUpAnyway이 컴퓨팅 클래스 매니페스트는 확장 동작을 다음과 같이 변경합니다.
- GKE는
us-central1-a또는us-central1-b에 포드를 배치하려고 시도합니다. us-central1-a및us-central1-b에 사용 가능한 용량이 없으면 GKE가us-central1-c에 포드를 배치하려고 시도합니다.us-central1-c에 사용 가능한 용량이 없으면whenUnsatisfiable: ScaleUpAnyway필드에 따라 GKE가 해당 리전에서 사용 가능한 모든 영역에 포드를 배치합니다.- 컴퓨팅 클래스에서 우선순위가 더 높은 영역이 나중에 사용 가능해질 경우,
activeMigration.optimizeRulePriority: true필드를 설정하면 GKE는 우선순위가 낮은 영역에서 해당 영역으로 포드를 이동시킵니다. 이 마이그레이션은 포드 중단 예산을 사용하여 서비스 가용성을 보장합니다.
- GKE는
커스텀 컴퓨팅 클래스를 만듭니다.
kubectl create -f zones-custom-compute-class.yamlGKE는 워크로드가 참조할 수 있는 커스텀 컴퓨팅 클래스를 만듭니다.
다음 매니페스트를
custom-compute-class-deployment.yaml로 저장합니다.apiVersion: apps/v1 kind: Deployment metadata: name: nginx-zonal-preferences spec: replicas: 3 selector: matchLabels: app: nginx-zonal-preferences template: metadata: labels: app: nginx-zonal-preferences spec: nodeSelector: cloud.google.com/compute-class: "zones-custom-compute-class" containers: - name: nginx image: nginx:latest ports: - containerPort: 80배포를 만듭니다.
kubectl create -f custom-compute-class-deployment.yaml
타겟 AI 영역
AI 영역은 AI/ML 학습 및 추론 워크로드에 사용되는 특수 영역입니다. 이러한 영역은 상당한 ML 가속기 용량을 제공합니다. 자세한 내용은 AI 영역 문서를 참고하세요.
GKE에서 AI 영역을 사용하기 전에 다음 특성을 고려하세요.
- AI 영역은 추가 스토리지 공간과 전원을 제공하기 위해 표준 영역과 물리적으로 분리되어 있습니다. 이 분리로 인해 지연 시간이 길어질 수 있지만 일반적으로 AI/ML 워크로드에서는 허용됩니다.
- AI 영역에는
ai표기법이 포함된 접미사가 있습니다. 예를 들어us-central1리전의 AI 영역 이름은us-central1-ai1a입니다. - 현재는 TPU VM만 지원됩니다.
- 클러스터의 컨트롤 플레인은 AI 영역과 동일한 리전 내에 있는 하나 이상의 표준 영역에서 실행됩니다.
다음 요구사항을 충족하는 경우에만 연결된 TPU 없이 AI 영역에서 VM을 실행할 수 있습니다.
- 동일한 영역에서 TPU VM을 사용하는 다른 워크로드를 이미 실행하고 있습니다.
- TPU가 아닌 VM은 스팟 VM이거나, 예약에 연결되어 있거나, 특정 가속기-범용 VM 비율이 있는 노드 풀의 일부입니다.
AI 영역은 동일한 리전 내에서 동일한 접미사가 있는 표준 영역과 네트워킹 연결, 소프트웨어 출시와 같은 구성요소를 공유합니다. 고가용성 워크로드의 경우 다른 영역을 사용하는 것이 좋습니다. 예를 들어 고가용성을 위해
us-central1-ai1a와us-central1-a을 모두 사용하지 마세요.
기본적으로 GKE는 AI 영역에 워크로드를 배포하지 않습니다. AI 영역을 사용하려면 다음 옵션 중 하나를 구성해야 합니다.
- (권장) ComputeClasses: AI 영역에서 주문형 TPU를 요청할 때 가장 높은 우선순위를 설정합니다. ComputeClass를 사용하면 워크로드의 우선순위가 지정된 하드웨어 구성 목록을 정의할 수 있습니다. 예시는 ComputeClass 정보를 참고하세요.
- 노드 자동 프로비저닝: 포드 사양에서
nodeSelector또는nodeAffinity를 사용하여 AI 영역에 노드 풀을 만들도록 노드 자동 프로비저닝에 지시합니다. 워크로드가 AI 영역을 명시적으로 타겟팅하지 않으면 노드 자동 프로비저닝은 새 노드 풀을 만들 때 표준 영역 또는--autoprovisioning-locations의 영역만 고려합니다. 이 구성을 사용하면 AI/ML 모델을 실행하지 않는 워크로드가 명시적으로 다르게 구성하지 않는 한 표준 영역에 유지됩니다.nodeSelector를 사용하는 매니페스트의 예는 자동 생성된 노드의 기본 영역 설정을 참고하세요. - GKE Standard: 노드 풀을 직접 관리하는 경우 노드 풀을 만들 때
--node-locations플래그에서 AI 영역을 사용합니다. 예를 보려면 GKE Standard에 TPU 워크로드 배포를 참고하세요.
포드 배치 확인
포드 배치를 확인하려면 포드를 나열하고 노드 라벨을 확인합니다. 단일 포드에서 포드 여러 개가 실행될 수 있으므로 nodeAffinity를 사용한 경우 포드가 여러 영역에 분산되지 않을 수 있습니다.
포드를 나열합니다.
kubectl get pods -o wide출력은 실행 중인 포드와 해당 GKE 노드의 목록입니다.
노드를 설명합니다.
kubectl describe node NODE_NAME | grep "topology.kubernetes.io/zone"NODE_NAME을 허브 이름으로 바꿉니다.출력은 다음과 비슷합니다.
topology.kubernetes.io/zone: us-central1-a
여러 장애 도메인에 걸쳐 장애 조치가 개선될 수 있도록 GKE에서 여러 영역에 포드를 균일하게 분산하도록 하려면 topologySpreadConstraints를 사용합니다.