Solução de problemas

Como coletar registros do agente do Connect

O agente do Connect é uma implantação, gke-connect-agent, que conecta os clusters ao Google. Normalmente, ele é instalado no cluster, no namespace gke-connect. A coleta dos registros desse agente do Connect serve para solucionar problemas.

Para recuperar os registros do agente, execute o seguinte comando:

for ns in $(kubectl get ns -o jsonpath={.items..metadata.name} -l hub.gke.io/project); do
  echo "======= Logs $ns ======="
  kubectl logs -n $ns -l app=gke-connect-agent
done

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

Erros tls: oversized record

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]

Erros oauth2: cannot fetch token

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 PermissionDenied

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 Conta de serviço inválida durante a instalação.

Resolução

Crie um novo arquivo JSON contendo credenciais de conta de serviço e siga as etapas para registrar um cluster novamente para reinstalar o agente do Connect.

Erro da chave de 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 ligou para o Connect com uma chave problemática da conta de serviço, que não é aceitável pelo serviço de autenticação do Google. O arquivo de chave da conta de serviço pode estar corrompido ou a chave expirou.

Para garantir que a chave tenha expirado, localize a "data de validade da chave" na página de detalhes de uma conta de serviço no Console do Google Cloud. Em alguns casos, seu projeto/org pode ter alguma política especial que uma conta de serviço só pode ter um ciclo de vida curto por padrão.

Resolução

Crie um novo arquivo JSON contendo credenciais de conta de serviço e siga as etapas para registrar um cluster novamente para reinstalar o agente do Connect.

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

Ative o T3 ilimitado ou use um tipo de instância com mais recursos para os pools de nós.

O hub não pode acessar o projeto

Sintomas

Durante algumas operações do Hub (geralmente registros de cluster), talvez você observe um erro semelhante a este:

ERROR: (gcloud.container.hub.memberships.register) failed to initialize Default Feature
"authorizer", the Hub service account may not have access to your project
Causas possíveis

A conta de serviço padrão do Hub, gcp-sa-gkehub, pode ser acidentalmente desassociada de um projeto. O Agente de serviço do hub é 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 ferramenta gcloud ou o Console do 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 Cloud.

Resolução

Se você removeu a vinculação de papel do Agente de serviço do Hub, 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. 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 diferente do Hub

Sintomas

Ao registrar um cluster do GKE de um projeto diferente do projeto Hub, é possível que você observe um erro semelhante ao seguinte:

ERROR: (gcloud.container.hub.memberships.register) hub default service account
does not have access to the GKE cluster project for //container.googleapis.com/v1/projects/my-project/zones/zone-a/clusters/my-cluster
Causas possíveis

A conta de serviço padrão do Hub não tem as permissões necessárias no projeto do cluster do GKE.

Resolução

Conceda à conta de serviço padrão do Hub as permissões necessárias antes de registrar o cluster.

Erro ao desativar a API Hub

Sintomas

Ao tentar desativar a API Hub (gkehub.googleapis.com), você 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 do ambiente ativados neste projeto. O cancelamento de todas as assinaturas ou recursos precisa ser cancelado ou desativado.

gcloud e cURL

$ curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://gkehub.googleapis.com/v1alpha1/projects/PROJECT_NAME/locations/global/features

em que PROJECT_NAME é o nome do projeto em que você está tentando desativar a API Hub.

Cloud Console

Se o Anthos estiver ativado no seu projeto, visite a página Visão geral dos recursos no Console do Cloud. Os recursos listados como ENABLED são recursos ativos no nível do ambiente.

Resolução

Primeiro, cancele o registro de todos os clusters ainda registrados no ambiente 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 do ambiente. Atualmente, isso só é possível com a API REST do Hub.

  1. Desativar os recursos no nível do ambiente que você ativou no 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/v1alpha1/projects/PROJECT_NAME/locations/global/FEATURE
    

    em que FEATURE é o nome do recurso a ser desativado (como authorizer ou metering).

Como receber mais ajuda

É possível registrar um tíquete com o suporte do Google Cloud para o Connect, executando as seguintes 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. Anexe os registros do agente do Connect ao caso.