Resuelve problemas de asistencia de VM en Anthos Service Mesh

Los siguientes pasos y registros son útiles para solucionar problemas con la asistencia de la VM de Anthos Service Mesh.

Depura la VM

Si ves que las instancias de VM están en ejecución, pero no son accesibles desde la malla, realiza los siguientes pasos en la instancia de VM.

Verifica el agente

  1. Verifica el estado del proxy de Envoy:

    curl localhost:15000/ready -v
    
  2. Verifica el registro de errores de Envoy

    less /var/log/envoy/envoy.err.log
    
  3. Verifica si hay errores de service-proxy-agent:

    journalctl -u service-proxy-agent
    
  4. Verifica el syslog en los registros de Google Cloud's operations suite para la instancia o en la VM en /var/log/syslog para Debian y /var/log/messages para Centos.

Verifica el estado del proxy

  1. Para depurar la configuración del proxy, ejecuta el siguiente comando en la VM:

    curl localhost:15000/config_dump > config.out
    
  2. Copia ese archivo y ejecuta el siguiente comando:

    istioctl proxy-config [cluster|route|listener] --file config.out
    

Errores de token no válidos

Es posible que veas un error similar al siguiente en el registro de errores de Envoy:

E0217 17:59:17.206995798    2411 oauth2_credentials.cc:152]  Call to http server ended with error 500 [{
  "error": "invalid_target",
  "error_description": "federated token response does not have access token. {\"error\":\"invalid_grant\",\"error_description\":\"JWT expired.\"}",
  "error_uri": ""
}].

En ese caso, verifica si el token de /var/run/secrets/tokens/istio-token en la VM caducó y confirma que el valor exp (segundos del ciclo de entrenamiento) no haya transcurrido:

cat /var/run/secrets/tokens/istio-token | cut -d '.' -f2 | base64 -d | python -m json.tool
{
    ...
    "azp": "...",
    "email": "example-service-account@developer.gserviceaccount.com",
    "email_verified": true,
    "exp": 1613995395,
    "google": {
        "compute_engine": {
            "instance_creation_timestamp": 1613775765,
            "instance_id": "5678",
            "instance_name": "vm-instance-03-0mqh",
            "project_id": "...",
            "project_number": 1234,
            "zone": "us-central1-c"
        }
    },
    "iat": ...,
    "iss": "https://accounts.google.com",
    "sub": "..."
}

Información de advertencia de distribución del SO no compatible

En Verifica el agente, si aparece un mensaje de advertencia similar al siguiente en el registro service-proxy-agent:

E0217 17:59:17.206995798    2021-04-09T21:21:29.6091Z service-proxy-agent Warn
Detected image is unsupported: [Ubuntu|Fedora|Suse]. Envoy may not work correctly.

Esto significa que tu distribución de Linux podría no ser compatible, lo que podría hacer que tu proxy tenga un comportamiento inesperado.

Depura el clúster

Sigue estos pasos para solucionar los problemas con tu clúster.

Verifica que funcione el registro automático

  1. Comprueba el WorkloadEntry que istiod genera automáticamente:

    kubectl get workloadentry -n WORKLOAD_NAMESPACE
    

    Además, puedes verificar que exista el navegador de objetos de Kubernetes.

  2. Si no existe, verifica los errores en los registros istiod, que deberían estar disponibles para ti en Google Cloud's operations suite. Como alternativa, puedes recuperarlos directamente:

    kubectl -n istio-system get pods -l app=istiod
    

    El resultado esperado es similar al siguiente:

    NAME                                       READY   STATUS    RESTARTS   AGE
    istiod-asm-190-1-7f6699cfb-5mzxw           1/1     Running   0          5d13h
    istiod-asm-190-1-7f6699cfb-pgvpf           1/1     Running   0          5d13h
    
  3. Configura la variable de entorno del pod y úsala para exportar los registros:

    export ISTIO_POD=istiod-asm-190-1-7f6699cfb-5mzxw
    kubectl logs -n istio-system ${ISTIO_POD} | grep -i 'auto-register\|WorkloadEntry'
    

Verifica los proxies conectados

Puedes usar el comando proxy-status para enumerar todos los proxies conectados, incluidos los de las VM:

istioctl proxy-status

El resultado debe mostrar proxies conectados similares a estos:

NAME                                                    CDS        LDS        EDS        RDS          ISTIOD                               VERSION
details-v1-5f449bdbb9-bhl8d.default                     SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-5mzxw     1.9.0-asm.1
httpbin-779c54bf49-647vd.default                        SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0-asm.1
istio-eastwestgateway-5b6d4ddd9d-5rzx2.istio-system     SYNCED     SYNCED     SYNCED     NOT SENT     istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0-asm.1
istio-ingressgateway-66b6ddd7cb-ctb6b.istio-system      SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0-asm.1
istio-ingressgateway-66b6ddd7cb-vk4bb.istio-system      SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-5mzxw     1.9.0-asm.1
vm-instance-03-39b3.496270428946                        SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0
vm-instance-03-nh5k.496270428946                        SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0
vm-instance-03-s4nl.496270428946                        SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-5mzxw     1.9.0

Para obtener más información sobre las opciones del comando, consulta istioctl proxy-config.

Verifica la configuración de Workload Identity

Verifica el estado mesh para detectar posibles errores en tu clúster. Ten en cuenta que se requiere la versión más reciente de gcloud. Para obtener más información, consulta cómo actualizar a la versión más reciente.

gcloud alpha container hub mesh describe --project=PROJECT_ID

Una configuración válida tendrá un código de estado de OK para el clúster miembro:

createTime: '2021-06-15T21:56:10.221032150Z'
featureState:
  detailsByMembership:
    projects/<your project number>/locations/global/memberships/<your cluster name>:
      code: OK
      description: Revision(s) ready for use: istiod-asm-195-2.
      updateTime: 2021-06-15T21:56:10.221032402Z
  lifecycleState: ENABLED
name: projects/<your project name>/locations/global/features/servicemesh
servicemeshFeatureSpec: {}
updateTime: '2021-06-15T21:56:10.221032402Z'

Si la VM se configuró de forma incorrecta, el código de estado será WARNING con detalles adicionales en la descripción:

createTime: '2021-06-15T22:56:10.227167202Z'
featureState:
  detailsByMembership:
    projects/<your project number>/locations/global/memberships/<your cluster name>:
      code: WARNING
      description: |-
        Revision(s) ready for use: istiod-asm-195-2.
        WorkloadGroup <namespace>/<workloadgroup name> missing ServiceAccount field, please see https://cloud.google.com/service-mesh/docs/troubleshooting/troubleshoot-vms#verify_the_workloadgroup_is_set_up_correctly.
      servicemeshFeatureState: {}
      updateTime: '2021-06-15T22:56:00.220164192Z'
  lifecycleState: ENABLED
name: projects/<your project name>/locations/global/features/servicemesh
servicemeshFeatureSpec: {}
updateTime: '2021-06-15T22:56:10.227167402Z'

Verifica que el proveedor de identidad esté configurado de forma correcta

Comprueba los campos de recursos de IdentityProvider:

 kubectl describe identityprovider

Asegúrate de que los campos cumplan con estos requisitos:

  • El campo serviceAccount está configurado como request.auth.claims["email"]
  • El campo issuerURI está configurado como https://accounts.google.com (actualmente, solo se admite Google como el issuerURI).
  • El campo name del proveedor en los metadatos debe establecerse como google, que es el único proveedor compatible en la actualidad.

    Un ejemplo válido de CR de IdentityProvider:

    apiVersion: security.cloud.google.com/v1alpha1
    kind: IdentityProvider
    metadata:
      name: google
    spec:
      authentication:
        oidc:
          issuerUri: https://accounts.google.com
      serviceAccount: request.auth.claims["email"]
    

Verifica que WorkloadGroup esté configurado de forma correcta

Verifica el WorkloadGroup:

 kubectl get workloadgroup -n WORKLOAD_NAMESPACE

Asegúrate de que los resultados cumplan con estos requisitos:

  • El campo serviceAccount se configuró de forma correcta, por ejemplo, 373206437219-compute@developer.gserviceaccount.com, en el que la cuenta es la misma que la cuenta de servicio que usa la instancia de VM.
  • security.cloud.google.com/IdentityProvider, en el campo de anotación, está configurado. P. ej., security.cloud.google.com/IdentityProvider: google.
  • El grupo de carga de trabajo hace referencia a un IdentityProvider válido, que puedes verificar si compruebas el proveedor de identidad existente:

    kubectl describe identityprovider
    

    El resultado debería ser una lista de proveedores existentes como el siguiente:

     NAME     AGE
     google   39m
    

    Revisa el campo security.cloud.google.com/IdentityProvider en WorkloadGroup y comprueba si el proveedor está incluido en la lista de proveedores existentes.

    Un ejemplo válido de CR de WorkloadGroup:

    apiVersion: networking.istio.io/v1alpha3
    kind: WorkloadGroup
    metadata:
    name: wg-a
    namespace: foo
    spec:
    metadata:
      annotations:
        security.cloud.google.com/IdentityProvider: google
      labels:
        app: wg-a
    template:
      ports:
        grpc: 3550
        http: 8080
      serviceAccount: 373206437219-compute@developer.gserviceaccount.com
    

Se encontró un error interno

Si recibes el mensaje Internal Error Found, consulta Obtén asistencia.

Guía de solución de problemas de VM de Istio

Si deseas obtener pasos adicionales para solucionar problemas, consulta Depura máquinas virtuales.