Esta página ajuda a resolver erros 400, 401, 403 e 404 que você pode encontrar ao usar o Google Kubernetes Engine (GKE).
Problema: erros de autenticação e autorização
Ao se conectar a clusters do GKE, você pode receber um erro de autenticação
e autorização com o código de status HTTP 401 (Unauthorized)
. Esse problema
pode ocorrer quando você tenta executar um comando kubectl
no cluster do GKE
em um ambiente local.
A causa desse problema pode ser uma das seguintes:
- O plug-in de autenticação
gke-gcloud-auth-plugin
não está instalado ou configurado corretamente. - Você não tem as permissões para se conectar ao servidor da API do cluster e executar
comandos
kubectl
.
Para diagnosticar a causa, siga as etapas nas seções a seguir:
Conecte-se ao cluster usando curl
Para diagnosticar a causa do erro de autenticação e autorização, conecte-se ao
cluster usando curl
. O uso de curl
ignora a ferramenta de linha de comando kubectl
e o plug-in gke-gcloud-auth-plugin
.
Defina as variáveis de ambiente:
APISERVER=https://$(gcloud container clusters describe CLUSTER_NAME \ --location=COMPUTE_LOCATION --format "value(endpoint)") TOKEN=$(gcloud auth print-access-token)
Verifique se o token de acesso é válido:
curl https://oauth2.googleapis.com/tokeninfo?access_token=$TOKEN
Quando você tem um token de acesso válido, esse comando envia uma solicitação para o servidor OAuth 2.0 do Google, que responde com informações sobre o token.
Tente se conectar ao endpoint principal da API no servidor da 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
Se o comando
curl
for bem-sucedido, você vai encontrar uma lista de namespaces. Siga as etapas da seção Configurar o plug-in no kubeconfig para verificar se o plug-in é a causa.Se o comando
curl
falhar com uma saída semelhante à seguinte, você não terá as permissões corretas para acessar o cluster:{ "kind": "Status", "apiVersion": "v1", "metadata": {}, "status": "Failure", "message": "Unauthorized", "reason": "Unauthorized", "code": 401 }
Para resolver esse problema, consulte o administrador para receber as permissões corretas para acessar o cluster.
Configurar o uso do plug-in no kubeconfig
Se você receber erros de autenticação e autorização ao se conectar aos
clusters, mas conseguir se conectar ao cluster usando
o curl
, verifique se é possível acessar
o cluster sem precisar do plug-in gke-gcloud-auth-plugin
.
Para resolver esse problema, configure seu ambiente local para ignorar o
binário gke-gcloud-auth-plugin
ao autenticar no cluster. Nos clientes
do Kubernetes com a versão 1.25 e mais recentes, o binário gke-gcloud-auth-plugin
é obrigatório. Portanto, use uma versão 1.24 ou anterior da
ferramenta de linha de comando kubectl
.
Siga estas etapas para acessar o cluster sem precisar do plug-in:
Instale a ferramenta de linha de comando
kubectl
com a versão 1.24 ou anterior usandocurl
. O exemplo a seguir instala a ferramenta com a versão 1.24:curl -LO https://dl.k8s.io/release/v1.24.0/bin/linux/amd64/kubectl
Abra o arquivo de script de inicialização do shell em um editor de texto. Por exemplo, abra
.bashrc
para o shell Bash:vi ~/.bashrc
Se você estiver usando o macOS, use
~/.bash_profile
em vez de.bashrc
nestas instruções.Adicione a seguinte linha ao arquivo do script de inicialização e salve-o:
export USE_GKE_GCLOUD_AUTH_PLUGIN=False
Execute o script de inicialização:
source ~/.bashrc
Receba credenciais para o cluster, que configura o arquivo
.kube/config
:gcloud container clusters get-credentials CLUSTER_NAME \ --location=COMPUTE_LOCATION
Substitua:
CLUSTER_NAME
: o nome do cluster.COMPUTE_LOCATION
: o local do Compute Engine.
Execute um comando
kubectl
. Por exemplo:kubectl cluster-info
Se você receber um erro 401 ou um erro de autorização semelhante após a execução desses comandos, verifique se tem as permissões corretas e execute novamente a etapa que retornou o erro.
Erro 400: o pool de nós requer recriação
O seguinte erro pode ocorrer quando você tenta realizar uma ação que recria o plano de controle e os nós:
ERROR: (gcloud.container.clusters.update) ResponseError: code=400, message=Node pool "test-pool-1" requires recreation.
Por exemplo, esse erro pode ocorrer quando você conclui uma rotação de credenciais em andamento.
No back-end, os pools de nós são marcados para recriação, mas a operação de recriação real pode levar algum tempo para começar. Por isso, a operação falha porque o GKE ainda não recriou um ou mais pools de nós no cluster.
Para resolver esse problema, escolha um dos métodos a seguir.
- Espere a recriação acontecer. Isso pode levar horas, dias ou semanas, dependendo de fatores como janelas de manutenção e exclusões atuais.
Inicie manualmente uma recriação dos pools de nós afetados iniciando um upgrade para a mesma versão do plano de controle.
Para iniciar uma recriação, execute o seguinte comando:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=POOL_NAME
Quando o upgrade for concluído, tente a operação novamente.
Erro 401: não autorizado
O GKE usa contas de serviço do IAM anexadas aos seus nós para executar tarefas do sistema, como geração de registros e monitoramento. No mínimo, essas contas de serviço de nó
precisam ter o papel de
conta de serviço de nó padrão do Kubernetes Engine
(roles/container.defaultNodeServiceAccount
) no projeto. Por padrão,
o GKE usa a
conta de serviço padrão do Compute Engine,
que é criada automaticamente no projeto, como a conta de serviço do nó.
Se a sua organização aplicar a
restrição da política da organização iam.automaticIamGrantsForDefaultServiceAccounts
, a conta de serviço padrão do Compute Engine no seu projeto pode
não receber automaticamente as permissões necessárias para o GKE.
-
Encontre o nome da conta de serviço usada pelos nós:
Console
- Acesse a página Clusters do Kubernetes:
- Na lista de clusters, clique no nome do cluster que você quer inspecionar.
- Dependendo do modo de operação do cluster, faça uma das seguintes ações:
- Para clusters no modo Autopilot, na seção Segurança, encontre o campo Conta de serviço.
- Para clusters no modo padrão, faça o seguinte:
- Clique na guia Nós.
- Na tabela Pools de nós, clique no nome de um pool de nós. A página Detalhes do pool de nós é aberta.
- Na seção Segurança, encontre o campo Conta de serviço.
Se o valor no campo Conta de serviço for
default
, os nós vão usar a conta de serviço padrão do Compute Engine. Se o valor neste campo não fordefault
, seus nós vão usar uma conta de serviço personalizada. Para conceder o papel necessário a uma conta de serviço personalizada, consulte Usar contas de serviço do IAM com privilégio mínimo.gcloud
Para clusters no modo Autopilot, execute o seguinte comando:
gcloud container clusters describe
CLUSTER_NAME
\ --location=LOCATION
\ --flatten=autoscaling.autoprovisioningNodePoolDefaults.serviceAccountPara clusters no modo padrão, execute o seguinte comando:
gcloud container clusters describe
CLUSTER_NAME
\ --location=LOCATION
\ --format="table(nodePools.name,nodePools.config.serviceAccount)"Se a saída for
default
, os nós vão usar a conta de serviço padrão do Compute Engine. Se a saída não fordefault
, os nós usam uma conta de serviço personalizada. Para conceder o papel necessário a uma conta de serviço personalizada, consulte Usar contas de serviço do IAM com privilégio mínimo. -
Para conceder o papel
roles/container.defaultNodeServiceAccount
à conta de serviço padrão do Compute Engine, siga estas etapas:Console
- Acesse a página Welcome:
- No campo Número do projeto, clique em Copiar para a área de transferência.
- Acesse a página do IAM:
- Clique em CONCEDER ACESSO.
- No campo Novos participantes, especifique o seguinte valor:
SubstituaPROJECT_NUMBER-compute@developer.gserviceaccount.com
PROJECT_NUMBER
pelo número do projeto que você copiou. - No menu Selecionar um papel, selecione o papel Conta de serviço de nó padrão do Kubernetes Engine.
- Clique em Salvar.
gcloud
- Encontre o número do projeto do Google Cloud:
gcloud projects describe PROJECT_ID \ --format="value(projectNumber)"
Substitua
PROJECT_ID
pela ID do seu projeto.O resultado será assim:
12345678901
- Conceda o papel
roles/container.defaultNodeServiceAccount
à conta de serviço padrão do Compute Engine:gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/container.defaultNodeServiceAccount"
Substitua
PROJECT_NUMBER
pelo número do projeto da etapa anterior.
Erro 403: permissões insuficientes
O erro a seguir ocorre quando você tenta se conectar a um cluster do GKE
usando gcloud container clusters get-credentials
, mas a conta
não tem permissão para acessar o servidor da API 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 esse problema, siga estas etapas:
Identifique a conta com problema de acesso:
gcloud auth list
Conceda o acesso necessário à conta seguindo as instruções em Como autenticar no servidor da API Kubernetes.
Erro 403: orçamento de nova tentativa esgotado
O seguinte erro pode ocorrer ao tentar criar um cluster do GKE:
Error: googleapi: Error 403: Retry budget exhausted: Google Compute Engine:
Required permission 'PERMISSION_NAME' for 'RESOURCE_NAME'.
Nesta mensagem de erro, as seguintes variáveis se aplicam:
PERMISSION_NAME
: o nome de uma permissão, comocompute.regions.get
.RESOURCE_NAME
: o caminho para o recurso do Google Cloud que você estava tentando acessar, como uma região do Compute Engine.
Esse erro ocorre se a conta de serviço do IAM anexada ao cluster não tiver as permissões mínimas necessárias para criar o cluster.
Para resolver esse problema, faça o seguinte:
- Crie ou modifique uma conta de serviço do IAM para ter todas as permissões necessárias para executar um cluster do GKE. Para mais instruções, consulte Usar contas de serviço IAM de privilégio mínimo.
- Especifique a conta de serviço do IAM atualizada no comando de criação do cluster
usando a flag
--service-account
. Para acessar instruções, consulte Criar um cluster do Autopilot.
Como alternativa, omita a flag --service-account
para permitir que o GKE use
a conta de serviço padrão do Compute Engine no projeto, que tem
as permissões necessárias por padrão.
Erro 404: recurso não encontrado
Se você receber um erro 404, recurso não encontrado, ao chamar comandos gcloud container
,
resolva o problema fazendo a autenticação novamente na CLI do Google Cloud:
gcloud auth login
Erro 400/403: permissões de edição ausentes na conta
Um erro de permissões de edição ausentes na conta (erro 400 ou 403) indica que uma das seguintes opções foi excluída ou editada manualmente:
- Sua conta de serviço padrão do Compute Engine.
- O Agente de serviço das APIs do Google.
- A conta de serviço associada ao GKE.
Quando você ativa a API Compute Engine ou Kubernetes Engine, o Google Cloud cria as seguintes contas de serviço e agentes:
- Conta de serviço padrão do Compute Engine no projeto. O GKE anexa essa conta de serviço aos nós por padrão para tarefas do sistema, como registros e monitoramento.
- Agente de serviço de APIs do Google em um projeto gerenciado pelo Google, com permissões de edição no projeto.
- Agente de serviço do Google Kubernetes Engine em um projeto gerenciado pelo Google, com o papel de Agente de serviço do Kubernetes Engine.
A criação de clusters e todo o gerenciamento falharão se, a qualquer momento, alguém editar essas permissões, remover as vinculações de papéis do projeto, remover a conta de serviço completamente ou desativar a API.
Verificar as permissões do agente de serviço do GKE
Para verificar se a conta de serviço do Google Kubernetes Engine tem o papel de Agente de serviço do Kubernetes Engine atribuído no projeto, siga estas etapas:
Determine o nome da sua conta de serviço do Google Kubernetes Engine. Todas as contas de serviço têm o seguinte formato:
service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
Substitua
PROJECT_NUMBER
pelo número do projeto.Verifique se a conta de serviço do Google Kubernetes Engine não tem o papel de Agente de serviço do Kubernetes Engine atribuído no projeto:
gcloud projects get-iam-policy PROJECT_ID
Substitua
PROJECT_ID
pela ID do seu projeto.
Para corrigir o problema, caso alguém tenha removido o papel de Agente de serviço do Kubernetes Engine da sua conta de serviço do Google Kubernetes Engine, adicione-o novamente. Caso contrário, use as instruções abaixo para reativar a API Kubernetes Engine, que restaura suas contas de serviço e permissões:
Console
Acesse a página APIs e serviços no Console do Google Cloud.
Selecione o projeto.
Clique em Ativar APIs e serviços.
Procure pelo Kubernetes e selecione a API nos resultados da pesquisa.
Clique em Ativar. Se já tiver ativado a API, você precisa primeiro desativá-la e, em seguida, reativá-la. Pode levar alguns minutos para que a API e os serviços relacionados sejam ativados.
gcloud
Execute os seguintes comandos na 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
A seguir
Se precisar de mais ajuda, entre em contato com o Cloud Customer Care.