En esta página, se muestra cómo resolver los errores 400, 401, 403 y 404 que podrías encontrar cuando uses Google Kubernetes Engine (GKE).
Problema: Errores de autenticación y autorización
Cuando te conectas a clústeres de GKE, puedes obtener un error de autenticación y autorización con el código de estado HTTP 401 (Unauthorized)
. Este problema puede ocurrir cuando intentas ejecutar un comando kubectl
en tu clúster de GKE desde un entorno local.
La causa de este problema podría ser una de las siguientes:
- El complemento de autenticación
gke-gcloud-auth-plugin
no está instalado ni configurado de forma correcta. - No tienes los permisos para conectarte al servidor de la API del clúster y ejecutar comandos de
kubectl
.
Para diagnosticar la causa, completa los pasos que se indican en las siguientes secciones:
Conéctate al clúster mediante curl
.
Para diagnosticar la causa del error de autenticación y autorización, conéctate al clúster con curl
. El uso de curl
omitirá la herramienta de línea de comandos kubectl
y el complemento gke-gcloud-auth-plugin
.
Establece las variables de entorno:
APISERVER=https://$(gcloud container clusters describe CLUSTER_NAME \ --location=COMPUTE_LOCATION --format "value(endpoint)") TOKEN=$(gcloud auth print-access-token)
Verifica que tu token de acceso sea válido:
curl https://oauth2.googleapis.com/tokeninfo?access_token=$TOKEN
Cuando tienes un token de acceso válido, este comando envía una solicitud al servidor de OAuth 2.0 de Google, y el servidor responde con información sobre el token.
Intenta conectarte al extremo principal de la API en el servidor de la API:
# Get cluster CA certificate gcloud container clusters describe CLUSTER_NAME \ --location=COMPUTE_LOCATION \ --format "value(masterAuth.clusterCaCertificate)" | \ base64 -d > /tmp/ca.crt # Make API call with authentication and CA certificate curl -s -X GET "${APISERVER}/api/v1/namespaces" \ --header "Authorization: Bearer $TOKEN" \ --cacert /tmp/ca.crt
Si el comando
curl
se realiza correctamente, verás una lista de espacios de nombres. Continúa verificando si el complemento es la causa siguiendo los pasos que se indican en la sección Configura el complemento en kubeconfig.Si el comando
curl
falla con un resultado similar al siguiente, significa que no tienes los permisos correctos para acceder al clúster:{ "kind": "Status", "apiVersion": "v1", "metadata": {}, "status": "Failure", "message": "Unauthorized", "reason": "Unauthorized", "code": 401 }
Para resolver este problema, consulta a tu administrador para obtener los permisos correctos para acceder al clúster.
Configura el uso del complemento en kubeconfig
Si recibes errores de autenticación y autorización cuando te conectas a tus clústeres, pero pudiste conectarte al clúster con curl
, asegúrate de poder acceder a tu clúster sin necesidad del complemento gke-gcloud-auth-plugin
.
Para resolver este problema, configura tu entorno local para ignorar el objeto binario gke-gcloud-auth-plugin
cuando se autentique en el clúster. En los clientes de Kubernetes que ejecutan la versión 1.25 y posteriores, el objeto binario gke-gcloud-auth-plugin
es obligatorio, por lo que debes usar una versión 1.24 o anterior para la herramienta de línea de comandos kubectl
.
Sigue estos pasos para acceder a tu clúster sin necesidad del complemento:
Instala la herramienta de línea de comandos de
kubectl
con la versión 1.24 o una anterior concurl
. En el siguiente ejemplo, se instala la herramienta con la versión 1.24:curl -LO https://dl.k8s.io/release/v1.24.0/bin/linux/amd64/kubectl
Abre el archivo de secuencia de comandos de inicio de la shell en un editor de texto. Por ejemplo, abre
.bashrc
para la shell de Bash:vi ~/.bashrc
Si usas macOS, usa
~/.bash_profile
en lugar de.bashrc
en estas instrucciones.Agrega la siguiente línea al archivo de secuencia de comandos de inicio y guárdala:
export USE_GKE_GCLOUD_AUTH_PLUGIN=False
Ejecuta la secuencia de comandos de inicio:
source ~/.bashrc
Obtén credenciales para el clúster, que configura el archivo
.kube/config
:gcloud container clusters get-credentials CLUSTER_NAME \ --location=COMPUTE_LOCATION
Reemplaza lo siguiente:
CLUSTER_NAME
: el nombre del clústerCOMPUTE_LOCATION
: la ubicación de Compute Engine.
Ejecuta un comando
kubectl
: Por ejemplo:kubectl cluster-info
Si recibes un error 401 o un error de autorización similar después de ejecutar estos comandos, asegúrate de tener los permisos correctos y, luego, vuelve a ejecutar el paso que mostró el error.
Error 400: El grupo de nodos requiere recreación
El siguiente error puede ocurrir cuando intentas realizar una acción que vuelve a crear el plano de control y los nodos:
ERROR: (gcloud.container.clusters.update) ResponseError: code=400, message=Node pool "test-pool-1" requires recreation.
Por ejemplo, este error puede ocurrir cuando completas una rotación de credenciales en curso.
En el backend, los grupos de nodos están marcados para su recreación, pero la operación de recreación real puede tomar un tiempo en comenzar. Por este motivo, la operación falla porque GKE aún no volvió a crear uno o más grupos de nodos en el clúster.
Para resolver este problema, selecciona una de las siguientes soluciones:
- Espera a que se realice la recreación. Esto puede tardar horas, días o semanas, según factores como los períodos de mantenimiento y las exclusiones existentes.
Inicia de forma manual una recreación de los grupos de nodos afectados mediante el inicio de una actualización de la versión a la misma versión que el plano de control.
Para iniciar una recreación, ejecuta el siguiente comando:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=POOL_NAME
Una vez completada la actualización, vuelve a intentar la operación.
Error 403: Permisos insuficientes
El siguiente error ocurre cuando intentas conectarte a un clúster de GKE mediante gcloud container clusters get-credentials
, pero la cuenta no tiene permiso para acceder al servidor de la API de Kubernetes:
ERROR: (gcloud.container.clusters.get-credentials) ResponseError: code=403, message=Required "container.clusters.get" permission(s) for "projects/<your-project>/locations/<region>/clusters/<your-cluster>".
Para resolver este problema, realiza los siguientes pasos:
Identifica la cuenta que tiene el problema de acceso:
gcloud auth list
Otorga el acceso requerido a la cuenta mediante las instrucciones que aparecen en Autenticar en el servidor de la API de Kubernetes.
Error 403: Se agotó el presupuesto de reintentos
El siguiente error puede ocurrir cuando intentas crear un clúster de GKE:
Error: googleapi: Error 403: Retry budget exhausted: Google Compute Engine:
Required permission 'PERMISSION_NAME' for 'RESOURCE_NAME'.
En este mensaje de error, se aplican las siguientes variables:
PERMISSION_NAME
: Es el nombre de un permiso, comocompute.regions.get
.RESOURCE_NAME
: Es la ruta de acceso al recurso de Google Cloud al que intentaste acceder, como una región de Compute Engine.
Este error se produce si la cuenta de servicio de IAM adjunta al clúster no tiene los permisos mínimos necesarios para crearlo.
Para solucionar este problema, haz lo siguiente:
- Crea o modifica una cuenta de servicio de IAM para tener todos los permisos necesarios para ejecutar un clúster de GKE. Para obtener instrucciones, consulta Usa cuentas de servicio de IAM con privilegios mínimos.
- Especifica la cuenta de servicio de IAM actualizada en el comando de creación del clúster con la marca
--service-account
. Para obtener instrucciones, consulta Crea un clúster de Autopilot.
Como alternativa, omite la marca --service-account
para permitir que GKE use la cuenta de servicio predeterminada de Compute Engine en el proyecto, que tiene los permisos necesarios de forma predeterminada.
Error 404: No se encontró el recurso
Si recibes un error 404, recurso no encontrado, cuando llames a los comandos gcloud container
, vuelve a autenticarte en Google Cloud CLI para resolver el problema:
gcloud auth login
Error 400/403: Faltan permisos de edición en una cuenta
Si falta el permiso de edición en una cuenta (error 400 o 403), se indica que se borró o editó manualmente uno de los siguientes elementos:
- Tu cuenta de servicio predeterminada de Compute Engine.
- El agente de servicio de las APIs de Google
- La cuenta de servicio asociada con GKE
Cuando habilitas la API de Compute Engine o la API de Kubernetes Engine, Google Cloud crea las siguientes cuentas de servicio y agentes:
- Cuenta de servicio predeterminada de Compute Engine con permisos de edición en tu proyecto.
- Agente de servicio de las APIs de Google con permisos de edición en tu proyecto.
- Cuenta de servicio de Google Kubernetes Engine con el rol de Agente de servicio de Kubernetes Engine en tu proyecto.
La creación de clústeres y toda la administración fallan si, en algún momento, alguien edita esos permisos, quita las vinculaciones de roles del proyecto, quita la cuenta de servicio por completo o inhabilita la API.
Para verificar si la cuenta de servicio de Google Kubernetes Engine tiene el rol de Agente de servicio de Kubernetes Engine asignado en el proyecto, completa los siguientes pasos:
Determina el nombre de tu cuenta de servicio de Google Kubernetes Engine. Todas las cuentas de servicio tienen el siguiente formato:
service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
Reemplaza
PROJECT_NUMBER
por el número del proyecto.Verifica que tu cuenta de servicio de Google Kubernetes Engine no tenga el rol de agente de servicio de Kubernetes Engine asignado en el proyecto:
gcloud projects get-iam-policy PROJECT_ID
Reemplaza
PROJECT_ID
con el ID del proyecto.
Para resolver el problema, si alguien quitó el rol de Agente de servicios de Kubernetes Engine de la cuenta de servicio de Google Kubernetes Engine, vuelve a agregarlo. De lo contrario, sigue las instrucciones que se indican a continuación para volver a habilitar la API de Kubernetes Engine, que restablece tus cuentas de servicio y permisos:
Console
Ve a la página API y servicios en la consola de Google Cloud.
Elige tu proyecto.
Haga clic en Habilitar API y servicios.
Busca Kubernetes y, luego, selecciona la API de los resultados de la búsqueda.
Haz clic en Habilitar. Si habilitaste la API antes, primero debes inhabilitarla y, luego, habilitarla de nuevo. La habilitación de la API y los servicios relacionados puede tomar varios minutos.
gcloud
Ejecuta los siguientes comandos en la gcloud CLI:
PROJECT_NUMBER=$(gcloud projects describe "PROJECT_ID"
--format 'get(projectNumber)')
gcloud projects add-iam-policy-binding PROJECT_ID \
--member "serviceAccount:service-${PROJECT_NUMBER?}@container-engine-robot.iam.gserviceaccount.com" \
--role roles/container.serviceAgent
¿Qué sigue?
Si necesitas asistencia adicional, comunícate con Atención al cliente de Cloud.