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.
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 campocontainers
da seguinte forma:spec: containers: ... - command: - --vmodule=cloud/identity/hybrid/charon/*=9
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.
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.
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çãogkehub.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 denominadagkeconnect@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çõesProject IAM Admin
,Owner
ouEditor
, 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.
Desative as funcionalidades ao nível da frota que ativou para o seu projeto
$ gcloud alpha container hub FEATURE_COMMAND disable
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 (comoauthorizer
oumetering
).
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
gcloud
comando 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:
- Apresente um registo junto do Google Cloud apoio técnico.
- Siga as instruções em Recolher registos do agente de ligação para guardar os registos de ligação.
- 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.
- Anexe os registos relevantes ao seu registo.