Resuelve problemas de Cloud Service Mesh administrado

En este documento, se explican los problemas comunes de Cloud Service Mesh y cómo resolverlos. Por ejemplo, cuando se inserta un pod con istio.istio-system, la herramienta de instalación genera errores como los códigos de estado 400 HTTP y en la membresía del clúster.

Si necesitas asistencia adicional para solucionar problemas de Cloud Service Mesh, consulta Obtén asistencia.

Las revisiones se informan como un error de estado incorrecto

Es posible que veas un error Revision(s) reporting unhealthy genérico si el agente de servicio de Cloud Service Mesh administrado no tiene el rol de Identity and Access Management (IAM) requerido. Por lo general, esto ocurre cuando Terraform, Puppet o la reconfiguración de CI/CD revocan el rol.

Los pasos necesarios para solucionar este error dependen de si usas la consola de Google Cloud o Google Cloud CLI.

Consola de Google Cloud

  1. En la consola de Google Cloud, navega a IAM y administración > IAM.

  2. Selecciona Incluir asignaciones de roles proporcionadas por Google.

  3. Revisa la lista Principal.

    Si ves el agente de servicio con el rol de IAM requerido en la lista, significa que está configurado correctamente.

    Si la lista no incluye el agente de servicio y el rol requerido, sigue con el siguiente paso.

  4. Otorga el rol de agente de servicio de Anthos Service Mesh (roles/anthosservicemesh.serviceAgent) al agente de servicio de Cloud Service Mesh en el proyecto. Para obtener instrucciones, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Google Cloud CLI

  1. En Google Cloud CLI, ejecuta el siguiente comando para verificar si se otorgó el rol de IAM requerido:

    gcloud projects get-iam-policy PROJECT_ID  \
    --flatten="bindings[].members" \
    --filter="bindings.members:serviceAccount:service-PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com AND bindings.role:roles/anthosservicemesh.serviceAgent" \
    --format='table(bindings.role)'
    
  2. Revisa la lista de ROLE.

    Si ves algún rol en la lista, significa que está configurado correctamente.

    Si no ves ningún rol en la lista, significa que se revocó el rol requerido.

  3. Para otorgar el rol requerido al agente de servicio, ejecuta el siguiente comando:

     gcloud projects add-iam-policy-binding PROJECT_ID \
     --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com" \
     --role="roles/anthosservicemesh.serviceAgent"
    

La herramienta de instalación genera errores HTTP 400

La herramienta de instalación puede generar errores HTTP 400, como los siguientes:

HealthCheckContainerError, message: Cloud Run error: Container failed to start.
Failed to start and then listen on the port defined by the PORT environment
variable. Logs for this revision might contain more information.

Este error puede ocurrir si no habilitaste Workload Identity en tu clúster de Kubernetes, lo que puedes hacer con el siguiente comando:

export CLUSTER_NAME=...
export PROJECT_ID=...
export LOCATION=...
gcloud container clusters update $CLUSTER_NAME --zone $LOCATION \
    --workload-pool=$PROJECT_ID.svc.id.goog

Estado del plano de datos administrado

Con el siguiente comando, se muestra el estado del plano de datos administrado:

gcloud container fleet mesh describe --project PROJECT_ID

En la siguiente tabla, se enumeran todos los estados posibles del plano de datos administrado:

State Code Descripción
ACTIVE OK El plano de datos administrado se ejecuta con normalidad.
DISABLED DISABLED El plano de datos administrado estará en este estado si no se configuró ningún espacio de nombres o revisión para usarlo. Sigue las instrucciones para habilitar Cloud Service Mesh administrado a través de la API de Fleet o habilitar el plano de datos administrado después de aprovisionar Cloud Service Mesh administrado con asmcli. Ten en cuenta que el informe de estado del plano de datos administrado solo está disponible si habilitaste el plano de datos administrado mediante la anotación de un espacio de nombres o una revisión. Anotar pods individuales hace que esos pods se administren, pero que tengan un estado de función DISABLED si no se anotan espacios de nombres ni revisiones.
FAILED_PRECONDITION MANAGED_CONTROL_PLANE_REQUIRED El plano de datos administrado requiere un plano de control activo de Cloud Service Mesh.
PROVISIONING PROVISIONING Se está aprovisionando el plano de datos administrado. Si este estado persiste por más de 10 minutos, es probable que se haya producido un error y deberías comunicarte con el equipo de asistencia.
STALLED INTERNAL_ERROR El plano de datos administrado está bloqueado debido a una condición de error interna. Si el problema persiste, comunícate con el equipo de asistencia.
NEEDS_ATTENTION UPGRADE_FAILURES El plano de datos administrado requiere una intervención manual para que el servicio vuelva al estado normal. Para obtener más información y cómo resolver este problema, consulta el estado NEEDS_ATTENTION.

NEEDS_ATTENTION state

Si el comando gcloud container fleet mesh describe muestra que el estado del plano de datos administrado está en estado NEEDS_ATTENTION y el código es UPGRADE_FAILURES, el plano de datos administrado no pudo actualizar ciertas cargas de trabajo. El servicio del plano de datos administrado etiquetará estas cargas de trabajo con dataplane-upgrade: failed para analizarlas en detalle. Los proxies se deben reiniciar de forma manual para que se actualicen. Para obtener la lista de Pods que requieren atención, ejecuta el siguiente comando:

kubectl get pods --all-namespaces -l dataplane-upgrade=failed

Error de membresía del clúster (no se especificó ningún proveedor de identidad)

La herramienta de instalación puede fallar con errores de membresía del clúster como los siguientes:

asmcli: [ERROR]: Cluster has memberships.hub.gke.io CRD but no identity
provider specified. Please ensure that an identity provider is available for the
registered cluster.

El error puede ocurrir si no tienes Workload Identity de GKE habilitada antes de registrar el clúster. Puedes volver a registrar el clúster en la línea de comandos con el comando gcloud container fleet memberships register --enable-workload-identity.

Verifica el estado del plano de control administrado

Para verificar el estado del plano de control administrado, ejecuta gcloud container fleet mesh describe --project FLEET_PROJECT_ID.

En la respuesta, el campo membershipStates[].servicemesh.controlPlaneManagement.details podría explicar el error específico.

Si necesitas más detalles, consulta el recurso personalizado ControlPlaneRevision en el clúster, que se actualiza cuando se aprovisiona el plano de control administrado o falla en el aprovisionamiento.

Para inspeccionar el estado del recurso, reemplaza NAME por el valor correspondiente a cada canal: asm-managed, asm-managed-stable o asm-managed-rapid.

kubectl describe controlplanerevision NAME -n istio-system

El resultado es similar al siguiente:

    Name:         asm-managed

    …

    Status:
      Conditions:
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               The provisioning process has completed successfully
        Reason:                Provisioned
        Status:                True
        Type:                  Reconciled
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               Provisioning has finished
        Reason:                ProvisioningFinished
        Status:                True
        Type:                  ProvisioningFinished
        Last Transition Time:  2021-08-05T18:56:32Z
        Message:               Provisioning has not stalled
        Reason:                NotStalled
        Status:                False
        Type:                  Stalled

La condición Reconciled determina si el plano de control administrado se ejecuta de forma correcta. Si es true, el plano de control se ejecuta de forma correcta. Stalled determina si el proceso de aprovisionamiento del plano de control administrado encontró un error. Si es Stalled, el campo Message contiene más información sobre el error específico. Consulta Códigos detenidos para obtener más información sobre posibles errores.

Códigos detenidos de ControlPlaneRevision

Hay varias razones por las que la condición Stalled podría convertirse en verdadera en el estado ControlPlaneRevisions.

Motivo Mensaje Descripción
PreconditionFailed Solo se admiten las membresías de GKE, pero ${CLUSTER_NAME} no es un clúster de GKE. Parece que el clúster actual no es un clúster de GKE. El plano de control administrado solo funciona en los clústeres de GKE.
Nombre de ControlPlaneRevision no admitido: ${NAME} El nombre de ControlPlaneRevision debe ser uno de los siguientes:
  • asm-managed
  • asm-managed-rapid
  • asm-managed-stable
Unsupported ControlPlaneRevision namespace: ${NAMESPACE} El espacio de nombres de ControlPlaneRevision debe ser istio-system.
El canal ${Channel} no se admite para ControlPlaneRevision con el nombre${NAME}. Se esperaba ${OTHER_Channel} El nombre de ControlControleRevision debe coincidir con el canal de ControlPlaneRevision en función de la siguiente información:
  • asm-managed -> regular
  • asm-managed-rapid -> rapid
  • asm-managed-stable -> stable
No se debe omitir el canal ni dejarlo en blanco Channel es un campo obligatorio en ControlPlaneRevision. Falta en el recurso personalizado o está vacío.
Tipo de revisión del plano de control no compatible: ${TYPE} managed_service es el único campo de permiso para el campo ControlPlaneRevisionType.
Versión de Kubernetes no compatible: ${VERSION} Las versiones de Kubernetes 1.15 y posteriores son compatibles.
La identidad de carga de trabajo no está habilitada. Habilita la identidad de carga de trabajo en el clúster.
Grupo de cargas de trabajo no compatible: ${POOL} El grupo de cargas de trabajo debe tener el formato ${PROJECT_ID}.svc.id.goog.
ProvisioningFailed Se produjo un error mientras se actualizaban los recursos del clúster Google no pudo actualizar los recursos en el clúster, como los CRD y los webhooks.
MutatingWebhookConfiguration "istiod-asm-managed" contiene un webhook con la URL ${EXISTING_URL}, pero se espera ${EXPECTED_URL} Google no reemplazará los webhooks existentes para evitar que se rompa la instalación. Actualiza esto de forma manual si deseas tener un comportamiento deseado.
ValidingWebhookConfiguration ${NAME} contiene un webhook con la URL ${EXISTING_URL}, pero se espera ${EXPECTED_URL} Google no reemplazará los webhooks existentes para evitar que se rompa la instalación. Actualiza esto de forma manual si deseas tener un comportamiento deseado.

Cloud Service Mesh administrado no puede conectarse al clúster de GKE

Entre junio y septiembre de 2022, Google completó el trabajo de seguridad relacionado con las redes autorizadas, Cloud Run y las funciones de Cloud Run en Google Kubernetes Engine (GKE). Los proyectos que anteriormente usaban la versión administrada de Service Mesh de Cloud, pero que dejaron de usarla antes de la migración, no tienen la API necesaria para la comunicación entre Cloud Run y GKE.

En esta situación, fallará el aprovisionamiento de Cloud Service Mesh administrado y Cloud Logging mostrará el siguiente mensaje de error:

Connect Gateway API has not been used in project [*PROJECT_NUMBER*] before or it is disabled.
Enable it by visiting https://console.developers.google.com/apis/api/connectgateway.googleapis.com/overview?project=[*PROJECT_NUMBER*] then retry.
If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

Filtra este mensaje con la siguiente consulta:

resource.type="istio_control_plane"
resource.labels.project_id=[*PROJECT_ID*]
resource.labels.location=[*REGION*]
severity=ERROR
jsonPayload.message=~"Connect Gateway API has not been used in project"

Mientras tanto, la inserción de Sidecar y la implementación de cualquier recurso personalizado de Kubernetes relacionado con Cloud Service Mesh también fallarán, y Cloud Logging mostrará el siguiente mensaje de advertencia:

Error creating: Internal error occurred: failed calling webhook
"rev.namespace.sidecar-injector.istio.io": failed to call webhook: an error on
the server ("unknown") has prevented the request from succeeding.

Filtra este mensaje con la siguiente consulta:

resource.type="k8s_cluster"
resource.labels.project_id=[*PROJECT_ID*]
resource.labels.location=[*REGION*]
resource.labels.cluster_name=[*CLUSTER_NAME*]
severity=WARNING
jsonPayload.message=~"Internal error occurred: failed calling webhook"

Para resolver el problema, sigue estos pasos:

  1. Habilita la API de connectgateway necesaria:

     gcloud services enable connectgateway.googleapis.com --project=[*PROJECT_ID*]
    
  2. Vuelve a instalar Cloud Service Mesh administrada.

  3. Realiza un reinicio progresivo en las cargas de trabajo.

Las APIs de Google Cloud no están habilitadas

Si tu flota administrada de Cloud Service Mesh usa la implementación del plano de control de TRAFFIC_DIRECTOR, se deben habilitar ciertas APIs.

  1. Habilita todas las APIs requeridas, incluidas las que aparecen como "Se puede inhabilitar" cuando no se usa la malla de servicios de Cloud administrada.

    gcloud services enable --project=[*PROJECT_ID*] \
        trafficdirector.googleapis.com \
        networkservices.googleapis.com \
        networksecurity.googleapis.com
    
  2. Asegúrate de no tener herramientas automatizadas que reviertan este cambio. Si el error se repite, actualiza las configuraciones o las listas de entidades permitidas relevantes.

La federación de identidades para cargas de trabajo de NodePool para GKE está inhabilitada

Con el siguiente comando, se muestra el estado de Cloud Service Mesh administrado:

    gcloud container fleet mesh describe

Es posible que veas el código de error NODEPOOL_WORKLOAD_IDENTITY_FEDERATION_REQUIRED en el campo Conditions de tu membresía:

    membershipStates:
      projects/test-project/locations/us-central1/memberships/my-membership:
        servicemesh:
          conditions:
          - code: NODEPOOL_WORKLOAD_IDENTITY_FEDERATION_REQUIRED
            details: One or more node pools have workload identity federation disabled.
            documentationLink: https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity
            severity: ERROR
          controlPlaneManagement:
            details:
            - code: REVISION_FAILED_PRECONDITION
              details: Required in-cluster components are not ready. This will be retried
                within 15 minutes.
            implementation: TRAFFIC_DIRECTOR
            state: FAILED_PRECONDITION

Este error se muestra si el clúster de GKE no tiene habilitada la federación de identidades para cargas de trabajo en todos los grupos de nodos de ese clúster, ya que este es un requisito previo para la instalación de Cloud Service Mesh.

Para resolver este mensaje de error, debes seguir las instrucciones para habilitar la federación de identidades para cargas de trabajo en todos los grupos de nodos. Ten en cuenta que la habilitación puede variar según el caso específico del clúster.

Después de la habilitación, el mensaje de error debería quitarse automáticamente y el clúster debería volver al estado ACTIVE. Si el problema persiste y necesitas asistencia adicional, consulta Obtén asistencia.