Resolver erros 4xx


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:

  1. Conecte-se ao cluster usando curl
  2. Configurar o plug-in no kubeconfig

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.

  1. 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)
    
  2. 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.

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

  1. Instale a ferramenta de linha de comando kubectl com a versão 1.24 ou anterior usando curl. 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
    
  2. 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.

  3. Adicione a seguinte linha ao arquivo do script de inicialização e salve-o:

    export USE_GKE_GCLOUD_AUTH_PLUGIN=False
    
  4. Execute o script de inicialização:

    source ~/.bashrc
    
  5. Receba credenciais para o cluster, que configura o arquivo .kube/config:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=COMPUTE_LOCATION
    

    Substitua:

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

  1. Encontre o nome da conta de serviço usada pelos nós:

    Console

    1. Acesse a página Clusters do Kubernetes:

      Acessar os clusters do Kubernetes

    2. Na lista de clusters, clique no nome do cluster que você quer inspecionar.
    3. 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:
        1. Clique na guia Nós.
        2. 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.
        3. 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 for default, 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.serviceAccount

    Para 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 for default, 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.

  2. Para conceder o papel roles/container.defaultNodeServiceAccount à conta de serviço padrão do Compute Engine, siga estas etapas:

    Console

    1. Acesse a página Welcome:

      Acesse a página "Bem-vindo"

    2. No campo Número do projeto, clique em Copiar para a área de transferência.
    3. Acesse a página do IAM:

      Acessar IAM

    4. Clique em CONCEDER ACESSO.
    5. No campo Novos participantes, especifique o seguinte valor:
      PROJECT_NUMBER-compute@developer.gserviceaccount.com
      Substitua PROJECT_NUMBER pelo número do projeto que você copiou.
    6. No menu Selecionar um papel, selecione o papel Conta de serviço de nó padrão do Kubernetes Engine.
    7. Clique em Salvar.

    gcloud

    1. 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
      
    2. 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:

  1. Identifique a conta com problema de acesso:

    gcloud auth list
    
  2. 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, como compute.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:

  1. 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.
  2. 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:

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:

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

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

  1. Acesse a página APIs e serviços no Console do Google Cloud.

    Acessar APIs e serviços

  2. Selecione o projeto.

  3. Clique em Ativar APIs e serviços.

  4. Procure pelo Kubernetes e selecione a API nos resultados da pesquisa.

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