Solucionar problemas de conexões de cluster

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.

  1. 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 campo containers da seguinte maneira:

    spec:
      containers:
      ...
      - command:
        - --vmodule=cloud/identity/hybrid/charon/*=9
    
  2. 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.

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

  4. 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 papel gkehub.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 chamada gkeconnect@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éis Project IAM Admin, Owner ou Editor, 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.

  1. Desative os recursos no nível da frota que você ativou para o projeto

    $ gcloud alpha container hub FEATURE_COMMAND disable
    
  2. 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 (como authorizer ou metering).

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:

  1. Registre um caso no Suporte do Google Cloud.
  2. Siga as instruções em Como coletar registros do agente do Connect para salvá-los.
  3. 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.
  4. Anexe os registros relevantes ao seu caso.