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. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud CLI를 설치합니다.
  3. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  4. Google Cloud 프로젝트를 만들거나 선택합니다.

    • Google Cloud 프로젝트를 만듭니다.

      gcloud projects create PROJECT_ID

      PROJECT_ID를 만들려는 Google Cloud 프로젝트의 이름으로 바꿉니다.

    • 만든 Google Cloud 프로젝트를 선택합니다.

      gcloud config set project PROJECT_ID

      PROJECT_ID를 Google Cloud 프로젝트 이름으로 바꿉니다.

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

  6. Kubernetes Engine API, Compute Engine API를 사용 설정합니다.

    gcloud services enable container.googleapis.com compute.googleapis.com
  7. Google Cloud CLI를 설치합니다.
  8. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  9. Google Cloud 프로젝트를 만들거나 선택합니다.

    • Google Cloud 프로젝트를 만듭니다.

      gcloud projects create PROJECT_ID

      PROJECT_ID를 만들려는 Google Cloud 프로젝트의 이름으로 바꿉니다.

    • 만든 Google Cloud 프로젝트를 선택합니다.

      gcloud config set project PROJECT_ID

      PROJECT_ID를 Google Cloud 프로젝트 이름으로 바꿉니다.

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

  11. Kubernetes Engine API, Compute Engine API를 사용 설정합니다.

    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. 이전 섹션에서 만든 GKE 클러스터에 Cymbal Bank 샘플 애플리케이션을 배포합니다.

    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개의 노드 풀에서 실행되는 리전 클러스터로 트래픽을 전달합니다. 기본 노드 풀은 모든 영역에서 실행되며 다른 두 노드 풀은 각각 단일 영역에서 실행됩니다.

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

  • 일반적으로 리전 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의 두 노드입니다.

    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 및 PDB와 중단 관리와의 관계에 대한 자세한 내용은 GKE 클러스터의 안정성과 업타임을 보장하는 방법을 참조하세요.

삭제

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

프로젝트 삭제

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

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계