특정 영역에 GKE 포드 배치


이 페이지에서는 영역 토폴로지를 사용하여 특정 Google Cloud 영역의 노드에서 포드를 실행하도록 Google Kubernetes Engine(GKE)에 지시하는 방법을 보여줍니다. 이러한 유형의 배치는 다음과 같은 상황에 유용합니다.

  • 포드는 영역 Compute Engine 영구 디스크에 저장된 데이터에 액세스해야 합니다.
  • 포드는 Cloud SQL 인스턴스와 같은 다른 영역 리소스와 함께 실행되어야 합니다.

또한 영역 배치와 토폴로지 인식 트래픽 라우팅을 사용하여 클라이언트와 워크로드 간의 지연 시간을 줄일 수 있습니다. 토폴로지 인식 트래픽 라우팅에 대한 자세한 내용은 토폴로지 인식 라우팅을 참조하세요.

영역 토폴로지를 사용하여 포드 배치를 제어하는 것은 포드가 특정 영역에서 실행되어야 하는 경우에만 사용해야 하는 고급 Kubernetes 메커니즘입니다. 대부분의 프로덕션 환경에서는 가능하면 GKE 기본값인 리전 리소스를 사용하는 것이 좋습니다.

영역 배치 방법

영역 토폴로지는 topology.kubernetes.io/zone: ZONE 노드 라벨이 있는 Kubernetes에 기본 제공됩니다. 포드를 특정 영역에 배치하도록 GKE에 지시하려면 다음 방법 중 하나를 사용합니다.

  • nodeAffinity: Google Cloud 영역 하나 이상의 포드 사양에 nodeAffinity 규칙을 지정합니다. 이 방법은 포드를 여러 영역에 배치할 수 있으므로 nodeSelector보다 유연합니다.
  • nodeSelector: 단일 Google Cloud 영역의 포드 사양에 nodeSelector를 지정합니다.

고려사항

영역 토폴로지를 사용하는 영역별 포드 배치에서는 다음 사항을 고려해야 합니다.

  • 클러스터는 요청된 영역과 동일한 Google Cloud 리전에 있어야 합니다.
  • 표준 클러스터에서는 노드 자동 프로비저닝을 사용하거나 요청된 영역의 노드가 포함된 노드 풀을 만들어야 합니다. Autopilot 클러스터에서 이 프로세스를 자동으로 관리합니다.
  • 표준 클러스터는 리전 클러스터여야 합니다.

가격 책정

영역 토폴로지는 Kubernetes 예약 기능이며 GKE에서 추가 비용 없이 제공됩니다.

자세한 가격 책정 정보는 GKE 가격 책정을 참조하세요.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.
  • 포드를 배치할 영역과 동일한 Google Cloud 리전에 기존 GKE 클러스터가 있는지 확인합니다. 새 클러스터를 만들려면 Autopilot 클러스터 만들기를 참조하세요.

nodeAffinity를 사용하여 여러 영역에 포드 배치

Kubernetes nodeAffinity는 여러 라벨 선택기와 논리 연산자를 지원하는 유연한 예약 제어 메커니즘을 제공합니다. 영역 집합 중 하나(예: us-central1-a 또는 us-central1-f)에서 포드를 실행하려면 nodeAffinity를 사용합니다.

  1. 다음 매니페스트를 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 리전에 있는지 확인합니다. 클러스터가 다른 리전에 있으면 매니페스트의 값 필드에 있는 영역을 클러스터 리전의 유효한 영역으로 변경합니다.

  2. 배포를 만듭니다.

    kubectl create -f multi-zone-affinity.yaml
    

    GKE에서 지정된 영역 중 하나에 있는 노드에 포드를 만듭니다. 여러 포드가 같은 노드에서 실행될 수 있습니다. 선택적으로 포드 안티-어피니티를 사용하여 각 노드를 개별 노드에 배치하라고 GKE에 지시할 수 있습니다.

nodeSelector를 사용하여 단일 영역에 포드 배치

단일 영역에 포드를 배치하려면 포드 사양에서 nodeSelector를 사용합니다. nodeSelector는 단일 영역이 지정된 requiredDuringSchedulingIgnoredDuringExecution nodeAffinity 규칙과 동일합니다.

  1. 다음 매니페스트를 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에 지시합니다.

  2. 배포를 만듭니다.

    kubectl create -f single-zone-selector.yaml
    

포드 배치 확인

포드 배치를 확인하려면 포드를 나열하고 노드 라벨을 확인합니다. 단일 포드에서 포드 여러 개가 실행될 수 있으므로 nodeAffinity를 사용한 경우 포드가 여러 영역에 분산되지 않을 수 있습니다.

  1. 포드를 나열합니다.

    kubectl get pods -o wide
    

    출력은 실행 중인 포드와 해당 GKE 노드의 목록입니다.

  2. 노드를 설명합니다.

    kubectl describe node NODE_NAME | grep "topology.kubernetes.io/zone"
    

    NODE_NAME을 허브 이름으로 바꿉니다.

    출력은 다음과 비슷합니다.

    topology.kubernetes.io/zone: us-central1-a
    

여러 장애 도메인에 걸쳐 장애 조치가 개선될 수 있도록 GKE에서 여러 영역에 포드를 균일하게 분산하도록 하려면 topologySpreadConstraints를 사용합니다.

다음 단계