Nesta página, mostramos como resolver problemas com
a ferramenta de linha de comando kubectl
ao trabalhar no Google Kubernetes Engine (GKE).
Para conselhos mais gerais, consulte
Solução de problemas do kubectl
na documentação do Kubernetes.
Erros de autenticação e autorização
Se você estiver com erros relacionados à autenticação e autorização ao
usar os comandos da ferramenta de linha de comando kubectl
, leia as seções a seguir para
receber conselhos.
Erro: 401 (não autorizado)
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. Para saber mais, consulte
Problema: erros de autenticação e autorização.
Erro: escopos de autenticação insuficientes
Ao executar gcloud container clusters get-credentials
, você pode receber o
seguinte erro:
ERROR: (gcloud.container.clusters.get-credentials) ResponseError: code=403, message=Request had insufficient authentication scopes.
Esse erro ocorre porque você está tentando acessar a API Kubernetes Engine a partir de
uma VM do Compute Engine que não tem o escopo cloud-platform
.
Para resolver esse erro, conceda o escopo cloud-platform
ausente. Para
instruções sobre como alterar os escopos na instância de VM do Compute Engine, consulte
Como criar e ativar contas de serviço para instâncias
na documentação do Compute Engine.
Erro: gke-gcloud-auth-plugin executável não encontrado
Mensagens de erro semelhantes à seguinte podem ocorrer ao tentar executar comandos kubectl
ou clientes personalizados que interagem com o GKE:
Unable to connect to the server: getting credentials: exec: executable gke-gcloud-auth-plugin not found
It looks like you are trying to use a client-go credential plugin that is not installed.
To learn more about this feature, consult the documentation available at:
https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins
Visit cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl#install_plugin to install gke-gcloud-auth-plugin.
Unable to connect to the server: getting credentials: exec: fork/exec /usr/lib/google-cloud-sdk/bin/gke-gcloud-auth-plugin: no such file or directory
Para resolver o problema, instale o gke-gcloud-auth-plugin
conforme descrito em
Instalar plug-ins necessários.
Erro: nenhum provedor de autenticação foi encontrado
O erro a seguir ocorre se os clientes kubectl
ou personalizados do Kubernetes tiverem sido
criados com o Kubernetes client-go
versão 1.26 ou mais recente:
no Auth Provider found for name "gcp"
Para resolver esse problema, siga estas etapas:
Instale
gke-gcloud-auth-plugin
conforme descrito em Instalar os plug-ins necessários.Atualize para a versão mais recente da CLI gcloud:
gcloud components update
Atualize o arquivo
kubeconfig
:gcloud container clusters get-credentials CLUSTER_NAME \ --region=COMPUTE_REGION
Substitua:
CLUSTER_NAME
: o nome do cluster.COMPUTE_REGION
: a região do Compute Engine do cluster; Para clusters zonais, use--zone=COMPUTE_ZONE
.
Erro: o plug-in auth do gcp foi descontinuado. Use o gcloud.
Você pode receber a seguinte mensagem de aviso depois de instalar o
gke-gcloud-auth-plugin
e executar um comando kubectl
em um cluster do GKE:
WARNING: the gcp auth plugin is deprecated in v1.22+, unavailable in v1.25+; use gcloud instead.
Essa mensagem vai aparecer se a versão do cliente for anterior à 1.26.
Para resolver esse problema, instrua seu cliente a usar o plug-in de autenticação
gke-gcloud-auth-plugin
:
Abra seu script de login do shell em um editor de texto:
Bash
vi ~/.bashrc
Zsh
vi ~/.zshrc
Se você estiver usando o PowerShell, pule esta etapa.
Defina a variável de ambiente a seguir:
Bash
export USE_GKE_GCLOUD_AUTH_PLUGIN=True
Zsh
export USE_GKE_GCLOUD_AUTH_PLUGIN=True
PowerShell
[Environment]::SetEnvironmentVariable('USE_GKE_GCLOUD_AUTH_PLUGIN', True, 'Machine')
Aplique a variável no seu ambiente:
Bash
source ~/.bashrc
Zsh
source ~/.zshrc
PowerShell
Saia do terminal e abra uma nova sessão de terminal.
Atualizar a CLI gcloud:
gcloud components update
Autenticar no cluster:
gcloud container clusters get-credentials CLUSTER_NAME \ --region=COMPUTE_REGION
Substitua:
CLUSTER_NAME
: o nome do cluster.COMPUTE_REGION
: a região do Compute Engine do cluster; Para clusters zonais, use--zone=COMPUTE_ZONE
.
Problema: comando kubectl
não encontrado
Se você receber uma mensagem informando que o comando kubectl
não foi encontrado,
reinstale o binário kubectl
e defina a variável de ambiente $PATH
:
Instale o binário
kubectl
:gcloud components update kubectl
Quando o instalador solicitar a modificação da variável de ambiente
$PATH
, digitey
para continuar. Quando essa variável é modificada, você consegue usar os comandoskubectl
sem digitar o caminho completo.Outra alternativa é adicionar a seguinte linha a qualquer lugar em que o shell armazene variáveis de ambiente, como
~/.bashrc
(ou~/.bash_profile
no macOS):export PATH=$PATH:/usr/local/share/google/google-cloud-sdk/bin/
Execute o comando a seguir para carregar o arquivo atualizado. O exemplo a seguir usa
.bashrc
:source ~/.bashrc
Se você estiver usando o macOS, use
~/.bash_profile
em vez de.bashrc
.
Problema: comandos do kubectl
retornam erro de "conexão recusada"
Se os comandos kubectl
retornarem um erro de "conexão recusada",
você precisará definir o contexto do cluster com o seguinte comando:
gcloud container clusters get-credentials CLUSTER_NAME
Substitua CLUSTER_NAME
pelo nome do cluster. Se
você não tiver certeza sobre o que inserir no nome do cluster, use o comando a seguir
para listar os clusters:
gcloud container clusters list
Erro: o comando kubectl
expirou
Se você criou um cluster e tentou executar um comando kubectl
nele, mas o comando kubectl
expirou, vai aparecer um erro semelhante a este:
Unable to connect to the server: dial tcp IP_ADDRESS: connect: connection timed out
Unable to connect to the server: dial tcp IP_ADDRESS: i/o timeout
Esses erros indicam que kubectl
não consegue se comunicar com o
plano de controle do cluster.
Para resolver esse problema, verifique e defina o contexto em que o cluster está definido e garanta a conectividade com o cluster:
Acesse
$HOME/.kube/config
ou execute o comandokubectl config view
para verificar se o arquivo de configuração contém o contexto do cluster e o endereço IP externo do plano de controle.Defina as credenciais do cluster:
gcloud container clusters get-credentials CLUSTER_NAME \ --location=COMPUTE_LOCATION \ --project=PROJECT_ID
Substitua:
CLUSTER_NAME
: o nome do cluster.COMPUTE_LOCATION
: o local do Compute Engine.PROJECT_ID
: o ID do projeto em que o cluster foi criado.
Se você ativou as redes autorizadas no cluster, verifique se a lista de redes autorizadas atuais inclui o IP de saída da máquina de onde você está tentando se conectar. É possível encontrar suas redes autorizadas no console ou executando o seguinte comando:
gcloud container clusters describe CLUSTER_NAME \ --location=COMPUTE_LOCATION \ --project=PROJECT_ID \ --format "flattened(controlPlaneEndpointsConfig.ipEndpointsConfig.authorizedNetwork sConfig.cidrBlocks[])"
Se o IP de saída da máquina não estiver incluído na lista de redes autorizadas da saída do comando anterior, siga uma destas etapas:
- Se você estiver usando o console, siga as instruções em Não é possível acessar o plano de controle de um cluster sem um endpoint externo.
- Se você estiver se conectando pelo Cloud Shell, siga as instruções em Como usar o Cloud Shell para acessar um cluster com o endpoint externo desativado.
Erro: os comandos kubectl
retornam falha ao negociar versão da API
Se os comandos kubectl
retornarem um erro failed to negotiate an API version
, verifique se o kubectl
tem credenciais de autenticação:
gcloud auth application-default login
Problema: o comando kubectl
logs
, attach
, exec
ou port-forward
para de responder
Se os comandos kubectl
logs
, attach
, exec
ou port-forward
pararem de
responder, normalmente o servidor da API não poderá se comunicar com os nós.
Primeiro, verifique se o cluster tem nós. Se você reduziu o número de nós no cluster a zero, os comandos não vão funcionar. Para resolver esse problema, redimensione o cluster para ter pelo menos um nó.
Se o cluster tiver pelo menos um nó, verifique se você está usando túneis SSH ou proxy de conectividade para ativar a comunicação segura. As seções a seguir discutem as etapas de solução de problemas específicas para cada serviço:
Resolver problemas de SSH
Se você estiver usando SSH, o GKE vai salvar um arquivo de chave pública SSH nos metadata do projeto do Compute Engine. Todas as VMs do Compute Engine que usam imagens fornecidas pelo Google verificam regularmente os metadados comuns do projeto e os metadados da instância em busca de chaves SSH para adicionar à lista de usuários autorizados da VM. Além disso, o GKE adiciona uma regra de firewall à rede do Compute Engine, o que permite o acesso SSH do endereço IP do plano de controle a cada nó no cluster.
As configurações a seguir podem causar problemas com a comunicação SSH:
As regras de firewall da rede não permitem acesso SSH ao plano de controle.
Todas as redes do Compute Engine são criadas com uma regra de firewall chamada
default-allow-ssh
, que permite o acesso SSH de todos os endereços IP, certamente com uma chave privada válida. O GKE também insere uma regra SSH em cada cluster público no formatogke-CLUSTER_NAME-RANDOM_CHARACTERS-ssh
, que permite o acesso SSH especificamente do plano de controle do cluster aos nós do cluster.Se não houver nenhuma dessas regras, o plano de controle não poderá abrir os túneis SSH.
Para verificar se essa é a causa do problema, verifique se a configuração tem essas regras.
Para resolver esse problema, identifique a tag que está em todos os nós do cluster e adicione novamente uma regra de firewall que permita acesso às VMs com essa tag do endereço IP do plano de controle.
A entrada de metadados comuns para
ssh-keys
está cheia.Se a entrada de metadados do projeto chamada
ssh-keys
estiver próxima do limite máximo de tamanho, o GKE não poderá adicionar a própria chave SSH para abrir túneis SSH.Para verificar se esse é o problema, confira o comprimento da lista de
ssh-keys
. Para conferir os metadados do seu projeto, execute o comando abaixo, incluindo a flag--project
, se quiser:gcloud compute project-info describe [--project=PROJECT_ID]
Para resolver esse problema, exclua algumas chaves SSH que não são mais necessárias.
Você definiu um campo de metadados com a chave
ssh-keys
nas VMs no cluster.O agente de nó nas VMs prefere as chaves SSH por instância a chaves SSH do projeto inteiro. Portanto, se você definiu essas chaves especificamente nos nós do cluster, a chave SSH do plano de controle nos metadados do projeto não será usada pelos nós.
Para verificar se esse é o problema, execute
gcloud compute instances describe VM_NAME
e procure um campossh-keys
nos metadados.Para resolver esse problema, exclua as chaves SSH por instância dos metadados da instância.
Resolver problemas do proxy de conectividade
Para determinar se o cluster usa o proxy Konnectivity, verifique a seguinte implantação do sistema:
kubectl get deployments konnectivity-agent --namespace kube-system
Se o cluster usar o proxy Konnectivity, a saída será semelhante a esta:
NAME READY UP-TO-DATE AVAILABLE AGE
konnectivity-agent 3/3 3 3 18d
Depois de verificar se você está usando o proxy da Konnectivity, verifique se os agentes da Konnectivity têm o acesso de firewall necessário e se as políticas de rede estão configuradas corretamente.
Permitir acesso necessário ao firewall
Verifique se as regras de firewall da sua rede permitem o acesso às seguintes portas:
- Porta do plano de controle: na criação do cluster, os agentes da Konnectivity estabelecem
conexões com o plano de controle na porta 8132. Quando você executa um comando
kubectl
, o servidor da API usa essa conexão para se comunicar com o cluster. Permita o tráfego de saída para o plano de controle do cluster na porta 8132. Para comparação, o servidor da API usa 443. Se você tiver regras que negam o acesso de saída, talvez seja necessário modificar as regras ou criar exceções. Porta
kubelet
: como os agentes de conectividade são pods do sistema implantados nos nós do cluster, verifique se as regras de firewall permitem os seguintes tipos de tráfego:- Tráfego de entrada para as cargas de trabalho na porta 10250 dos intervalos de pods.
- Tráfego de saída dos intervalos de pod.
Se as regras de firewall não permitirem esse tipo de tráfego, modifique as regras.
Ajustar a política de rede
Se a política de rede do cluster
bloquear a entrada do namespace kube-system
para o namespace workload
, isso poderá
causar problemas com o proxy da Konnectivity.
Esses recursos não são necessários para o funcionamento correto do cluster. Se você preferir manter a rede do cluster bloqueada contra qualquer acesso externo, saiba que recursos como esse não funcionarão.
Para verificar se essa é a causa do problema, encontre as políticas de rede no namespace afetado executando o seguinte comando:
kubectl get networkpolicy --namespace AFFECTED_NAMESPACE
Para resolver esse problema, adicione o seguinte ao campo spec.ingress
das políticas de rede:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
podSelector:
matchLabels:
k8s-app: konnectivity-agent
A seguir
Se precisar de mais ajuda, entre em contato com o Cloud Customer Care.