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 códigos de estado HTTP 400 y errores de membresía del clúster.

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

Las revisiones se informan como error de mal estado

Es posible que veas un error Revision(s) reporting unhealthy genérico si Cloud Service Mesh administrado no tiene la cuenta de servicio administrada por Google requerida con las vinculaciones de roles de Identity and Access Management (IAM) del agente de servicio de Cloud Service Mesh. Por lo general, esto ocurre cuando se revoca el permiso para el rol de agente de servicio de Cloud Service Mesh mediante la reconfiguración de Terraform, Puppet o CI/CD.

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 de Principal.

    Si ves la cuenta de servicio administrada con el rol de IAM necesario en la lista, significa que está configurada de forma correcta.

    Si no ves la cuenta de servicio administrada necesaria con el rol de IAM requerido en la lista, la vinculación de función de IAM necesaria del agente de servicio de Cloud Service Mesh no existe en la cuenta de servicio administrada.

  4. Otorga al agente de servicio de Cloud Service Mesh (roles/anthosservicemesh.serviceAgent) vinculaciones de roles de IAM a la cuenta de servicio administrada de Cloud Service Mesh en la consola de Google Cloud.

Google Cloud CLI

  1. En Google Cloud CLI, ejecuta el siguiente comando para verificar si se configuró 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, entonces está configurado de forma correcta.

    Si no ves ninguna función en la lista, significa que se revocaron todas las funciones de la cuenta de servicio administrada.

  3. Ejecuta el siguiente comando para asignar las vinculaciones de funciones de IAM adecuadas a la cuenta de servicio administrada de Cloud Service Mesh:

     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:

Estado Código 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 configura 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 la flota o habilitar el plano de datos administrado después de aprovisionar Cloud Service Mesh administrado con asmcli. Ten en cuenta que los informes de estado del plano de datos administrado solo están disponibles si habilitaste el plano de datos administrado mediante la anotación de un espacio de nombres o una revisión. La anotación de Pods individuales hace que estos se administren, pero con un estado de característica de DISABLED si no hay 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 habilitada la Workload Identity de GKE 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 puede explicar el error específico.

Si necesitas más detalles, verifica el recurso personalizado ControlPlaneRevision en el clúster, que se actualiza cuando se aprovisiona el plano de control administrado o cuando falla 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 los 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.

La malla de servicios administrados de Cloud 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 Cloud Functions en Google Kubernetes Engine (GKE). Los proyectos que antes usaban Cloud Service Mesh administrado, pero que dejaron de usarlo antes de la migración no tienen la API necesaria para la comunicación entre Cloud Run y GKE.

En esta situación, el aprovisionamiento administrado de Cloud Service Mesh fallará 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 recursos personalizados de Kubernetes relacionados 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 requerida:

     gcloud services enable connectgateway.googleapis.com --project=[*PROJECT_ID*]
    
  2. Vuelve a instalar la malla de servicios de Cloud administrada.

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

Las APIs de Google Cloud no están habilitadas

Si la flota administrada de Cloud Service Mesh usa la implementación del plano de control 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 Cloud Service Mesh administrado.

    gcloud services enable --project=[*PROJECT_ID*] \
        trafficdirector.googleapis.com \
        networkservices.googleapis.com \
        networksecurity.googleapis.com
    
  2. Asegúrate de no tener ninguna herramienta automatizada que revierta este cambio. Si el error se repite, actualiza las opciones de configuración o las listas de permisos relevantes.