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.
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 campocontainers
de la siguiente manera:spec: containers: ... - command: - --vmodule=cloud/identity/hybrid/charon/*=9
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.
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.
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 servicio
gkehub.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 rolgkehub.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 Cloudgcloud 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 rolesProject IAM Admin
,Owner
oEditor
, 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.
Inhabilitar las funciones a nivel de flota que hayas habilitado en tu proyecto
$ gcloud alpha container hub FEATURE_COMMAND disable
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
ometering
).
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:
- Crea un caso de asistencia con Google Cloud el equipo de Asistencia.
- Sigue las instrucciones de Recoger registros de Connect Agent para guardar los registros de Connect.
- 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.
- Adjunta los registros correspondientes a tu caso.