Solucionar problemas de conexión de clústeres

En esta página se describe cómo solucionar los errores habituales que pueden surgir al registrar clústeres en una flota o al conectarse a clústeres fuera de Google Cloud mediante la consola de Google Cloud , Google Cloud CLI o kubectl a través de la puerta de enlace Connect.

Los clústeres on-premise y los clústeres de otras nubes públicas dependen del agente de Connect para establecer y mantener una conexión entre el clúster y tu Google Cloud proyecto, así como para gestionar las solicitudes de Kubernetes. Si ves errores como "Agente no disponible" o "No se ha podido conectar al plano de control del clúster", puede que haya un problema con el agente de Connect.

Recoger registros del agente de Connect

Cuando registras un clúster externo Google Cloud, este usa el agente de Connect para gestionar la comunicación entre tu clúster y tu proyecto de host de flota. Connect Agent es una implementación, gke-connect-agent, que se suele instalar en tu clúster en el espacio de nombres gke-connect. Recopilar registros de este agente de Connect puede ser útil para solucionar problemas de registro y conexión.

Puedes recuperar los registros del agente ejecutando el siguiente comando (ajusta el número de líneas si es necesario):

kubectl logs -n gke-connect -l app=gke-connect-agent --tail=-1

Para obtener información sobre todos los agentes de Connect que se ejecutan en los clústeres de tu proyecto, haz lo siguiente:

kubectl describe deployment --all-namespaces -l app=gke-connect-agent

Una conexión correcta debería tener entradas similares al siguiente ejemplo:

2019/02/16 17:28:43.312056 dialer.go:244: dialer: dial: connected to gkeconnect.googleapis.com:443
2019/02/16 17:28:43.312279 tunnel.go:234: serve: opening egress stream...
2019/02/16 17:28:43.312439 tunnel.go:248: serve: registering endpoint="442223602236", shard="88d2bca5-f40a-11e8-983e-42010a8000b2" {"Params":{"GkeConnect":{"endpoint_class":1,"metadata":{"Metadata":{"Default":{"manifest_version":"234227867"}}}}}} ...
2019/02/16 17:28:43.312656 tunnel.go:259: serve: serving requests...

Recopilar registros de GKE Identity Service

Inspeccionar los registros de GKE Identity Service puede ser útil si tienes problemas con Grupos de Google o con la asistencia de terceros para Connect Gateway. Este método de generación de registros solo se aplica a los clústeres de las implementaciones de Google Distributed Cloud en VMware o bare metal.

  1. Aumenta la verbosidad de los registros de GKE Identity Service editando el recurso personalizado clientconfig con el siguiente comando:

    kubectl edit deployment -n anthos-identity-service
    

    y añadiendo una marca vmodule en el campo containers de la siguiente manera:

    spec:
      containers:
      ...
      - command:
        - --vmodule=cloud/identity/hybrid/charon/*=9
    
  2. Reinicia el pod de Identity Service para GKE eliminándolo con el siguiente comando:

    kubectl delete pods -l k8s-app=ais -n anthos-identity-service
    

    El pod debería volver a aparecer en unos segundos.

  3. Una vez que se haya reiniciado el pod, ejecuta el comando original que devolvía una respuesta inesperada para rellenar los registros del pod de Identity Service de GKE con más detalles.

  4. Guarda la salida de estos registros en un archivo con el siguiente comando:

    kubectl logs -l k8s-app=ais -n anthos-identity-service --tail=-1 > gke_id_service_logs.txt
    

Si faltan grupos en los registros de pods de GKE Identity Service, comprueba que la configuración del clúster sea correcta. Si hay otros problemas relacionados con el servicio de identidad de GKE, consulta Solucionar problemas de acceso de usuarios o Solucionar problemas de configuración a nivel de flota.

tls: oversized record errores

Síntoma

Puede que te encuentres con un error como este:

... dialer: dial: connection to gkeconnect.googleapis.com:443 failed after
388.080605ms: serve: egress call failed: rpc error: code = Unauthenticated
desc = transport: oauth2: cannot fetch token: Post
https://oauth2.googleapis.com/token: proxyconnect tcp: tls: oversized record
received with length 20527
Posibles motivos

Esto puede significar que el agente de conexión está intentando conectarse a través de HTTPS a un proxy solo HTTP. Connect Agent solo admite proxies HTTP basados en CONNECT.

Resolución

Debes volver a configurar las variables de entorno de proxy de la siguiente manera:

http_proxy=http://[PROXY_URL]:[PROXY_PORT]
https_proxy=http://[PROXY_URL]:[PROXY_PORT]

oauth2: cannot fetch token errores

Síntoma

Puede que te encuentres con un error como este:

...  dialer: dial: connection to gkeconnect.googleapis.com:443 failed
after 388.080605ms: serve: egress call failed: rpc error: code =
Unauthenticated desc = transport: oauth2: cannot fetch token: Post
https://oauth2.googleapis.com/token: read tcp 192.168.1.40:5570->1.1.1.1:80
read: connection reset by peer
Posibles motivos

Esto puede significar que el proxy HTTP upstream ha restablecido la conexión, probablemente porque tu proxy HTTP no permite esta URL en concreto. En el ejemplo anterior, 1.1.1.1:80 es la dirección del proxy HTTP.

Resolución

Comprueba que tu lista de permitidos de proxy HTTP incluya las siguientes URLs o dominios:

gkeconnect.googleapis.com
oauth2.googleapis.com/token
www.googleapis.com/oauth2/v1/certs

Errores de fallo y reinicio del pod del agente de Connect

Síntoma

Es posible que se produzcan errores intermitentes de "Agente no disponible" en la Google Cloud consola de tu clúster o que el pod se haya reiniciado varias veces:

$ kubectl get pods -n gke-connect
NAME                                                READY   STATUS    RESTARTS   AGE
gke-connect-agent-20230706-03-00-6b8f75dd58-dzwmt   1/1     Running   5          99m

Para solucionar este problema, describe el pod para ver si su último estado fue terminated debido a un error de falta de memoria (OOMKilled):

  kubectl describe pods/gke-connect-agent-20230706-03-00-6b8f75dd58-dzwmt -n gke-connect
        <some details skipped..>
        Last State:     Terminated
        Reason:       OOMKilled
Posibles motivos
De forma predeterminada, los pods del agente de conexión tienen un límite de RAM de 256 MiB. Si el clúster tiene muchas cargas de trabajo instaladas, es posible que algunas de las solicitudes y respuestas no se puedan gestionar como se espera.
Resolución

Actualiza la implementación del agente de Connect y concédele un límite de memoria superior. Por ejemplo:

containers:
  name: gke-connect-agent-20230706-03-00
  resources:
    limits:
      memory: 512Mi

PermissionDenied errores

Síntoma

Puede que te encuentres con un error como este:

tunnel.go:250: serve: recv error: rpc error: code = PermissionDenied
desc = The caller does not have permission
dialer.go:210: dialer: dial: connection to gkeconnect.googleapis.com:443
failed after 335.153278ms: serve: receive request failed: rpc error:
code = PermissionDenied desc = The caller does not have permission
dialer.go:150: dialer: connection done: serve: receive request failed:
rpc error: code = PermissionDenied desc = The caller does not have permission
dialer.go:228: dialer: backoff: 1m14.1376766s
Posibles motivos

Esto puede significar que no has vinculado el rol de gestión de identidades y accesos (IAM) necesario a laGoogle Cloud cuenta de servicio que has creado para autorizar al agente de Connect a conectarse con Google. La Google Cloud cuenta de serviciogkehub.connect requiere el rol de gestión de identidades y accesos.

Esto también puede ocurrir si eliminas y vuelves a crear la cuenta de servicio con el mismo nombre. Google CloudEn ese caso, también debes eliminar y volver a crear el enlace de rol de gestión de identidades y accesos. Para obtener más información, consulta el artículo Eliminar y volver a crear cuentas de servicio.

Resolución

Asigna el rol gkehub.connect a tu cuenta de servicio (ten en cuenta que el rol gkehub.admin no tiene los permisos adecuados para conectarse y no está pensado para que lo usen las cuentas de servicio).

Por ejemplo, para un proyecto llamado my-project y una cuenta de servicio llamada Google Cloud, ejecutarías el siguiente comando para vincular el rol a la cuenta de servicio:gkeconnect@my-project.iam.gserviceaccount.com

gcloud projects add-iam-policy-binding my-project --member \
serviceAccount:gkeconnect@my-project.iam.gserviceaccount.com \
--role "roles/gkehub.connect"

Para ver y verificar que los permisos de la cuenta de servicio se han aplicado a una cuenta de servicio, examina el resultado del siguiente comando. Deberías ver el role: roles/gkehub.connect enlazado a la cuenta de servicio asociada Google Cloud . Google Cloud

gcloud projects get-iam-policy my-project

Error al vincular el rol de gestión de identidades y accesos a la cuenta de servicio Google Cloud

Síntoma

Puede que te encuentres con un error como este:

ERROR: (gcloud.projects.add-iam-policy-binding) PERMISSION_DENIED:
Service Management API has not been used in project [PROJECT_ID] before or it
is disabled. Enable it by visiting
https://console.developers.google.com/apis/api/servicemanagement.googleapis.com/overview?project=[PROJECT_ID]
then retry. If you enabled this API recently, wait a few minutes for the
action to propagate to our systems and retry.
Posibles motivos

Es posible que no tengas los permisos de gestión de identidades y accesos para ejecutar el comando gcloud projects add-iam-policy-binding.

Resolución

Debes tener el permiso resourcemanager.projects.setIamPolicy. Si tienes los roles Project IAM Admin, Owner o Editor, deberías poder ejecutar el comando. Si una política de seguridad interna te impide ejecutar el comando, ponte en contacto con tu administrador.

Error debido a que el reloj del sistema está desfasado

Síntoma

Puede que te encuentres con un error como este:

acceptCall: failed to parse token in req [rpc_id=1]: Token used before issued [rpc_id=1]
Posibles motivos

El mensaje de registro suele indicar que hay una diferencia horaria en el clúster. La marca de tiempo del token emitido por el clúster no está sincronizada, por lo que se rechaza el token.

Resolución

Para comprobar si el reloj no está sincronizado correctamente, puedes ejecutar el comando date en tu clúster y compararlo con la hora estándar. Normalmente, este problema se produce cuando hay una diferencia de unos segundos. Para solucionar este problema, vuelve a sincronizar el reloj de tu clúster.

No se pueden ver las cargas de trabajo en la consola de Google Cloud

Síntomas

En los registros del agente de Connect, es posible que veas los siguientes errores:

"https://10.0.10.6:443/api/v1/nodes" YYYY-MM-DDTHH mm:ss.sssZ http.go:86: GET
"https://10.0.10.6:443/api/v1/pods" YYYY-MM-DDTHH mm:ss.sssZ http.go:139:
Response status: "403 Forbidden" YYYY-MM-DDTHH mm:ss.sssZ http.go:139:
Response status: "403 Forbidden"`
Posibles motivos

Estos registros indican que Google Cloud está intentando acceder al clúster con las credenciales que proporcionaste durante el registro. Los errores 403 indican que las credenciales no tienen los permisos necesarios para acceder al clúster.

Resolución

Comprueba el token y la cuenta a la que está vinculado, y asegúrate de que tenga los permisos adecuados en el clúster.

Tiempo límite de contexto superado

Síntoma

Puede que te encuentres con un error como este:

2019/03/06 21:08:43.306625 dialer.go:235: dialer: dial: connecting to gkeconnect.googleapis.com:443...
2019/03/06 21:09:13.306893 dialer.go:240: dialer: dial: unable to connect to gkeconnect.googleapis.com:443: context deadline exceeded
2019/03/06 21:09:13.306943 dialer.go:183: dialer: connection done: context deadline exceeded
Posibles motivos

Este error indica un problema de red TCP de bajo nivel en el que el agente de conexión no puede comunicarse con gkeconnect.googleapis.com.

Resolución

Verifica que las cargas de trabajo de Pod de este clúster puedan resolver y tengan conectividad saliente con gkeconnect.googleapis.com a través del puerto 443.

La conexión del agente falla de forma intermitente

Síntomas

En los registros del agente de Connect, es posible que veas los siguientes errores:

2020/10/06 18:02:34.409749 dialer.go:277: dialer: dial: connection to gkeconnect.googleapis.com:443 failed after 8m0.790286282s: serve: receive request failed: rpc error: code = Unavailable desc = transport is closing
2020/10/06 18:02:34.416618 dialer.go:207: dialer: connection done: serve: receive request failed: rpc error: code = Unavailable desc = transport is closing
2020/10/06 18:02:34.416722 dialer.go:295: dialer: backoff: 978.11948ms
2020/10/06 18:02:34.410097 tunnel.go:651: sendResponse: EOF [rpc_id=52]
2020/10/06 18:02:34.420077 tunnel.go:651: sendResponse: EOF [rpc_id=52]
2020/10/06 18:02:34.420204 tunnel.go:670: sendHalfClose: EOF [rpc_id=52]
2020/10/06 18:02:34.401412 tunnel.go:670: sendHalfClose: EOF [rpc_id=53]
Posibles motivos

La conexión a Connect se cierra cuando Connect Agent no tiene suficientes recursos, por ejemplo, en instancias de AWS EC2 más pequeñas, como t3.medium.

Resolución

Si usas AWS y el tipo de instancia T3, habilita T3 unlimited o usa un tipo de instancia con más recursos para tus grupos de nodos.

La flota no puede acceder al proyecto

Síntomas

Durante algunas operaciones de la flota (normalmente, el registro de clústeres), puede que se produzca un error similar al siguiente:

ERROR: (gcloud.container.hub.memberships.register) failed to initialize Feature
"authorizer", the fleet service account (service-PROJECT_NUMBER@gcp-sa-gkehub.iam.gserviceaccount.com) may not have access to your project
Posibles motivos

La cuenta de servicio predeterminada de Fleet, gcp-sa-gkehub, puede desvincularse de un proyecto por error. El agente de servicio de flota es un rol de gestión de identidades y accesos que concede a la cuenta de servicio los permisos para gestionar los recursos del clúster. Si eliminas esta vinculación de rol de la cuenta de servicio, la cuenta de servicio predeterminada dejará de estar vinculada al proyecto, lo que puede impedir que registres clústeres y realices otras operaciones con ellos.

Puedes comprobar si la cuenta de servicio se ha quitado de tu proyecto mediante la CLI de gcloud o la Google Cloud consola. Si el comando o el panel de control no muestran gcp-sa-gkehub entre tus cuentas de servicio, significa que la cuenta de servicio se ha desvinculado.

gcloud

Ejecuta el siguiente comando:

gcloud projects get-iam-policy PROJECT_NAME

donde PROJECT_NAME es el nombre del proyecto en el que estás intentando registrar el clúster.

Consola

Ve a la página IAM y administración en la consola de Google Cloud .

Resolución

Si has eliminado el enlace de rol del agente de servicio de flota, ejecuta los siguientes comandos para restaurarlo:

PROJECT_NUMBER=$(gcloud projects describe PROJECT_NAME --format "value(projectNumber)")
gcloud projects add-iam-policy-binding PROJECT_NAME \
  --member "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-gkehub.iam.gserviceaccount.com" \
  --role roles/gkehub.serviceAgent

Para confirmar que se ha concedido la vinculación de roles, haz lo siguiente:

gcloud projects get-iam-policy PROJECT_NAME

Si ves el nombre de la cuenta de servicio junto con el rol gkehub.serviceAgent, significa que se ha concedido la vinculación de rol. Por ejemplo:

- members:
  - serviceAccount:service-1234567890@gcp-sa-gkehub.iam.gserviceaccount.com
  role: roles/gkehub.serviceAgent

Error al registrar un clúster de GKE desde un proyecto distinto al de la flota

Síntomas

Al registrar un clúster de GKE desde un proyecto distinto del proyecto de flota, es posible que veas un error similar al siguiente en la CLI de gcloud:

...
message: 'DeployPatch failed'>
detail: 'DeployPatch failed'
...

Para verificarlo en los registros, aplica los siguientes filtros:

resource.type="gke_cluster"
resource.labels.cluster_name="my-cluster"
protoPayload.methodName="google.container.v1beta1.ClusterManager.UpdateCluster"
protoPayload.status.code="13"
protoPayload.status.message="Internal error."
severity=ERROR

Posibles motivos

La cuenta de servicio predeterminada de la flota no tiene los permisos necesarios en el proyecto del clúster de GKE.

Resolución

Concede a la cuenta de servicio predeterminada de la flota los permisos necesarios antes de registrar el clúster.

Error al registrar o anular el registro de un clúster de GKE, o al actualizar los detalles de la pertenencia a una flota de un clúster de GKE registrado durante la rotación de credenciales

Síntomas

Al rotar las credenciales de tu clúster(https://cloud.google.com/kubernetes-engine/docs/how-to/credential-rotation), puedes encontrar errores si registras o anulas el registro de un clúster de GKE, o si actualizas la pertenencia de un clúster de GKE registrado.

ERROR: (gcloud.container.hub.memberships.unregister) "code": 13,
"message": "an internal error has occurred"
Posibles motivos

Las credenciales del clúster están en un estado intermedio en el que el servicio Fleet no puede acceder a ellas.

Resolución

Completa la rotación antes de registrar o anular el registro del clúster, o de actualizar la pertenencia de un clúster de GKE registrado.

Error al inhabilitar la API Fleet

Síntomas

Al intentar inhabilitar la API Fleet (gkehub.googleapis.com), es posible que se produzca un error similar al siguiente:

Not ready to deactivate the service on this project; ensure there are no more resources managed by this service.
Posibles motivos

En este proyecto, todavía hay clústeres registrados en Google Cloud (miembros) o funciones a nivel de flota habilitadas. Todas las suscripciones o funciones deben anularse o inhabilitarse antes de que se pueda inhabilitar la API.

  • Para ver los clústeres registrados, sigue las instrucciones de Ver miembros de la flota.

  • Para ver todas las funciones activas a nivel de flota de tu proyecto, haz lo siguiente:

gcloud y cURL

$ curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://gkehub.googleapis.com/v1alpha/projects/PROJECT_NAME/locations/global/features

donde PROJECT_NAME es el nombre del proyecto en el que quieres inhabilitar la API Fleet.

Consola

Si tienes habilitado GKE en tu proyecto, ve a la página Gestor de funciones de la consola de Google Cloud . Las funciones que aparecen como HABILITADAS son funciones activas a nivel de flota.

Resolución

Primero, da de baja los clústeres que aún estén registrados en la flota de tu proyecto. Todos los clústeres deben estar registrados para que se puedan inhabilitar algunas funciones.

Una vez que lo hayas hecho, inhabilita todas las funciones a nivel de flota. Por el momento, solo se puede hacer con la API REST de flota.

  1. Inhabilitar las funciones a nivel de flota que hayas habilitado en tu proyecto

    $ gcloud alpha container hub FEATURE_COMMAND disable
    
  2. Inhabilita el autorizador de funciones y la medición, que están habilitados de forma predeterminada.

    $ curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -X "DELETE" \
        https://gkehub.googleapis.com/v1alpha/projects/PROJECT_NAME/locations/global/features/FEATURE
    

    donde FEATURE es el nombre de la función que quieres inhabilitar (por ejemplo, authorizer o metering).

Faltan permisos de clúster al registrar un clúster

Síntoma:

Al intentar registrar un clúster con una cuenta de usuario o una Google Cloud cuenta de servicio, es posible que recibas un error similar al siguiente:

ERROR: (gcloud.container.hub.memberships.register) ResponseError: code=403, message=Required "container.clusters.get" permission(s) for "projects/my-project/zones/zone-a/clusters/my-cluster"
Posible motivo:

La cuenta que intenta registrar el clúster no tiene el rol de cluster-admin control de acceso basado en roles (RBAC) necesario en el clúster.

Solución:

Asigna el rol de RBAC cluster-admin a la cuenta antes de registrar el clúster.

Error Failed to check if the user is a cluster-admin: Unable to connect to the server al registrar un clúster

Síntoma:

Al intentar registrar un clúster, es posible que se produzca un error similar al siguiente:

ERROR: (gcloud.container.hub.memberships.register) Failed to check if the user is a cluster-admin: Unable to connect to the server: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

O

ERROR: (gcloud.container.hub.memberships.register) Failed to check if the user is a cluster-admin: Unable to connect to the server: dial tcp MASTER_ENDPOINT_IP:443: i/o timeout
Posible motivo:

La máquina en la que ejecutas el comando gcloud no puede conectarse al endpoint externo del clúster. Esto suele ocurrir si tienes un clúster privado con el acceso o la IP externos inhabilitados, pero la dirección IP externa de tu máquina no está en la lista de permitidas. Ten en cuenta que, después de gcloud 407.0.0, no es necesario registrar un clúster de GKE.

Solución:

Asegúrate de que el equipo en el que quieres ejecutar el comando de registro gcloud pueda acceder al servidor de la API del clúster. Si tu clúster no tiene habilitado el acceso externo, crea un caso con el equipo de Google Cloud Asistencia.

Error: No se puede eliminar una suscripción gestionada por Google

Una vez que registras un clúster en una flota, se convierte en miembro de la flota con un nombre de miembro de flota único. Si intentas eliminar esta pertenencia ejecutando gcloud container hub memberships delete MEMBERSHIP_NAME, es posible que veas el siguiente error:

ERROR: (gcloud.container.hub.memberships.delete) FAILED_PRECONDITION: membership "projects/PROJECT_ID/locations/us-centrall/memberships/MEMBERSHIP_NAME" is a managed resource of your cluster. Deleting a google-managed membership directly is not allowed. Please offboard your fleet membership via cluster API: failed precondition

Para eliminar correctamente una pertenencia a una flota, sigue las instrucciones que se indican en Dar de baja un clúster.

Obtener ayuda adicional

Para registrar una incidencia con Google Cloud el equipo de Asistencia de GKE, sigue estos pasos:

  1. Crea un caso de asistencia con Google Cloud el equipo de Asistencia.
  2. Sigue las instrucciones de Recoger registros de Connect Agent para guardar los registros de Connect.
  3. Si tiene problemas con un clúster local y utiliza Grupos de Google o asistencia de terceros, siga las instrucciones que se indican en Recoger registros del servicio de identidad de GKE para guardar los registros del servicio de identidad de GKE. Si es necesario, asegúrate de anonimizar los registros del pod en el archivo guardado.
  4. Adjunta los registros correspondientes a tu caso.