Resolva problemas de ligações de clusters

Esta página descreve como resolver problemas comuns que pode encontrar quando regista clusters numa frota ou se liga a clusters fora do Google Cloud usando a Google Cloud consola, a Google Cloud CLI ou kubectl através do gateway Connect.

Os clusters nas instalações e os clusters noutras nuvens públicas dependem do agente Connect para estabelecer e manter uma ligação entre o cluster e o seu Google Cloud projeto, bem como para processar pedidos do Kubernetes. Se vir erros como "Agente inacessível" ou "Falha ao estabelecer ligação ao plano de controlo do cluster", isto pode indicar um problema com o agente Connect.

Recolher registos do agente do Connect

Quando regista um cluster fora Google Cloud, este usa o agente do Connect para processar a comunicação entre o cluster e o projeto anfitrião da frota. O agente Connect é uma implementação, gke-connect-agent, normalmente instalada no seu cluster no espaço de nomes gke-connect. A recolha de registos deste agente do Connect pode ser útil para resolver problemas de registo e ligação.

Pode obter os registos do agente executando o seguinte comando (ajuste a contagem de linhas, se necessário):

kubectl logs -n gke-connect -l app=gke-connect-agent --tail=-1

Para obter informações sobre todos os agentes do Connect em execução nos clusters do seu projeto:

kubectl describe deployment --all-namespaces -l app=gke-connect-agent

Uma ligação bem-sucedida deve 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...

Recolher registos do GKE Identity Service

A inspeção dos registos do serviço de identidade do GKE pode ser útil se tiver problemas com os Grupos Google ou o apoio técnico de terceiros para o gateway do Connect. Este método de geração de registos só é aplicável a clusters em implementações do Google Distributed Cloud no VMware ou em hardware não processado.

  1. Aumente a verbosidade dos registos do GKE Identity Service editando o recurso personalizado clientconfig com o seguinte comando:

    kubectl edit deployment -n anthos-identity-service
    

    e adicionar uma marcação vmodule no campo containers da seguinte forma:

    spec:
      containers:
      ...
      - command:
        - --vmodule=cloud/identity/hybrid/charon/*=9
    
  2. Reinicie o pod do GKE Identity Service eliminando-o com o seguinte comando:

    kubectl delete pods -l k8s-app=ais -n anthos-identity-service
    

    Um pod deve aparecer novamente dentro de alguns segundos.

  3. Assim que o pod for reiniciado, execute o comando original que estava a devolver uma resposta inesperada para preencher os registos do pod do serviço de identidade do GKE com mais detalhes.

  4. Guarde a saída destes registos num ficheiro através do seguinte comando:

    kubectl logs -l k8s-app=ais -n anthos-identity-service --tail=-1 > gke_id_service_logs.txt
    

Se os grupos esperados estiverem em falta nos registos do pod do GKE Identity Service, verifique se a configuração do cluster está correta. Se existirem outros problemas relacionados com o GKE Identity Service, consulte os artigos Resolva problemas de acesso de utilizadores ou Resolução de problemas de configuração ao nível da frota.

tls: oversized record erros

Sintoma

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

Isto pode significar que o agente de ligação está a tentar estabelecer ligação através de HTTPS a um proxy apenas HTTP. O agente de ligação só suporta proxies HTTP baseados em CONNECT.

Resolução

Tem de reconfigurar as variáveis de ambiente do proxy para o seguinte:

http_proxy=http://[PROXY_URL]:[PROXY_PORT]
https_proxy=http://[PROXY_URL]:[PROXY_PORT]

oauth2: cannot fetch token erros

Sintoma

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

Isto pode significar que o proxy HTTP a montante repôs a ligação, muito provavelmente porque o seu proxy HTTP não permite este URL específico. No exemplo acima, 1.1.1.1:80 é o endereço do proxy HTTP.

Resolução

Verifique se a sua lista de autorizações de 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 reinício do pod do agente de ligação

Sintoma

Pode encontrar erros "Agente inacessível" intermitentes na Google Cloud consola para o seu cluster e/ou pode verificar 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 este comportamento, descreva o pod para ver se o respetivo último estado foi terminado 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 predefinição, os pods do agente Connect têm um limite de RAM de 256 MiB. Se o cluster tiver instalado muitas cargas de trabalho, é possível que alguns dos pedidos e respostas não possam ser processados como esperado.
Resolução

Atualize a implementação do agente de ligação e conceda-lhe um limite de memória mais elevado, por exemplo:

containers:
  name: gke-connect-agent-20230706-03-00
  resources:
    limits:
      memory: 512Mi

PermissionDenied erros

Sintoma

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

Isto pode significar que não associou a função de gestão de identidade e acesso (IAM) necessária à Google Cloud conta de serviço que criou para autorizar o agente de ligação a estabelecer ligação à Google. A Google Cloud conta de serviço requer a função do IAM.gkehub.connect

Isto também pode acontecer se eliminar e recriar a conta de serviço com o mesmo nome. Google CloudNesse caso, também tem de eliminar e recriar a associação da função do IAM. Consulte o artigo Eliminar e recriar contas de serviço para mais informações.

Resolução

Associe a função gkehub.connect à sua conta de serviço (tenha em atenção que a função gkehub.admin não tem as autorizações adequadas para a ligação e não se destina a ser usada por contas de serviço).

Por exemplo, para um projeto denominado my-project e uma Google Cloud conta de serviço denominada gkeconnect@my-project.iam.gserviceaccount.com, executaria o seguinte comando para associar a função à conta de serviço:

gcloud projects add-iam-policy-binding my-project --member \
serviceAccount:gkeconnect@my-project.iam.gserviceaccount.com \
--role "roles/gkehub.connect"

Pode ver e verificar se as autorizações da conta de serviço foram aplicadas a uma Google Cloud conta de serviço examinando o resultado do comando seguinte. Deve ver o role: roles/gkehub.connect associado à Google Cloud conta de serviço.

gcloud projects get-iam-policy my-project

Erro ao associar a função de IAM à Google Cloud conta de serviço

Sintoma

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

Pode não ter as autorizações de IAM para executar o comando gcloud projects add-iam-policy-binding.

Resolução

Tem de ter a autorização resourcemanager.projects.setIamPolicy Se tiver as funções Project IAM Admin, Owner ou Editor, deve poder executar o comando. Se uma política de segurança interna lhe proibir de executar o comando, contacte o seu administrador.

Erro devido ao relógio do sistema desfasado

Sintoma

Pode encontrar um erro como este:

acceptCall: failed to parse token in req [rpc_id=1]: Token used before issued [rpc_id=1]
Causas possíveis

Normalmente, a mensagem de registo indica que existe uma discrepância de tempo no cluster. O token emitido pelo cluster tem uma indicação de tempo dessincronizada e, por isso, o token é rejeitado.

Resolução

Para verificar se o relógio não está sincronizado corretamente, pode executar o comando date no cluster e compará-lo com a hora padrão. Normalmente, um desvio de alguns segundos causa este problema. Para resolver este problema, sincronize novamente o relógio do cluster.

Não é possível ver cargas de trabalho na consola Google Cloud

Sintomas

Nos registos do agente de ligação, pode observar 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

Estes registos indicam que Google Cloud está a tentar aceder ao cluster através das credenciais que forneceu durante o registo. Os erros 403 indicam que as credenciais não têm as autorizações necessárias para aceder ao cluster.

Resolução

Verifique se o token e a conta à qual está associado têm as autorizações adequadas no cluster.

Prazo do contexto excedido

Sintoma

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

Este erro indica um problema de rede TCP de baixo nível em que o agente de ligação não consegue comunicar com gkeconnect.googleapis.com.

Resolução

Verifique se as cargas de trabalho do Pod neste cluster conseguem resolver e têm conetividade de saída para gkeconnect.googleapis.com na porta 443.

A ligação do agente falha intermitentemente

Sintomas

Nos registos do agente de ligação, pode observar 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 ligação ao Connect é fechada quando o agente do Connect não tem recursos suficientes, por exemplo, em instâncias do AWS EC2 mais pequenas, como t3.medium.

Resolução

Se usar a AWS e o tipo de instância T3, ative o T3 ilimitado ou use um tipo de instância com mais recursos para os seus conjuntos de nós.

O Fleet não consegue aceder ao projeto

Sintomas

Durante algumas operações da frota (normalmente, o registo do cluster), pode observar um erro semelhante ao seguinte:

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 predefinida do Fleet, gcp-sa-gkehub, pode ser desvinculada acidentalmente de um projeto. O agente do serviço de frota é uma função do IAM que concede à conta de serviço as autorizações para gerir recursos do cluster. Se remover esta associação de funções da conta de serviço, a conta de serviço predefinida deixa de estar associada ao projeto, o que pode impedir o registo de clusters e outras operações de cluster.

Pode verificar se a conta de serviço foi removida do seu projeto através da CLI gcloud ou da Google Cloud consola. Se o comando ou o painel de controlo não apresentarem gcp-sa-gkehub entre as suas contas de serviço, significa que a conta de serviço foi desvinculada.

gcloud

Execute o seguinte comando:

gcloud projects get-iam-policy PROJECT_NAME

onde PROJECT_NAME é o nome do projeto onde está a tentar registar o cluster.

Consola

Visite a página IAM e administrador na Google Cloud consola.

Resolução

Se removeu a associação da função de agente do serviço de frota, execute os seguintes comandos para restaurar a associação da função:

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 associação de funções foi concedida:

gcloud projects get-iam-policy PROJECT_NAME

Se vir o nome da conta de serviço juntamente com a função gkehub.serviceAgent, significa que a associação de funções foi concedida. Por exemplo:

- members:
  - serviceAccount:service-1234567890@gcp-sa-gkehub.iam.gserviceaccount.com
  role: roles/gkehub.serviceAgent

Erro ao registar um cluster do GKE a partir de um projeto diferente do Fleet

Sintomas

Ao registar um cluster do GKE a partir de um projeto diferente do projeto da frota, pode observar um erro semelhante ao seguinte na CLI gcloud:

...
message: 'DeployPatch failed'>
detail: 'DeployPatch failed'
...

Pode ser validado no registo aplicando 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 predefinida da frota não tem as autorizações necessárias no projeto do cluster do GKE.

Resolução

Conceda à conta de serviço predefinida do Fleet as autorizações necessárias antes de registar o cluster.

Erro ao registar/anular o registo de um cluster do GKE ou ao atualizar os detalhes da subscrição da frota para um cluster do GKE registado durante a rotação de credenciais

Sintomas

Ao rodar as credenciais do cluster(https://cloud.google.com/kubernetes-engine/docs/how-to/credential-rotation), pode encontrar erros se registar/anular o registo de um cluster do GKE ou atualizar a associação de um cluster do GKE registado.

ERROR: (gcloud.container.hub.memberships.unregister) "code": 13,
"message": "an internal error has occurred"
Causas possíveis

As credenciais do cluster estão num estado intermédio em que o serviço Fleet não consegue aceder às mesmas.

Resolução

Conclua a rotação antes de registar/anular o registo do cluster ou atualizar a associação para um cluster do GKE registado.

Erro ao desativar a API Fleet

Sintomas

Ao tentar desativar a API Fleet (gkehub.googleapis.com), pode encontrar um erro semelhante ao seguinte:

Not ready to deactivate the service on this project; ensure there are no more resources managed by this service.
Causas possíveis

Continuam a existir clusters registados no Google Cloud (associações) ou funcionalidades ao nível da frota ativadas neste projeto. Todas as subscrições ou funcionalidades têm de ser anuladas ou desativadas antes de a API poder ser desativada.

  • Para ver os clusters registados atualmente, siga as instruções em Ver membros da frota

  • Para ver todas as funcionalidades ativas ao nível da frota para o seu projeto:

gcloud e cURL

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

onde PROJECT_NAME é o nome do projeto no qual está a tentar desativar a Fleet API.

Consola

Se tiver o GKE ativado no seu projeto, visite a página do Gestor de funcionalidades na consola Google Cloud . As funcionalidades apresentadas como ATIVADAS são funcionalidades ativas ao nível da frota.

Resolução

Primeiro, anule o registo de todos os clusters que ainda estejam registados na sua frota de projetos. Todos os clusters têm de ser anularmente registados antes de algumas funcionalidades poderem ser desativadas.

Depois de o fazer, desative todas as funcionalidades ao nível da frota. Atualmente, isto só é possível com a API REST Fleet.

  1. Desative as funcionalidades ao nível da frota que ativou para o seu projeto

    $ gcloud alpha container hub FEATURE_COMMAND disable
    
  2. Desative a autorização e a medição de funcionalidades, que estão ativadas por predefinição.

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

    onde FEATURE é o nome da funcionalidade a desativar (como authorizer ou metering).

Autorizações de cluster em falta ao registar um cluster

Sintoma:

Ao tentar registar um cluster com uma conta de utilizador ou uma Google Cloud conta de serviço, pode receber um erro semelhante ao seguinte:

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"
Causa possível:

A conta que está a tentar registar o cluster não tem a função de cluster-admin controlo de acesso baseado em funções (CABF) necessária no cluster.

Resolução:

Conceda a função RBAC à conta antes de registar o cluster.cluster-admin

Erro Failed to check if the user is a cluster-admin: Unable to connect to the server ao registar um cluster

Sintoma:

Ao tentar registar um cluster, 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
Causa possível:

A máquina na qual está a executar o comando gcloud de registo não consegue estabelecer ligação ao ponto final externo do cluster. Isto acontece normalmente se tiver um cluster privado com acesso/IP externo desativado, mas o endereço IP externo da sua máquina não estiver na lista de permissões. Tenha em atenção que o registo de um cluster do GKE não tem este requisito após o gcloud 407.0.0.

Resolução:

Certifique-se de que a máquina na qual quer executar o gcloudcomando de registo consegue aceder ao servidor da API do cluster. Se o seu cluster não tiver o acesso externo ativado, apresente um registo junto do Google Cloud apoio técnico.

Erro: não é permitido eliminar uma subscrição gerida pela Google

Depois de registar o cluster numa frota, este torna-se um membro da frota com um nome de membro da frota exclusivo. Se tentar eliminar esta subscrição executando o comando gcloud container hub memberships delete MEMBERSHIP_NAME, pode ser apresentado o seguinte erro:

ERROR: (gcloud.container.hub.memberships.delete) FAILED_PRECONDITION: membership "projects/PROJECT_ID/locations/us-centrall/memberships/MEMBERSHIP_NAME" is a managed resource of your cluster. Deleting a google-managed membership directly is not allowed. Please offboard your fleet membership via cluster API: failed precondition

Para eliminar corretamente uma subscrição da frota, siga as instruções em Anular o registo de um cluster.

Receber ajuda adicional

Pode apresentar um pedido junto do Google Cloud apoio técnico do GKE através dos seguintes passos:

  1. Apresente um registo junto do Google Cloud apoio técnico.
  2. Siga as instruções em Recolher registos do agente de ligação para guardar os registos de ligação.
  3. Se estiver a resolver problemas de um cluster no local com os Grupos Google ou o apoio técnico de terceiros, siga as instruções em Recolher registos do GKE Identity Service para guardar os registos do GKE Identity Service. Certifique-se de que limpa os registos do pod no ficheiro guardado, se necessário.
  4. Anexe os registos relevantes ao seu registo.