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
En la consola de Google Cloud, navega a IAM y administración > IAM.
Selecciona Incluir asignaciones de roles proporcionadas por Google.
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.
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
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)'
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.
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:
|
|
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:
|
|
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 administrada 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 Service Mesh de Cloud 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:
Habilita la API de
connectgateway
necesaria:gcloud services enable connectgateway.googleapis.com --project=[*PROJECT_ID*]
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.
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
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 Workload Identity 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.