Nesta página, descrevemos como resolver erros comuns que podem ser encontrados ao registrar clusters em uma frota ou se conectar a clusters fora do Google Cloud usando o console do Google Cloud, a Google Cloud CLI ou kubectl
através do Connect Gateway.
Os clusters no local em outras nuvens públicas dependem do agente do Connect para estabelecer e manter uma conexão entre o cluster e o projeto do Google Cloud, além de processar solicitações do Kubernetes. Erros como "Agente inalcançável" ou "Falha ao conectar ao plano de controle do cluster" podem indicar um problema com o agente do Connect.
Como coletar registros do agente do Connect
Quando você registra um cluster fora do Google Cloud, ele usa o agente do Connect para processar a comunicação entre o cluster e o projeto host da frota. O agente do Connect é uma implantação, gke-connect-agent
, normalmente instalada no cluster no namespace
gke-connect
. Coletar registros desse agente do Connect
pode ser útil para solucionar problemas de registro e conexão.
É possível recuperar os registros do agente executando o seguinte comando (ajuste o número de linhas, se necessário):
kubectl logs -n gke-connect -l app=gke-connect-agent --tail=-1
Para informações sobre cada agente do Connect em execução nos clusters de projeto, siga estas etapas:
kubectl describe deployment --all-namespaces -l app=gke-connect-agent
Uma conexão bem-sucedida terá entradas semelhantes ao exemplo abaixo:
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...
Como coletar registros do serviço de identidade do GKE
Inspecionar os registros do serviço de identidade do GKE pode ser útil se você estiver com problemas nos Grupos do Google ou no suporte de terceiros do gateway do Connect. Esse método de geração de registros só é aplicável a clusters em implantações do Google Distributed Cloud no VMware ou em bare metal.
Para aumentar o nível de detalhes dos registros do serviço de identidade do GKE, edite o recurso personalizado clientconfig com o seguinte comando:
kubectl edit deployment -n anthos-identity-service
e adicionando uma flag
vmodule
no campocontainers
da seguinte maneira:spec: containers: ... - command: - --vmodule=cloud/identity/hybrid/charon/*=9
Reinicie o pod do serviço de identidade do GKE excluindo-o com o seguinte comando:
kubectl delete pods -l k8s-app=ais -n anthos-identity-service
Ele deve aparecer novamente em alguns segundos.
Depois que o pod for reiniciado, execute o comando original que estava retornando uma resposta inesperada para preencher os registros do pod do serviço de identidade do GKE com mais detalhes.
Salve a saída desses registros em um arquivo usando o seguinte comando:
kubectl logs -l k8s-app=ais -n anthos-identity-service --tail=-1 > gke_id_service_logs.txt
Se os grupos esperados não estiverem nos registros do pod do serviço de identidade do GKE, verifique se a configuração do cluster está correta. Se houver outros problemas relacionados ao serviço de identidade do GKE, consulte Resolver problemas de acesso do usuário ou Resolver problemas de configuração no nível da frota.
tls: oversized record
erros
- Sintoma
Talvez você encontre um erro 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
- Causas possíveis
Isso pode significar que o agente do Connect está tentando se conectar por meio de HTTPS a um proxy somente HTTP. O agente do Connect é compatível apenas com proxies HTTP baseados no CONNECT.
- Resolução
Você precisa redefinir as variáveis de ambiente do proxy como o seguinte:
http_proxy=http://[PROXY_URL]:[PROXY_PORT] https_proxy=http://[PROXY_URL]:[PROXY_PORT]
oauth2: cannot fetch token
erros
- Sintoma
Talvez você encontre um erro 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
- Causas possíveis
Isso pode significar que o proxy HTTP upstream redefiniu a conexão, provavelmente porque esse URL específico não é permitido por ele. No exemplo acima, "1.1.1.1:80" é o endereço do proxy HTTP.
- Resolução
Verifique se a lista de permissões do proxy HTTP inclui os seguintes URLs/domínios:
gkeconnect.googleapis.com oauth2.googleapis.com/token www.googleapis.com/oauth2/v1/certs
Erros de falha e reinicialização do pod do Connect Agent
- Sintoma
É possível encontrar erros intermitentes de "Agente inalcançável" no console do Google Cloud para seu cluster e/ou você pode descobrir que o pod foi reiniciado várias vezes:
$ 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 resolver esse comportamento, descreva o pod para ver se o último estado foi encerrado devido a um erro de falta de memória (OOMKilled):
kubectl describe pods/gke-connect-agent-20230706-03-00-6b8f75dd58-dzwmt -n gke-connect
<some details skipped..>
Last State: Terminated
Reason: OOMKilled
- Causas possíveis
- Por padrão, os pods do Connect Agent têm um limite de RAM de 256 MiB. Se o cluster tiver instalado muitas cargas de trabalho, é possível que algumas das solicitações e respostas não sejam processadas como esperado.
- Resolução
Atualize a implantação do agente do Connect e conceda a ele um limite de memória maior, por exemplo:
containers: name: gke-connect-agent-20230706-03-00 resources: limits: memory: 512Mi
PermissionDenied
erros
- Sintoma
Talvez você encontre um erro 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
- Causas possíveis
Isso pode significar que você não vinculou o papel necessário de gerenciamento de identidade e acesso (IAM, na sigla em inglês) à conta de serviço do Google Cloud criada para autorizar o agente do Connect a se conectar ao Google. A conta de serviço do Google Cloud requer o papel do IAM
gkehub.connect
.Isso também pode acontecer se você excluir e recriar a conta de serviço do Google Cloud com o mesmo nome. Você também precisa excluir e recriar a vinculação de papel do IAM nesse caso. Consulte Como excluir e recriar contas de serviço para mais informações.
- Resolução
Vincule o papel
gkehub.connect
à sua conta de serviço (observe que o papelgkehub.admin
não tem as permissões adequadas para se conectar e não deve ser usado pelas contas de serviço).Por exemplo, para um projeto chamado
my-project
e uma conta de serviço do Google Cloud chamadagkeconnect@my-project.iam.gserviceaccount.com
, você executaria o seguinte comando para vincular o papel à conta de serviço:gcloud projects add-iam-policy-binding my-project --member \ serviceAccount:gkeconnect@my-project.iam.gserviceaccount.com \ --role "roles/gkehub.connect"
É possível ver e verificar se as permissões da conta de serviço foram aplicadas a uma conta de serviço do Google Cloud examinando a saída do comando a seguir. Você verá o
role: roles/gkehub.connect
vinculado à conta de serviço do Google Cloud associada.gcloud projects get-iam-policy my-project
Erro ao vincular o papel do IAM à conta de serviço do Google Cloud
- Sintoma
Talvez você encontre um erro 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.
- Causas possíveis
Talvez você não tenha as permissões do IAM para executar o comando
gcloud projects add-iam-policy-binding
.- Resolução
Você precisa ter a permissão
resourcemanager.projects.setIamPolicy
. Se você tiver os papéisProject IAM Admin
,Owner
ouEditor
, será possível executar o comando. Se uma política de segurança interna proibir a execução, consulte seu administrador.
Erro de chave de conta de serviço inválida
- Sintoma
Talvez você encontre um erro como este:
2020/05/08 01:22:21.435104 environment.go:214: Got ExternalID 3770f509-b89b-48c4-96e0-860bb70b3a58 from namespace kube-system. 2020/05/08 01:22:21.437976 environment.go:485: Using gcp Service Account key 2020/05/08 01:22:21.438140 gkeconnect_agent.go:50: error creating kubernetes connect agent: failed to get tunnel config: unexpected end of JSON input
- Causas possíveis
Esses registros indicam que o agente do Connect foi fornecido com uma chave de conta de serviço inválida durante a instalação.
- Resolução
Crie um novo arquivo JSON com as credenciais da conta de serviço e reinstale o agente do Connect seguindo as etapas para registrar um cluster.
Erro de chave da conta de serviço expirada
- Sintoma
Talvez você encontre um erro como este:
2020/05/08 01:22:21.435104 dialer.go:277: dialer: dial: connection to gkeconnect.googleapis.com:443 failed after 37.901608ms: serve: egress call failed: rpc error: code = Unauthenticated desc = transport: oauth2: cannot fetch token: 400 Bad Request Response: {"error":"invalid_grant","error_description":"Invalid JWT Signature."}
- Causas possíveis
Esses registros indicam que o agente do Connect estava chamando o Connect com uma chave de conta de serviço inválida. O arquivo da chave da conta de serviço pode conter erros ou a chave pode ter expirado.
Para verificar se a chave expirou, use o console do Google Cloud para listar as chaves da conta de serviço e as datas de validade delas.
- Resolução
Crie um novo arquivo JSON com as credenciais da conta de serviço e reinstale o agente do Connect seguindo as etapas para registrar um cluster.
Erro do relógio do sistema distorcido
- Sintoma
Talvez você encontre um erro como este:
acceptCall: failed to parse token in req [rpc_id=1]: Token used before issued [rpc_id=1]
- Causas possíveis
A mensagem de registro geralmente indica que há um desvio do relógio no cluster. O token emitido pelo cluster tem um carimbo de data/hora fora de sincronia e, portanto, o token é rejeitado.
- Resolução
Para ver se o relógio não está sincronizado corretamente. É possível executar o comando
date
no cluster e compará-lo ao tempo padrão. Normalmente, alguns segundos de deslocamento causam esse problema. Para resolver esse problema, sincronize novamente o relógio do cluster.
Não é possível ver as cargas de trabalho no Console do Google Cloud
- Sintomas
Nos registros do agente do Connect, talvez você encontre os seguintes erros:
"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"`
- Causas possíveis
Esses registros indicam que o Google Cloud está tentando acessar o cluster usando as credenciais fornecidas durante o registro. Erros 403 indicam que as credenciais não têm as permissões necessárias para acessar o cluster.
- Resolução
Verifique se o token e a conta estão vinculados e certifique-se de que tenham as permissões apropriadas no cluster.
Prazo de contexto excedido
- Sintoma
Talvez você encontre um erro 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
- Causas possíveis
Esse erro indica um problema de rede TCP de baixo nível onde o agente do Connect não consegue se comunicar com gkeconnect.googleapis.com.
- Resolução
Verifique se as cargas de trabalho do pod neste cluster podem resolver e ter conectividade de saída para gkeconnect.googleapis.com na porta 443.
A conexão do agente falha intermitentemente
- Sintomas
Nos registros do agente do Connect, talvez você encontre os seguintes erros:
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]
- Causas possíveis
A conexão com o Connect fecha quando o agente do Connect não tem recursos suficientes, por exemplo, em instâncias menores do AWS EC2 como
t3.medium
.- Resolução
Se você usa a AWS e o tipo de instância T3, ative T3 ilimitado ou use um tipo de instância com mais recursos para seus pools de nós.
A frota não pode acessar o projeto
- Sintomas
Durante algumas operações de frota (geralmente registros de cluster), talvez você observe um erro semelhante a este:
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
- Causas possíveis
A conta de serviço padrão da frota,
gcp-sa-gkehub
, pode ser acidentalmente desassociada de um projeto. O Agente de serviço da frota é um papel do IAM que concede à conta de serviço as permissões para gerenciar recursos de cluster. Se você remover essa vinculação de papel da conta de serviço, a conta de serviço padrão ficará desvinculada do projeto, o que poderá impedir o registro de clusters e outras operações do cluster.É possível verificar se a conta de serviço foi removida do seu projeto usando a CLI gcloud ou o Console do Google Cloud. Se o comando ou o painel não exibe
gcp-sa-gkehub
nas suas contas de serviço, a conta de serviço está desvinculada.
gcloud
Execute este comando:
gcloud projects get-iam-policy PROJECT_NAME
em que PROJECT_NAME
é o nome do projeto em que você está tentando registrar o cluster.
Console
Acesse a página IAM e administrador no Console do Google Cloud.
- Resolução
Se você removeu a vinculação de papel do Agente de serviço da frota, execute os seguintes comandos para restaurar a vinculação de papel:
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 a ligação do papel foi concedida:
gcloud projects get-iam-policy PROJECT_NAME
Se o nome da conta de serviço estiver com a função
gkehub.serviceAgent
, a vinculação de papel foi concedida. Por exemplo:- members: - serviceAccount:service-1234567890@gcp-sa-gkehub.iam.gserviceaccount.com role: roles/gkehub.serviceAgent
Erro ao registrar um cluster do GKE em um projeto que não seja da frota
- Sintomas
Ao registrar um cluster do GKE de um projeto diferente do projeto da frota, talvez você observe um erro semelhante ao seguinte na gcloud CLI:
... message: 'DeployPatch failed'> detail: 'DeployPatch failed' ...
Ele pode ser verificado na geração de registros com os seguintes 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
- Causas possíveis
A conta de serviço padrão da frota não tem as permissões necessárias no projeto do cluster do GKE.
- Resolução
Conceda à conta de serviço padrão da frota as permissões necessárias antes de registrar o cluster.
Erro ao registrar/cancelar o registro de um cluster do GKE ou ao atualizar os detalhes da assinatura de um cluster do GKE registrado durante a rotação de credenciais
- Sintomas
Ao alternar as credenciais do cluster(https://cloud.google.com/kubernetes-engine/docs/how-to/credential-rotation), você pode encontrar erros ao registrar/cancelar o registro de um cluster do GKE ou ao atualizar a assinatura para um cluster registrado do GKE.
ERROR: (gcloud.container.hub.memberships.unregister) "code": 13, "message": "an internal error has occurred"
- Causas possíveis
As credenciais do cluster estão em um estado intermediário em que o serviço de frota não pode acessá-las.
- Resolução
Conclua a rotação antes de registrar/cancelar o registro do cluster ou atualizar a assinatura de um cluster do GKE registrado.
Erro ao desativar a API Fleet
- Sintomas
Ao tentar desativar a API Fleet (
gkehub.googleapis.com
), você poderá ver um erro semelhante a este:Not ready to deactivate the service on this project; ensure there are no more resources managed by this service.
- Causas possíveis
Ainda há clusters registrados no Google Cloud (assinaturas) ou em recursos no nível da frota ativados neste projeto. O cancelamento de todas as assinaturas ou recursos precisa ser cancelado ou desativado.
Para ver os clusters registrados atualmente, siga as instruções em Ver membros da frota.
Para ver todos os recursos ativos no nível da frota do projeto:
gcloud e cURL
$ curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
https://gkehub.googleapis.com/v1alpha/projects/PROJECT_NAME/locations/global/features
em que PROJECT_NAME
é o nome do projeto em que
você está tentando desativar a API Fleet.
Console
Se o GKE Enterprise estiver ativado no seu projeto, acesse Página do Gerenciador de recursos no console do Google Cloud. Os recursos listados como ENABLED são recursos ativos no nível da frota.
- Resolução
Primeiro, cancele o registro de todos os clusters ainda registrados na frota do projeto. Cancele o registro de todos os clusters antes que alguns recursos possam ser desativados.
Depois disso, desative todos os recursos no nível da frota. Atualmente, isso só é possível com a API REST do Fleet.
Desative os recursos no nível da frota que você ativou para o projeto
$ gcloud alpha container hub FEATURE_COMMAND disable
Desativa a autorização e a medição de recursos, que são ativados por padrão.
$ curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -X "DELETE" \ https://gkehub.googleapis.com/v1alpha/projects/PROJECT_NAME/locations/global/features/FEATURE
em que
FEATURE
é o nome do recurso a ser desativado (comoauthorizer
oumetering
).
Permissões de cluster ausentes ao registrar um cluster
- Sintoma:
Ao tentar registrar um cluster com uma conta de usuário ou conta de serviço do Google Cloud, é possível que você receba um erro semelhante a este:
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"
- Possível causa:
A conta que está tentando registrar o cluster não tem o papel de controle de acesso baseado em papéis (RBAC, na sigla em inglês) necessário
cluster-admin
no cluster.- Resolução:
Conceda o papel de RBAC
cluster-admin
à conta antes de registrar o cluster.
Erro Failed to check if the user is a cluster-admin: Unable to connect to the server
ao registrar um cluster
- Sintoma:
Ao tentar registrar um cluster, você pode receber um erro semelhante ao seguinte:
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)
Ou
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
- Possível causa:
A máquina em que você está executando o comando
gcloud
de registro não pode se conectar ao endpoint externo do cluster. Isso geralmente acontece quando você tem um cluster particular com acesso/IP externo desativado, mas o endereço IP externo de sua máquina não está na lista de permissões. O registro de um cluster do GKE deixou de ter esse requisito após a gcloud 407.0.0.- Resolução:
Verifique se a máquina em que você quer executar o comando de registro
gcloud
é capaz de acessar o servidor de API do cluster. Se o cluster não tiver acesso externo ativado, registre um caso com o suporte do Google Cloud.
Como receber mais ajuda
Registre um tíquete no suporte do Google Cloud para o GKE Enterprise seguindo estas etapas:
- Registre um caso no Suporte do Google Cloud.
- Siga as instruções em Como coletar registros do agente do Connect para salvá-los.
- Ao resolver problemas em um cluster local usando Grupos do Google ou o suporte de terceiros, siga as instruções em Como coletar registros do serviço de identidade do GKE para salvar os registros do serviço. Limpe os registros do pod no arquivo salvo, se necessário.
- Anexe os registros relevantes ao seu caso.