GKE 리전 클러스터에서 영역 장애 시뮬레이션


일반적인 규제 요구사항은 기업이 재해 복구(DR) 기능을 입증할 수 있어야 한다는 것입니다. 클라우드에서 실행되는 애플리케이션의 경우 이 요구사항에는 한 영역에서 호스팅된 서버를 일정 기간 사용할 수 없게 되었을 경우의 서비스 신뢰성과 가용성이 포함됩니다. 이 문서는 Google Kubernetes Engine(GKE) Standard 리전 클러스터를 사용할 때 영역 장애 조치를 시뮬레이션하는 방법을 알아보려는 관리자 및 설계자, 운영자, 백업 및 재해 복구(DR) 관리자를 대상으로 합니다.

GKE 리전 클러스터는 사용자가 선택한 리전에 생성되며 선택한 리전 내 여러 영역에 있는 VM에서 컨트롤 플레인을 실행합니다. GKE Autopilot 클러스터는 항상 리전이며 GKE Standard 클러스터는 리전이나 영역일 수 있습니다. 이 튜토리얼에서는 GKE Standard 리전 클러스터를 사용합니다. 클러스터 노드는 부하 분산기를 통해 컨트롤 플레인과 통신합니다. 즉, 노드 위치와 컨트롤 플레인 VM 위치가 항상 일치하지는 않습니다. Google Cloud 콘솔에서 리전 클러스터를 사용할 때는 특정 영역을 사용 중지할 수 없습니다. 자세한 내용은 GKE 클러스터 아키텍처를 참조하세요.

이 튜토리얼에서는 영역 오류를 시뮬레이션하는 세 가지 방법을 제공합니다. 자체 규정 준수 목적에 필요한 방법을 사용하여 영역 오류를 시뮬레이션하고 올바른 애플리케이션 응답을 확인할 수 있습니다.

이 문서의 방법은 단일 영역 및 멀티 영역을 포함한 영역 클러스터에도 적용됩니다. 이러한 방법은 타겟팅된 영역의 노드에만 영향을 미치며 GKE 컨트롤 플레인은 영향을 받지 않습니다.

목표

  • 기본 구성을 사용하여 리전 GKE Standard 클러스터를 만듭니다.
  • 샘플 마이크로서비스 애플리케이션을 리전 클러스터에 배포합니다.
  • 다음 세 가지 방법 중 하나를 사용하여 영역 중단을 시뮬레이션합니다.
    • 리전 클러스터에서 노드 풀 영역을 줄입니다.
    • 단일 영역 노드 풀을 사용합니다.
    • 대상 장애 영역의 노드를 차단하고 드레이닝합니다.
  • 마이크로서비스 가용성을 확인합니다.

비용

이 튜토리얼에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • Compute Engine
  • GKE Standard 모드 클러스터

가격 계산기를 사용하면 예상 사용량을 기준으로 예상 비용을 산출할 수 있습니다.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  6. Enable the Kubernetes Engine API, Compute Engine APIs:

    gcloud services enable container.googleapis.com compute.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  10. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  11. Enable the Kubernetes Engine API, Compute Engine APIs:

    gcloud services enable container.googleapis.com compute.googleapis.com

리전 Standard 클러스터 만들기

영역 장애를 시뮬레이션하기 전에 멀티 영역 노드 풀이 있는 리전 클러스터를 만듭니다. 클러스터의 제어 영역 및 노드는 지정된 리전의 여러 영역 간에 복제됩니다.

Google Cloud CLI를 사용하여 클러스터를 만듭니다.

  1. 기본 구성을 사용하여 새 GKE Standard 클러스터를 만듭니다.

    gcloud container clusters create CLUSTER_NAME \
      --region REGION \
      --num-nodes 2
    

    다음 매개변수를 바꿉니다.

    • CLUSTER_NAME: 클러스터의 이름입니다.
    • REGION: 클러스터에 사용할 리전입니다(예:us-central1).

    GKE에서 클러스터를 만들고 모든 항목이 정상적으로 작동하는지 확인하는 데 몇 분 정도 걸립니다. 지정한 리전의 각 영역에 노드 2개가 생성됩니다.

  2. 이전 단계에서 만든 각 노드의 영역을 확인합니다.

    kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    출력은 다음 예시와 같이 표시됩니다.

    NAME                                    ZONE                INT_IP
    regional-cluster-1-default-pool-node1   asia-southeast1-c   10.128.0.37
    regional-cluster-1-default-pool-node2   asia-southeast1-c   10.128.0.36
    regional-cluster-1-default-pool-node3   asia-southeast1-b   10.128.0.38
    regional-cluster-1-default-pool-node4   asia-southeast1-b   10.128.0.33
    regional-cluster-1-default-pool-node5   asia-southeast1-a   10.128.0.35
    regional-cluster-1-default-pool-node6   asia-southeast1-a   10.128.0.34
    
  3. 클러스터에 연결합니다.

    gcloud container clusters get-credentials CLUSTER_NAME \
        --region REGION
    

샘플 마이크로서비스 애플리케이션 배포

이 문서에서 시뮬레이션된 장애 조치의 영향을 확인하려면 샘플 마이크로서비스 기반 애플리케이션을 클러스터에 배포합니다. 이 문서에서는 샘플 Cymbal Bank 애플리케이션을 사용합니다.

  1. 셸에서 다음 GitHub 저장소를 클론하고 디렉터리로 변경합니다.

    git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
    cd bank-of-anthos/
    
  2. Cymbal Bank 샘플 애플리케이션을 이전 섹션에서 만든 GKE 클러스터에 배포합니다.

    kubectl apply -f ./extras/jwt/jwt-secret.yaml
    kubectl apply -f ./kubernetes-manifests
    
  3. 포드가 준비될 때까지 기다립니다.

    kubectl get pods
    
  4. 몇 분 후 포드가 Running 상태로 표시됩니다.

    NAME                                  READY   STATUS    RESTARTS   AGE
    accounts-db-0                         1/1     Running   0          16s
    balancereader-7dc7d9ff57-sstm5        0/1     Running   0          15s
    contacts-7ddc76d94-rr28x              0/1     Running   0          14s
    frontend-747b84bff4-2mtlv             0/1     Running   0          13s
    ledger-db-0                           1/1     Running   0          13s
    ledgerwriter-f6cc7889d-9qjfg          0/1     Running   0          13s
    loadgenerator-57d4cb57cc-zqvqb        1/1     Running   0          13s
    transactionhistory-5dd7c7fd77-lwkv8   0/1     Running   0          12s
    userservice-cd5ddb4bb-wwhml           0/1     Running   0          12s
    
  5. 포드가 모두 Running 상태가 되면 프런트엔드 서비스 외부 IP 주소를 가져옵니다.

    kubectl get service frontend | awk '{print $4}'
    
  6. 웹브라우저 창에서 kubectl get service 명령어 출력에 표시된 IP 주소를 열어 Cymbal Bank 인스턴스에 액세스합니다.

    기본 사용자 인증 정보가 자동으로 채워지므로 앱에 로그인하여 일부 샘플 거래와 잔액을 살펴볼 수 있습니다. Cymbal Bank가 성공적으로 실행되는지 확인하는 것 외에는 특별히 수행해야 할 작업은 없습니다. 모든 서비스가 올바르게 시작하고 사용자가 로그인할 수 있게 되는 데 1~2분 정도 걸릴 수 있습니다. 모든 포드가 Running 상태가 되고 Cymbal Bank 사이트에 성공적으로 로그인할 수 있을 때까지 기다렸다가 다음 섹션으로 이동하여 영역 오류를 시뮬레이션합니다.

영역 장애 시뮬레이션

이 섹션에서는 영역 중 하나에서 장애를 시뮬레이션합니다. 이 장애 조치를 시뮬레이션하는 방법에는 세 가지가 있습니다. 한 가지 방법만 선택해야 합니다. 자체 규정 준수 목적에 필요한 메서드를 사용하여 영역 장애를 시뮬레이션하고 올바른 애플리케이션 응답을 확인합니다.

노드 풀 영역 줄이기

기본적으로 리전 클러스터의 노드 풀에는 리전의 모든 영역에 걸쳐 있는 노드가 있습니다. 다음 다이어그램에서 Cloud Load Balancing은 영역 3개에 걸쳐 있는 노드 풀에 트래픽을 배포합니다. 영역마다 노드 2개가 있으며 포드는 이러한 영역의 노드에서 실행될 수 있습니다.

부하 분산기는 영역 3개에서 실행되는 리전 클러스터로 트래픽을 전달합니다. 영역마다 노드 2개가 있습니다.

이 섹션에서는 노드 풀이 영역 3개 중 2개에서만 실행되도록 업데이트하여 영역 장애를 시뮬레이션합니다. 이 방식은 포드와 트래픽을 다른 영역에 올바르게 재배포하여 애플리케이션에서 영역 손실에 대응할 수 있는지 확인합니다.

특정 영역에서만 실행되도록 노드 풀을 업데이트하고 장애를 시뮬레이션하려면 다음 단계를 완료합니다.

  1. 리전 클러스터와 서비스의 가용성을 확인합니다.

    kubectl get po -o wide \
    kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    결과는 다음 출력 예시와 비슷합니다.

    NAME                                  READY   STATUS    RESTARTS   AGE     IP          NODE
    accounts-db-0                         1/1     Running   0          6m30s   10.28.1.5   regional-cluster-1-default-pool-node3
    balancereader-7dc7d9ff57-shwg5        1/1     Running   0          6m30s   10.28.5.6   regional-cluster-1-default-pool-node1
    contacts-7ddc76d94-qv4x5              1/1     Running   0          6m29s   10.28.4.6   regional-cluster-1-default-pool-node2
    frontend-747b84bff4-xvjxq             1/1     Running   0          6m29s   10.28.3.6   regional-cluster-1-default-pool-node6
    ledger-db-0                           1/1     Running   0          6m29s   10.28.5.7   regional-cluster-1-default-pool-node1
    ledgerwriter-f6cc7889d-mttmb          1/1     Running   0          6m29s   10.28.1.6   regional-cluster-1-default-pool-node3
    loadgenerator-57d4cb57cc-7fvrc        1/1     Running   0          6m29s   10.28.4.7   regional-cluster-1-default-pool-node2
    transactionhistory-5dd7c7fd77-cmc2w   1/1     Running   0          6m29s   10.28.3.7   regional-cluster-1-default-pool-node6
    userservice-cd5ddb4bb-zfr2g           1/1     Running   0          6m28s   10.28.5.8   regional-cluster-1-default-pool-node1
    
    NAME                                    ZONE                INT_IP
    regional-cluster-1-default-pool-node5   asia-southeast1-c   10.148.0.6
    regional-cluster-1-default-pool-node6   asia-southeast1-c   10.148.0.7
    regional-cluster-1-default-pool-node2   asia-southeast1-a   10.148.0.8
    regional-cluster-1-default-pool-node1   asia-southeast1-a   10.148.0.9
    regional-cluster-1-default-pool-node3   asia-southeast1-b   10.148.0.5
    regional-cluster-1-default-pool-node4   asia-southeast1-b   10.148.0.4
    

    이 예시에서는 모든 Cymbal Bank 워크로드가 모든 영역에 배포됩니다. 오류를 시뮬레이션하려면 프런트엔드 서비스가 배포되는 asia-southeast1-c와 같은 영역 중 하나를 사용 중지합니다.

  2. 영역 중단을 시뮬레이션합니다. 3개 영역 중 2개 영역만 지정하도록 기존 노드 풀(default-pool)을 업데이트합니다.

      gcloud container node-pools update default-pool \
        --cluster=CLUSTER_NAME \
        --node-locations=ZONE_A, ZONE_B \
        --region=REGION
    

    ZONE_A, ZONE_B를 노드 풀을 계속 실행할 영역 2개로 바꿉니다.

  3. 노드 풀을 업데이트한 후 마이크로서비스 가용성을 확인합니다.

    kubectl get po -o wide
    kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    출력은 다음 예시와 같이 표시됩니다.

    NAME                                    ZONE                INT_IP
    regional-cluster-1-default-pool-node2   asia-southeast1-a   10.148.0.8
    regional-cluster-1-default-pool-node1   asia-southeast1-a   10.148.0.9
    regional-cluster-1-default-pool-node3   asia-southeast1-b   10.148.0.5
    regional-cluster-1-default-pool-node4   asia-southeast1-b   10.148.0.4
    
    NAME                                  READY   STATUS    RESTARTS   AGE     IP          NODE
    accounts-db-0                         1/1     Running   0          28m     10.28.1.5   regional-cluster-1-default-pool-node3
    balancereader-7dc7d9ff57-shwg5        1/1     Running   0          28m     10.28.5.6   regional-cluster-1-default-pool-node1
    contacts-7ddc76d94-qv4x5              1/1     Running   0          28m     10.28.4.6   regional-cluster-1-default-pool-node2
    frontend-747b84bff4-mdnkd             1/1     Running   0          9m21s   10.28.1.7   regional-cluster-1-default-pool-node3
    ledger-db-0                           1/1     Running   0          28m     10.28.5.7   regional-cluster-1-default-pool-node1
    ledgerwriter-f6cc7889d-mttmb          1/1     Running   0          28m     10.28.1.6   regional-cluster-1-default-pool-node3
    loadgenerator-57d4cb57cc-7fvrc        1/1     Running   0          28m     10.28.4.7   regional-cluster-1-default-pool-node2
    transactionhistory-5dd7c7fd77-w2vqs   1/1     Running   0          9m20s   10.28.4.8   regional-cluster-1-default-pool-node2
    userservice-cd5ddb4bb-zfr2g           1/1     Running   0          28m     10.28.5.8   regional-cluster-1-default-pool-node1
    

    이 출력 예시에서 asia-southeast1-c는 더 이상 사용되지 않습니다. URL http://EXTERNAL_IP를 사용하여 브라우저에서 액세스하는 프런트엔드 서비스에는 계속 액세스할 수 있습니다. 영역 중 하나를 더 이상 사용할 수 없더라도 사용자는 계속 입금 및 결제 작업을 수행할 수 있습니다.

단일 영역 노드 풀 사용

이 섹션에서는 노드 풀 2개를 삭제하여 영역 장애를 시뮬레이션합니다. 이 방식은 포드와 트래픽을 다른 영역의 노드 풀에 올바르게 재배포하여 애플리케이션에서 노드 풀 손실에 대응할 수 있는지 확인합니다. 리전 클러스터에서 영역 중단을 시뮬레이션하려면 이전에 만든 기본 클러스터를 확장하여 여러 노드 풀에서 Cymbal Bank 애플리케이션을 실행합니다. 클러스터에 여러 노드 풀이 있는 경우가 더 일반적이므로 영역 중단을 시뮬레이션하는 이 방법은 노드 풀에서 활성 영역 업데이트의 첫 번째 예시보다 실제 영역 장애를 더 정확하게 반영합니다.

부하 분산기는 노드 풀 3개에서 실행되는 리전 클러스터로 트래픽을 전달합니다. 기본 노드 풀은 모든 영역에서 실행되고 나머지 노드 풀 2개는 각각 단일 영역에서 실행됩니다.

단일 영역 노드 풀 장애를 시뮬레이션하기 위해 이 섹션에서 빌드하는 클러스터에는 다음 구성요소가 포함됩니다.

  • 일반적으로 리전 GKE Standard 클러스터를 만들 때 생성되는 기본 노드 풀은 멀티 영역 노드 풀(default-pool)입니다.

    단일 default-pool이 있는 이 클러스터는 이 문서의 앞 부분에서 만든 클러스터입니다.

  • 또한 Cymbal Bank 애플리케이션 예시의 서비스를 실행하는 추가 노드 풀(zonal-node-pool-1zonal-node-pool-2)이 있습니다.

다이어그램의 점선은 default-poolzonal-node-pool-1의 장애를 시뮬레이션한 후 트래픽이 zonal-node-pool-2에만 처리되는 방식을 보여줍니다.

추가 노드 풀을 만들고 장애를 시뮬레이션하려면 다음 단계를 완료합니다.

  1. 리전 클러스터 가용성을 확인합니다.

    gcloud container node-pools list \
        --cluster=CLUSTER_NAME \
        --region REGION
    
    kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    결과는 다음 출력 예시와 비슷합니다.

    NAME: default-pool
    MACHINE_TYPE: e2-medium
    DISK_SIZE_GB: 100
    NODE_VERSION: 1.27.8-gke.1067004
    
    NAME                                         ZONE.               INT_IP
    regional-cluster-1-default-pool-node5-pzmc   asia-southeast1-c   10.148.0.6
    regional-cluster-1-default-pool-node6-qf1l   asia-southeast1-c   10.148.0.7
    regional-cluster-1-default-pool-node2-dlk2   asia-southeast1-a   10.148.0.8
    regional-cluster-1-default-pool-node1-pkfd   asia-southeast1-a   10.148.0.9
    regional-cluster-1-default-pool-node3-6b6n   asia-southeast1-b   10.148.0.5
    regional-cluster-1-default-pool-node4-h0lc   asia-southeast1-b   10.148.0.4
    

    이 출력 예시에서 모든 Cymbal Bank 포드는 같은 클러스터의 모든 영역에 배포되고 기존 default-pool에서 실행됩니다.

  2. 단일 영역 노드 풀 2개를 새로 만듭니다.

    gcloud beta container node-pools create zonal-node-pool-1 \
      --cluster CLUSTER_NAME \
      --region REGION \
      --num-nodes 4 \
      --node-locations ZONE_A
    
    gcloud beta container node-pools create zonal-node-pool-2 \
        --cluster CLUSTER_NAME \
        --region REGION \
        --num-nodes 4 \
        --node-locations ZONE_B
    

    ZONE_AZONE_B를 새 단일 영역 노드 풀을 실행할 두 영역으로 바꿉니다.

  3. 영역 장애를 시뮬레이션하려면 default-pool 리전 노드 풀과 새 단일 영역 노드 풀 중 하나를 삭제합니다.

    gcloud container node-pools delete default-pool \
        --cluster=CLUSTER_NAME \
        --region=REGION
    
    gcloud container node-pools delete zonal-node-pool-1 \
        --cluster=CLUSTER_NAME \
        --region=REGION
    

    node-pool 삭제 프로세스 중에 워크로드가 종료되고 사용 가능한 다른 노드 풀로 다시 예약됩니다. 이 프로세스가 발생하면 서비스와 배포를 사용할 수 없습니다. 이러한 동작으로 인해 DR 보고 또는 문서에 다운타임 기간을 지정해야 합니다.

    마이크로서비스를 계속 사용할 수 있는지 확인합니다.

    kubectl get po -o wide \
    kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    다음 예시와 비슷한 출력이 표시됩니다.

    NAME                                  ZONE                INT_IP
    regional-cluster-1-node-pool3-node1   asia-southeast1-b   10.148.0.8
    regional-cluster-1-node-pool3-node2   asia-southeast1-b   10.148.0.9
    regional-cluster-1-node-pool3-node3   asia-southeast1-b   10.148.0.5
    regional-cluster-1-node-pool3-node4   asia-southeast1-b   10.148.0.4
    
    NAME                                  READY   STATUS    RESTARTS   AGE     IP          NODE
    accounts-db-0                         1/1     Running   0          28m     10.28.1.5   regional-cluster-1-zonal-node-pool-2-node3
    balancereader-7dc7d9ff57-shwg5        1/1     Running   0          28m     10.28.5.6   regional-cluster-1-zonal-node-pool-2-node1
    contacts-7ddc76d94-qv4x5              1/1     Running   0          28m     10.28.4.6   regional-cluster-1-zonal-node-pool-2-node2
    frontend-747b84bff4-mdnkd             1/1     Running   0          9m21s   10.28.1.7   regional-cluster-1-zonal-node-pool-2-node3
    ledger-db-0                           1/1     Running   0          28m     10.28.5.7   regional-cluster-1-zonal-node-pool-2-node4
    ledgerwriter-f6cc7889d-mttmb          1/1     Running   0          28m     10.28.1.6   regional-cluster-1-zonal-node-pool-2-node3
    loadgenerator-57d4cb57cc-7fvrc        1/1     Running   0          28m     10.28.4.7   regional-cluster-1-zonal-node-pool-2-node2
    transactionhistory-5dd7c7fd77-w2vqs   1/1     Running   0          9m20s   10.28.4.8   regional-cluster-1-zonal-node-pool-2-node2
    userservice-cd5ddb4bb-zfr2g           1/1     Running   0          28m     10.28.5.8   regional-cluster-1-zonal-node-pool-2-node1
    

    이 출력 예시에서는 default-poolzonal-node-pool-1이 더 이상 존재하지 않으므로 모든 서비스가 zonal-node-pool-2에서 실행됩니다.

영역의 노드 차단 및 드레이닝

이 섹션에서는 클러스터에서 특정 노드를 차단하고 드레이닝합니다. 단일 영역에서 모든 노드를 차단하고 드레이닝하여 영역의 해당 노드에서 실행되는 포드의 손실을 시뮬레이션합니다.

부하 분산기는 영역 3개에서 실행되는 리전 클러스터로 트래픽을 전달합니다. 영역마다 노드 2개가 포함되며 Cymbal Bank 샘플 애플리케이션 포드는 모든 영역과 노드에서 실행됩니다.

이 다이어그램에서는 첫 번째 영역의 노드를 차단하고 드레이닝합니다. 다른 두 영역의 노드는 계속 실행됩니다. 이 방식은 포드와 트래픽을 다른 영역에서 실행되는 노드에 올바르게 재배포하여 애플리케이션에서 한 영역의 모든 노드 손실에 대응할 수 있는지 확인합니다.

영역 중 하나에서 노드를 차단하고 드레이닝하여 장애를 시뮬레이션하려면 다음 단계를 완료합니다.

  1. 리전 클러스터와 서비스의 가용성을 확인합니다. 대상 장애 영역의 노드 이름을 확인합니다. 프런트엔드 포드가 실행되는 영역을 지정하려고 합니다.

    kubectl get pods -o wide
    

    출력은 다음 예시와 같이 표시됩니다.

    NAME                                  READY   STATUS    RESTARTS   AGE     IP           NODE
    accounts-db-0                         1/1     Running   0          4m7s    10.96.4.4    regional-cluster-1-default-pool-node2
    balancereader-7dc7d9ff57-lv4z7        1/1     Running   0          4m7s    10.96.1.5    regional-cluster-1-default-pool-node1
    contacts-7ddc76d94-wxvg5              1/1     Running   0          4m7s    10.96.6.11   regional-cluster-1-default-pool-node3
    frontend-747b84bff4-gvktl             1/1     Running   0          4m7s    10.96.1.4    regional-cluster-1-default-pool-node1
    ledger-db-0                           1/1     Running   0          4m7s    10.96.4.5    regional-cluster-1-default-pool-node2
    ledger-db-1                           1/1     Running   0          3m50s   10.96.0.13   regional-cluster-1-default-pool-node5
    ledgerwriter-f6cc7889d-4hqbm          1/1     Running   0          4m6s    10.96.0.12   regional-cluster-1-default-pool-node5
    loadgenerator-57d4cb57cc-fmq52        1/1     Running   0          4m6s    10.96.4.6    regional-cluster-1-default-pool-node2
    transactionhistory-5dd7c7fd77-72zpx   1/1     Running   0          4m6s    10.96.6.12   regional-cluster-1-default-pool-node3
    userservice-cd5ddb4bb-b7862           1/1     Running   0          4m6s    10.96.1.6    regional-cluster-1-default-pool-node1
    
  2. 이전 출력에 나열된 포드를 노드의 영역과 연결합니다.

    kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    출력은 다음 예시와 같이 표시됩니다.

    NAME                                    ZONE                INT_IP
    regional-cluster-1-default-pool-node1   asia-southeast1-b   10.148.0.41
    regional-cluster-1-default-pool-node2   asia-southeast1-b   10.148.0.42
    regional-cluster-1-default-pool-node3   asia-southeast1-a   10.148.0.37
    regional-cluster-1-default-pool-node4   asia-southeast1-a   10.148.0.38
    regional-cluster-1-default-pool-node5   asia-southeast1-c   10.148.0.40
    regional-cluster-1-default-pool-node6   asia-southeast1-c   10.148.0.39
    

    이전 출력 예시에서 프런트엔드 포드는 asia-southeast1-b 영역의 regional-cluster-1-default-pool-node1에 있습니다.

    다음 단계에서는 asia-southeast1-b 영역(이 출력 예시에서는 regional-cluster-1-default-pool-node1regional-cluster-1-default-pool-node2)의 모든 노드를 추적합니다.

  3. 영역 중 하나에서 대상 노드를 차단하고 드레이닝합니다. 이 예시에서는 asia-southeast1-b의 노드 2개입니다.

    kubectl drain regional-cluster-1-default-pool-node1 \
        --delete-emptydir-data --ignore-daemonsets
    
    kubectl drain regional-cluster-1-default-pool-node2 \
        --delete-emptydir-data --ignore-daemonsets
    

    이 명령어는 노드를 예약할 수 없는 것으로 표시하고 노드 장애를 시뮬레이션합니다. Kubernetes는 포드를 작동 영역의 다른 노드로 다시 예약합니다.

  4. 이전에 장애 영역의 노드에서 실행되었던 새 프런트엔드 포드와 기타 Cymbal Bank 포드 예시가 이제 어디에서 다시 예약되었는지 확인합니다.

    kubectl get po -o wide
    kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    출력은 다음 예시와 같이 표시됩니다.

    NAME                                  READY   STATUS    RESTARTS   AGE     IP           NODE
    accounts-db-0                         1/1     Running   0          4m7s    10.96.4.4    regional-cluster-1-default-pool-node4
    balancereader-7dc7d9ff57-lv4z7        1/1     Running   0          4m7s    10.96.1.5    regional-cluster-1-default-pool-node6
    contacts-7ddc76d94-wxvg5              1/1     Running   0          4m7s    10.96.6.11   regional-cluster-1-default-pool-node3
    frontend-747b84bff4-gvktl             1/1     Running   0          4m7s    10.96.1.4    regional-cluster-1-default-pool-node3
    ledger-db-0                           1/1     Running   0          4m7s    10.96.4.5    regional-cluster-1-default-pool-node6
    ledger-db-1                           1/1     Running   0          3m50s   10.96.0.13   regional-cluster-1-default-pool-node5
    ledgerwriter-f6cc7889d-4hqbm          1/1     Running   0          4m6s    10.96.0.12   regional-cluster-1-default-pool-node5
    loadgenerator-57d4cb57cc-fmq52        1/1     Running   0          4m6s    10.96.4.6    regional-cluster-1-default-pool-node4
    transactionhistory-5dd7c7fd77-72zpx   1/1     Running   0          4m6s    10.96.6.12   regional-cluster-1-default-pool-node3
    userservice-cd5ddb4bb-b7862           1/1     Running   0          4m6s    10.96.1.6    regional-cluster-1-default-pool-node3
    
    NAME                                    ZONE                INT_IP
    regional-cluster-1-default-pool-node3   asia-southeast1-a   10.148.0.37
    regional-cluster-1-default-pool-node4   asia-southeast1-a   10.148.0.38
    regional-cluster-1-default-pool-node5   asia-southeast1-c   10.148.0.40
    regional-cluster-1-default-pool-node6   asia-southeast1-c   10.148.0.39
    

    이 출력 예시에는 차단된 노드에서 실행되는 Cymbal Bank 포드 예시가 없으며 이제 모든 포드가 다른 두 영역에서만 실행됩니다.

    노드의 포드 중단 예산(PDB)으로 인해 노드 드레이닝이 차단될 수 있습니다. 차단 및 드레이닝 작업 전에 PDB 정책을 평가합니다. PDB 및 중단 관리와의 관계에 대한 자세한 내용은 GKE 클러스터의 신뢰성과 업타임을 보장하는 방법을 참조하세요.

삭제

이 튜토리얼에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 안내를 따르세요.

프로젝트 삭제

청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

다음 단계