Simula una falla de zona en clústeres regionales de GKE

Un requisito normativo común es que una empresa pueda demostrar su capacidad de recuperación ante desastres (DR). Para las aplicaciones que se ejecutan en la nube, este requisito incluye la confiabilidad y la disponibilidad de los servicios cuando los servidores alojados en una zona dejan de estar disponibles durante un período. Este documento está dirigido a los administradores y arquitectos, operadores y administradores de copias de seguridad y recuperación ante desastres (DR) que deseen aprender a simular una conmutación por error de zona cuando se usa un clúster regional Standard de Google Kubernetes Engine (GKE).

Los clústeres regionales de GKE se crean en la región elegida por el usuario y ejecutan el plano de control en las VMs ubicadas en varias zonas dentro de la región elegida. Los clústeres de GKE Autopilot siempre son regionales y los clústeres de GKE Standard pueden ser regionales o zonales. En este instructivo, se usa un clúster regional de GKE Standard. Los nodos del clúster se comunican con el plano de control a través de un balanceador de cargas, lo que significa que la ubicación del nodo y la ubicación de la VM del plano de control no siempre coinciden. En la consola deGoogle Cloud , no puedes inhabilitar una zona en particular cuando usas un clúster regional. Para obtener más información, consulta Arquitectura del clúster de GKE.

En este instructivo, se proporcionan tres métodos diferentes para simular una falla de zona. Puedes simular una falla de zona y verificar la respuesta correcta de la aplicación con el método necesario para tus propios fines de cumplimiento.

Los métodos de este documento también se aplican a los clústeres zonales, incluidos los de una zona o de varias zonas. Estos métodos solo afectan a los nodos en las zonas de destino y el plano de control de GKE no se ve afectado.

Objetivos

  • Crear un clúster de GKE Standard regional a través de la configuración predeterminada.
  • Implementar una aplicación de microservicios de muestra en el clúster regional.
  • Simular una interrupción de zona a través de uno de los siguientes tres métodos:
    • Reducir las zonas del grupo de nodos en un clúster regional.
    • Usar un grupo de nodos de zona única.
    • Acordonar y desviar los nodos de la zona con fallas de destino.
  • Verificar la disponibilidad de los microservicios.

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

  • Compute Engine
  • Clúster del modo GKE Standard

Usa la calculadora de precios para generar una estimación de los costos según el uso previsto.

Antes de comenzar

  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. Si usas un proveedor de identidad externo (IdP), primero debes acceder a gcloud CLI con tu identidad federada.

  4. Para inicializar gcloud CLI, ejecuta el siguiente comando:

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • 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.

  6. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable container.googleapis.com compute.googleapis.com
  8. Install the Google Cloud CLI.

  9. Si usas un proveedor de identidad externo (IdP), primero debes acceder a gcloud CLI con tu identidad federada.

  10. Para inicializar gcloud CLI, ejecuta el siguiente comando:

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • 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.

  12. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable container.googleapis.com compute.googleapis.com
  14. Crea un clúster de Standard regional

    Antes de simular una falla de zona, crea un clúster regional con un grupo de nodos multizonal. El plano de control y los nodos del clúster se replican en varias zonas de la región especificada.

    Usa Google Cloud CLI para crear el clúster:

    1. Crea un clúster de GKE Standard nuevo a través de la configuración predeterminada:

      gcloud container clusters create CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION \
        --num-nodes 2
      

      Reemplaza los siguientes parámetros:

      • CLUSTER_NAME: el nombre de tu clúster.
      • CONTROL_PLANE_LOCATION: Es la región de Compute Engine del plano de control de tu clúster, como us-central1.

      GKE se tarda unos minutos en crear el clúster y verificar que todo funcione correctamente. Se crean dos nodos en cada zona de la región que especifiques.

    2. Verifica las zonas de cada nodo creadas en el paso anterior:

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

      El resultado se ve como en el siguiente ejemplo:

      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. Conéctate al clúster:

      gcloud container clusters get-credentials CLUSTER_NAME \
          --location CONTROL_PLANE_LOCATION
      

    Implementa una aplicación de microservicios de muestra

    Para ver el efecto de la conmutación por error simulada en este documento, implementa una aplicación de muestra basada en microservicios en tu clúster. En este documento, usarás la aplicación de muestra de Cymbal Bank:

    1. En tu shell, clona el repositorio de GitHub y cámbialo al directorio:

      git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
      cd bank-of-anthos/
      
    2. Implementa la aplicación de muestra de Cymbal Bank en el clúster de GKE que creaste en la sección anterior:

      kubectl apply -f ./extras/jwt/jwt-secret.yaml
      kubectl apply -f ./kubernetes-manifests
      
    3. Espera a que los Pods estén listos.

      kubectl get pods
      
    4. Después de unos minutos, deberías ver los Pods en el estado 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. Cuando todos los Pods estén en estado Running, obtén la dirección IP externa del servicio de frontend:

      kubectl get service frontend | awk '{print $4}'
      
    6. En una ventana del navegador web, abre la dirección IP que se muestra en el resultado del comando kubectl get service para acceder a tu instancia de Cymbal Bank.

      Las credenciales predeterminadas se propagan automáticamente, de modo que puedas acceder a la app y explorar algunas de las transacciones y los saldos de muestra. No hay que realizar ninguna acción específica, excepto para confirmar que Cymbal Bank se ejecuta de forma correcta. Es posible que todos los objetos Service demoren uno o dos minutos en iniciarse de forma correcta y permitirte acceder. Espera hasta que todos los Pods estén en estado Running y puedas acceder de forma correcta al sitio de Cymbal Bank antes de pasar a la siguiente sección y simular una falla de zona.

    Simula una falla de zona

    En esta sección, debes simular una falla con una de las zonas. Existen tres formas diferentes de simular esta conmutación por error. Solo debes elegir un método. Simula una falla de zona y verifica la respuesta correcta de la aplicación a través del método que se requiera para tus propios fines de cumplimiento.

    Reduce las zonas del grupo de nodos

    De forma predeterminada, un grupo de nodos de un clúster regional tiene nodos que abarcan todas las zonas de su región. En el siguiente diagrama, Cloud Load Balancing distribuye el tráfico a un grupo de nodos que abarca tres zonas. Cada zona tiene dos nodos y los Pods pueden ejecutarse en nodos en cualquiera de estas zonas.

    Un balanceador de cargas dirige el tráfico a un clúster regional que se ejecuta en tres zonas. Cada zona tiene dos nodos.

    En esta sección, debes simular una falla de zona a través de la actualización del grupo de nodos para que solo se ejecute en dos de cada tres zonas. En este enfoque, se verifica que tu aplicación pueda responder a la pérdida de una zona a través de la distribución correcta de los Pods y el tráfico en otras zonas.

    Para actualizar el grupo de nodos para que solo se ejecute en ciertas zonas y simule fallas, completa los siguientes pasos:

    1. Verifica la disponibilidad del clúster regional y los objetos Service:

      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'
      

      El resultado es similar al siguiente resultado de ejemplo:

      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
      

      En este ejemplo, todas las cargas de trabajo de Cymbal Bank se implementan en todas las zonas. Para simular una falla, inhabilita una de las zonas, como asia-southeast1-c, en la que se implementa el servicio de frontend.

    2. Simula una interrupción de zona. Actualiza el grupo de nodos existente (default-pool) para especificar solo dos zonas de las tres zonas:

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

      Reemplaza ZONE_A, ZONE_B por las dos zonas en las que deseas que el grupo de nodos siga ejecutándose.

    3. Verifica la disponibilidad de los microservicios después de actualizar el grupo de nodos:

      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'
      

      El resultado debería verse como el siguiente ejemplo:

      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
      

      En este resultado de ejemplo, asia-southeast1-c ya no está en uso. Aún se puede acceder al servicio de frontend al que accedes desde un navegador con la URL http://EXTERNAL_IP. Un usuario aún podría realizar acciones de depósito y pago, aunque una de las zonas ya no esté disponible.

    Usa un grupo de nodos de zona única

    En esta sección, debes simular una falla de zona a través de la eliminación de dos de los grupos de nodos. En este enfoque, se verifica que tu aplicación pueda responder a la pérdida de un grupo de nodos a través de la distribución correcta de los Pods y el tráfico en un grupo de nodos en otra zona. Para simular una interrupción zonal en un clúster regional, expande el clúster básico creado anteriormente con la ejecución de la aplicación de Cymbal Bank en varios grupos de nodos. Este método de simulación de la interrupción zonal refleja mejor una falla de zona real que el primer ejemplo de actualización de zonas activas en un grupo de nodos, ya que es más común que existan varios grupos de nodos en un clúster:

    Un balanceador de cargas dirige el tráfico a un clúster regional que se ejecuta en tres grupos de nodos. El grupo de nodos predeterminado se ejecuta en todas las zonas y los otros dos grupos de nodos se ejecutan cada uno en una sola zona.

    El clúster que compilas en esta sección para simular una falla del grupo de nodos de zona única incluye los siguientes componentes:

    • Grupo de nodos predeterminado, por lo general, se crea cuando creas un clúster de GKE Standard regional, que es un grupo de nodos de varias zonas (default-pool).

      Este clúster con el default-pool único es el que creaste antes en este documento.

    • Grupos de nodos adicionales (zonal-node-pool-1 y zonal-node-pool-2) que también ejecutan servicios para la aplicación de ejemplo de Cymbal Bank.

    En las líneas de puntos del diagrama, se muestra cómo el tráfico solo entrega zonal-node-pool-2 después de simular una falla en default-pool y zonal-node-pool-1.

    Para crear grupos de nodos adicionales y simular fallas, completa los siguientes pasos:

    1. Comprueba la disponibilidad del clúster regional:

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

      El resultado es similar al siguiente resultado de ejemplo:

      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
      

      En este resultado de ejemplo, todos los Pods de Cymbal Bank se implementan en todas las zonas del mismo clúster y se ejecutan en el default-pool existente.

    2. Crea dos grupos de nodos nuevos de zona única:

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

      Reemplaza ZONE_A y ZONE_B por las dos zonas en las que deseas que se ejecuten los grupos de nodos nuevos de zona única.

    3. Para simular una falla de zona, borra el grupo de nodos regional default-pool y uno de los grupos de nodos nuevos de zona única:

      gcloud container node-pools delete default-pool \
          --cluster=CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION
      
      gcloud container node-pools delete zonal-node-pool-1 \
          --cluster=CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION
      

      Durante el proceso de eliminación de node-pool, las cargas de trabajo se cierran y se vuelven a programar en otro grupo de nodos disponible. Cuando ocurre este proceso, los objetos Service y Deployment no están disponibles. Este comportamiento significa que los períodos de tiempo de inactividad deben especificarse para la documentación o los informes de DR.

      Verifica la disponibilidad continua de los microservicios:

      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'
      

      El resultado debería ser similar al siguiente ejemplo:

      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
      

      En este resultado de ejemplo, como default-pool y zonal-node-pool-1 ya no existen, todos los objetos Service se ejecutan en zonal-node-pool-2.

    Acordona y desvía nodos en una zona

    En esta sección, acordonarás y desviarás nodos específicos del clúster. Acordona y desvía todos los nodos en una sola zona, lo que simula la pérdida de los Pods que se ejecutan en esos nodos en toda la zona:

    Un balanceador de cargas dirige el tráfico a un clúster regional que se ejecuta en tres zonas. Cada zona contiene dos nodos, y los Pods de la aplicación de muestra de Cymbal Bank se ejecutan en todas las zonas y los nodos.

    En este diagrama, acordonas y desvías los nodos de la primera zona. Los nodos de las otras dos zonas continúan ejecutándose. Este enfoque verifica que tu aplicación pueda responder a la pérdida de todos los nodos en una zona a través de la distribución correcta de los Pods y el tráfico en los nodos que se ejecutan en otras zonas.

    Para acordonar y desviar los nodos en una de las zonas, simulando fallas, completa los siguientes pasos:

    1. Comprueba la disponibilidad del clúster regional y los objetos Service. Observa los nombres de los nodos de la zona de falla de destino. Deseas especificar una zona en la que se ejecutan los Pods de frontend:

      kubectl get pods -o wide
      

      El resultado debería verse como el siguiente ejemplo:

      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. Asocia los Pods enumerados en el resultado anterior con la zona del nodo:

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

      El resultado debería verse como el siguiente ejemplo:

      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
      

      En el resultado del ejemplo anterior, los Pods de frontend se encuentran en regional-cluster-1-default-pool-node1 en la zona asia-southeast1-b.

      En el siguiente paso, rastrearás todos los nodos en la zona asia-southeast1-b, que en este resultado de ejemplo son regional-cluster-1-default-pool-node1 y regional-cluster-1-default-pool-node2.

    3. Acordona y desvía los nodos de destino en una de las zonas. En este ejemplo, esos son los dos nodos en 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
      

      Este comando marca los nodos como no programables y simula fallas en los nodos. Kubernetes reprograma los Pods en otros nodos en zonas de funcionamiento.

    4. Observa dónde se reprogramaron los nuevos Pods de frontend y otros Pods de Cymbal Bank que antes se ejecutaban en el nodo en la zona con fallas:

      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'
      

      El resultado debería verse como el siguiente ejemplo:

      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
      

      En este resultado de ejemplo, no hay Pods de Cymbal Bank que se ejecuten en nodos acordonados y todos los Pods solo se ejecutan en las otras dos zonas.

      Los presupuestos de interrupción de Pods (PDB) en los nodos pueden bloquear el desvío de nodos. Evalúa las políticas de PDB antes de la acción de acordonar y desviar. Para obtener más información acerca de PDB y su relación con la administración de interrupciones, consulta cómo garantizar la confiabilidad y el tiempo de actividad de tu clúster de GKE.

    Limpia

    Para evitar que se generen cargos en tu Google Cloud cuenta por los recursos que usaste en este instructivo, sigue estos pasos:

    Borra el proyecto

    La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    ¿Qué sigue?