Soluciona problemas de conexiones de clústeres

En esta página, se describe cómo solucionar problemas comunes que puedes encontrar cuando registras clústeres en una flota o te conectas a clústeres fuera de Google Cloud con la consola de Google Cloud, Google Cloud CLI okubectl con lapuerta de enlace de Connect.

Los clústeres locales y los clústeres en otras nubes públicas dependen del agente de Connect para establecer y mantener una conexión entre el clúster y tu proyecto de Google Cloud y controlar las solicitudes de Kubernetes. Si ves errores como “No se puede acceder al agente” o “No se pudo establecer la conexión al plano de control del clúster”, esto podría indicar un problema con el agente de Connect.

Recopila registros del agente de Connect

Cuando registras un clúster fuera de Google Cloud, usa el agente de Connect para controlar la comunicación entre el clúster y el proyecto host de la flota. El agente de Connect es un Deployment, gke-connect-agent, que, por lo general, se instala en el clúster en el espacio de nombres gke-connect. La recopilación de registros de este agente de Connect puede ser útil para solucionar problemas de registro y conexión.

Para recuperar los registros del agente, ejecuta el siguiente comando (ajusta el recuento de líneas si es necesario):

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

Para obtener información sobre cada agente de Connect que se ejecuta en los clústeres de tu proyecto, sigue estos pasos:

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

Recopila registros del servicio de identidad de GKE

Inspeccionar los registros del servicio de identidad de GKE puede ser útil si tienes problemas con los Grupos de Google o la asistencia de terceros para la puerta de enlace de Connect. Este método de generación de registros solo se aplica a clústeres en implementaciones de Google Distributed Cloud en VMware o en equipos físicos.

  1. Aumenta la verbosidad de los registros del servicio de identidad de GKE con una edición en el recurso personalizado clientconfig con el siguiente comando:

    kubectl edit deployment -n anthos-identity-service
    

    También puedes agregar una marca vmodule en el campo containers de la siguiente manera:

    spec:
      containers:
      ...
      - command:
        - --vmodule=cloud/identity/hybrid/charon/*=9
    
  2. Para reiniciar el pod de servicio de GKE Identity, bórralo con el siguiente comando:

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

    Un Pod debería volver a activarse en unos segundos.

  3. Una vez que el Pod se reinicia, ejecuta el comando original que devolvió una respuesta inesperada para propagar los registros del Pod de GKE Identity Service con más detalles.

  4. Guarda el resultado 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 esperados en los registros del pod de GKE Identity Service, verifica que la configuración del clúster sea correcta. Si hay otros problemas relacionados con GKE Identity Service, consulta Soluciona problemas de acceso de los usuarios o Soluciona problemas de configuración a nivel de la flota.

tls: oversized record errores

Síntoma

Es posible que se vea 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
Causas posibles

Esto puede significar que el agente de Connect intenta conectarse a través de HTTPS a un proxy solo HTTP. El agente de Connect solo es compatible con los proxies HTTP basados en CONNECT.

Solución

Debes volver a configurar las variables de entorno del 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

Es posible que se vea 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
Causas posibles

Esto puede significar que el proxy HTTP ascendente restablece la conexión, lo más probable es que el proxy HTTP no admita esta URL específica. En el ejemplo anterior, 1.1.1.1:80 es la dirección del proxy HTTP.

Solución

Compruebe que su lista de entidades permitidas de proxy HTTP incluya las siguientes URL o dominios:

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

Errores de falla y reinicio del Pod del agente de Connect

Síntoma

Es posible que encuentres errores intermitentes de “agente inaccesible” en la consola de Google Cloud para tu clúster o es posible 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 comportamiento, describe el pod para ver si su último estado se finalizó debido a un error de memoria insuficiente (OOMKilled):

  kubectl describe pods/gke-connect-agent-20230706-03-00-6b8f75dd58-dzwmt -n gke-connect
        <some details skipped..>
        Last State:     Terminated
        Reason:       OOMKilled
Causas posibles
De forma predeterminada, los pods de Connect Agent tienen un límite de 256 MiB de RAM. Si el clúster instaló muchas cargas de trabajo, es posible que algunas de las solicitudes y respuestas no se puedan manejar como se espera.
Solución

Actualiza la implementación del agente de Connect y otórgale un límite de memoria más alto, por ejemplo:

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

PermissionDenied errores

Síntoma

Es posible que se vea 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
Causas posibles

Esto significa que no vinculaste la función de administración de identidades y accesos (IAM) requerida a la cuenta de servicio de Google Cloud que creaste para autorizar al agente de Connect a conectarse a Google. La cuenta de servicio de Google Cloud requiere la función de IAM gkehub.connect.

Esto también puede ocurrir si borras y vuelves a crear la cuenta de servicio de Google Cloud con el mismo nombre. En ese caso, también debes borrar y volver a crear la vinculación de la función de IAM. Para obtener más información, consulta Borra y vuelve a crear cuentas de servicio.

Solución

Vincula la función gkehub.connect a tu cuenta de servicio (ten en cuenta que la función gkehub.admin no tiene los permisos adecuados para conectarse y no está destinada para que la usen las cuentas de servicio).

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

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

Puedes ver y verificar los permisos de la cuenta de servicio que se aplicaron a una cuenta de servicio de Google Cloud si examinas el resultado del siguiente comando, y deberías ver el límite de role: roles/gkehub.connect para la cuenta de servicio de Google Cloud asociada.

gcloud projects get-iam-policy my-project

Error cuando se vincula la función de IAM a la cuenta de servicio de Google Cloud

Síntoma

Es posible que se vea 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.
Causas posibles

Es posible que no tengas los permisos de IAM para ejecutar el comando gcloud projects add-iam-policy-binding.

Solución

Debes tener el permiso resourcemanager.projects.setIamPolicy. Si tienes las funciones Project IAM Admin, Owner o Editor, debes poder ejecutar el comando. Si una política de seguridad interna te prohíbe ejecutar el comando, consulta con tu administrador.

Error de una clave de cuenta de servicio no válida

Síntoma

Es posible que se vea un error como este:

2020/05/08 01:22:21.435104 environment.go:214: Got ExternalID 3770f509-b89b-48c4-96e0-860bb70b3a58 from namespace kube-system.
2020/05/08 01:22:21.437976 environment.go:485: Using gcp Service Account key
2020/05/08 01:22:21.438140 gkeconnect_agent.go:50: error creating kubernetes connect agent: failed to get tunnel config: unexpected end of JSON input
Causas posibles

Estos registros indican que se proporcionó al agente de Connect una clave de cuenta de servicio no válida durante la instalación.

Solución

Crea un nuevo archivo JSON que contenga las credenciales de la cuenta de servicio y, luego, vuelve a instalar el agente de Connect con ayuda de los pasos para registrar un clúster.

Error de una clave de cuenta de servicio vencida

Síntoma

Es posible que se vea un error como este:

2020/05/08 01:22:21.435104 dialer.go:277: dialer: dial: connection to gkeconnect.googleapis.com:443 failed after 37.901608ms:
serve: egress call failed: rpc error: code = Unauthenticated desc = transport: oauth2: cannot fetch token: 400 Bad Request
Response: {"error":"invalid_grant","error_description":"Invalid JWT Signature."}
Causas posibles

Estos registros indican que el agente de Connect marcaba a Connect con una clave de cuenta de servicio no válida. El archivo de claves de la cuenta de servicio puede contener errores o la clave puede haber vencido.

Para verificar si la clave venció, usa la consola de Google Cloud para enumerar las claves de tu cuenta de servicio y sus fechas de vencimiento.

Solución

Crea un nuevo archivo JSON que contenga las credenciales de la cuenta de servicio y, luego, vuelve a instalar el agente de Connect con ayuda de los pasos para registrar un clúster.

Error en el reloj del sistema sesgado

Síntoma

Es posible que se vea un error como este:

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

Por lo general, el mensaje de registro indica que hay un sesgo de reloj en el clúster. El token emitido por el clúster tiene una marca de tiempo que o está sincronizada y, por lo tanto, se rechaza.

Solución

Para ver si el reloj no está sincronizado correctamente, puedes ejecutar el comando date en tu clúster y compararlo con el tiempo estándar. Por lo general, se producen algunos errores durante algunos segundos. Para resolver 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

Es posible que veas los siguientes errores en los registros de Connect Agent:

"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"`
Causas posibles

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

Solución

Verifica que el token y la cuenta a la que esté vinculada y asegúrate de que tenga los permisos adecuados en el clúster.

Se superó el plazo del contexto

Síntoma

Es posible que se vea 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
Causas posibles

Este error indica un problema de red de TCP de bajo nivel en el que el agente de Connect no se puede comunicar con gkeconnect.googleapis.com.

Solución

Verifica que las cargas de trabajo de los Pods dentro de este clúster puedan resolverse y tener conectividad saliente a gkeconnect.googleapis.com en el puerto 443.

La conexión del agente falla de manera intermitente

Síntomas

Es posible que veas los siguientes errores en los registros de Connect Agent:

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]
Causas posibles

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

Solución

Si usas AWS y el tipo de instancia de T3, habilita T3 ilimitado 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 (por lo general, el registro del clúster), es posible que veas 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
Causas posibles

La cuenta de servicio predeterminada de la flota, gcp-sa-gkehub, se puede desvincular de un proyecto por accidente. El agente del servicio de la flota es una función de IAM que le otorga a la cuenta de servicio los permisos necesarios para administrar los recursos del clúster. Si quitas esta vinculación de función de la cuenta de servicio, la cuenta de servicio predeterminada se desvincula del proyecto, lo que puede impedir que se registren clústeres y otras operaciones de clústeres.

Puedes verificar si la cuenta de servicio se quitó del proyecto con gcloud CLI o con la consola de Google Cloud. Si en el comando o el panel no se muestra gcp-sa-gkehub entre las cuentas de servicio, la cuenta de servicio se desvinculó.

gcloud

Ejecuta el siguiente comando:

gcloud projects get-iam-policy PROJECT_NAME

En el ejemplo anterior, PROJECT_NAME es el nombre del proyecto en el que intentas registrar el clúster.

Console

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

Solución

Si quitas la vinculación de función de agente de servicio de la flota, ejecuta los siguientes comandos para restablecer la vinculación de función:

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 la vinculación de rol se otorgó:

gcloud projects get-iam-policy PROJECT_NAME

Si ves el nombre de la cuenta de servicio junto con la función gkehub.serviceAgent, se otorgó la vinculación de función. Por ejemplo:

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

Se produjo un error al registrar un clúster de GKE desde un proyecto diferente al de la flota

Síntomas

Cuando registras un clúster de GKE desde un proyecto diferente al proyecto de la flota, es posible que veas un error similar al siguiente en gcloud CLI:

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

Se puede verificar en el registro con la aplicación de 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

Causas posibles

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

Solución

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

Se produjo un error cuando se registró o canceló el registro de un clúster de GKE o actualizaron los detalles de la membresía de la flota para un clúster de GKE registrado durante la rotación de credenciales

Síntomas

Mientras rotas las credenciales de tu clúster (https://cloud.google.com/kubernetes-engine/docs/how-to/credential-rotation), es posible que encuentres errores si registras o anulas el registro de un clúster de GKE o si actualizas la membresía. un clúster de GKE registrado.

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

Las credenciales del clúster se encuentran en un estado intermedio en el que el servicio de la flota no puede acceder a ellas.

Solución

Completa la rotación antes de registrar o registrar el clúster o actualizar la membresía de un clúster de GKE registrado.

Error cuando se inhabilita la API de Fleet

Síntomas

Cuando intentes inhabilitar la API de Fleet (gkehub.googleapis.com), es posible que veas un error similar al siguiente:

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

Aún hay clústeres registrados en Google Cloud (membresías) o funciones de nivel de flota habilitadas en este proyecto. Todas las membresías o funciones no deben estar registradas o deben estar inhabilitadas antes de que la API se pueda inhabilitar.

  • Para ver los clústeres registrados actuales, sigue las instrucciones en Visualiza miembros de la flota

  • Para ver todas las funciones activas a nivel de flota de tu proyecto, ejecuta el siguiente comando:

gcloud y cURL

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

En el ejemplo anterior, PROJECT_NAME es el nombre del proyecto en el que intentas inhabilitar la API de Fleet.

Console

Si habilitaste GKE Enterprise en tu proyecto, visita la página de Feature Manager en la consola de Google Cloud. Las características que se enumeran como HABILITADAS son características activas a nivel de flota.

Solución

Primero, cancela el registro de los clústeres que aún estén registrados en la flota de tu proyecto. Se debe cancelar el registro de todos los clústeres antes de que se puedan inhabilitar algunas funciones.

Una vez hecho esto, inhabilita todas las funciones a nivel de la flota. Por el momento, esto solo es posible con la API de REST de la flota.

  1. Inhabilita funciones de nivel de flota que hayas habilitado en tu proyecto

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

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

    En el ejemplo anterior, FEATURE es el nombre de la función que se inhabilitará (como authorizer o metering).

Faltan los permisos de clúster cuando se registra un clúster

Síntoma:

Cuando intentes registrar un clúster con una cuenta de usuario o una cuenta de servicio de Google Cloud, es posible que recibas un error similar al que se muestra a continuación:

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"
Causa posible:

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

Solución:

Otorga el rol de RBAC de 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 cuando se registra un clúster

Síntoma:

Cuando intentas registrar un clúster, puedes obtener 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
Causa posible:

La máquina en la que ejecutas el comando de registro gcloud no se puede conectar al extremo externo del clúster. Esto suele suceder si tienes un clúster privado con acceso externo o IP inhabilitada, pero la dirección IP externa de tu máquina no está incluida en la lista de entidades permitidas. Ten en cuenta que registrar un clúster de GKE no tiene este requisito después de gcloud 407.0.0.

Solución:

Asegúrate de que la máquina en la que deseas ejecutar el comando de registro gcloud pueda acceder al servidor de API del clúster. Si tu clúster no tiene acceso externo habilitado, presenta un caso en la Asistencia de Google Cloud.

Obtén ayuda adicional

Puedes enviar un ticket con la asistencia de Google Cloud para GKE Enterprise con la ayuda de los siguientes pasos:

  1. Presente un caso con la Asistencia de Google Cloud.
  2. Sigue las instrucciones que se indican en Recopila los registros de Connect Agent a fin de guardar los registros de Connect.
  3. Si solucionas los problemas en un clúster local con Grupos de Google o asistencia de terceros, sigue las instrucciones en Recopila registros de GKE Identity Service para guardar los registros de GKE Identity Service. Asegúrate de limpiar los registros del pod en el archivo guardado si es necesario.
  4. Adjunta los registros relevantes para tu caso.