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.
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 campocontainers
de la siguiente manera:spec: containers: ... - command: - --vmodule=cloud/identity/hybrid/charon/*=9
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.
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.
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óngkehub.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 llamadagkeconnect@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 funcionesProject IAM Admin
,Owner
oEditor
, 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.
Inhabilita funciones de nivel de flota que hayas habilitado en tu proyecto
$ gcloud alpha container hub FEATURE_COMMAND disable
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á (comoauthorizer
ometering
).
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:
- Presente un caso con la Asistencia de Google Cloud.
- Sigue las instrucciones que se indican en Recopila los registros de Connect Agent a fin de guardar los registros de Connect.
- 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.
- Adjunta los registros relevantes para tu caso.