Résoudre les problèmes de connexion aux clusters

Cette page explique comment résoudre les erreurs courantes que vous pouvez rencontrer lors de l'enregistrement de clusters dans un parc ou de la connexion à des clusters en dehors de Google Cloud à l'aide de la console Google Cloud, de Google Cloud CLI ou kubectl via la Passerelle Connect.

Les clusters sur site et les clusters sur d'autres clouds publics dépendent de l'agent Connect pour établir et maintenir une connexion entre le cluster et votre projet Google Cloud, ainsi que pour traiter les requêtes Kubernetes. Si des erreurs telles que "Agent inaccessible" ou "Échec de la connexion au plan de contrôle du cluster" s'affichent, cela peut indiquer un problème avec l'agent Connect.

Collecte des journaux Connect Agent

Lorsque vous enregistrez un cluster en dehors de Google Cloud, il utilise l'agent Connect pour gérer la communication entre votre cluster et votre projet hôte de parc. L'agent Connect est un déploiement, gke-connect-agent, généralement installé dans votre cluster dans l'espace de noms gke-connect. La collecte des journaux à partir de cet agent permet de résoudre les problèmes d'enregistrement et de connexion.

Vous pouvez récupérer les journaux de l'agent en exécutant la commande suivante (ajustez le nombre de lignes si nécessaire) :

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

Pour obtenir des informations sur chaque agent Connect exécuté dans les clusters de votre projet, procédez comme suit :

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

Une connexion réussie doit renvoyer des entrées semblables à cet exemple :

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

Collecter les journaux d'identité de service GKE

L'inspection des journaux d'identité de service GKE peut être utile si vous rencontrez des problèmes avec Google Groupes ou l'assistance tierce pour la passerelle Connect. Cette méthode de génération de journaux ne s'applique qu'aux clusters des déploiements Google Distributed Cloud sur VMware ou Bare Metal.

  1. Augmentez la verbosité des journaux d'identité de service GKE en modifiant la ressource personnalisée clientconfig à l'aide de la commande suivante:

    kubectl edit deployment -n anthos-identity-service
    

    et en ajoutant une option vmodule sous le champ containers comme ceci:

    spec:
      containers:
      ...
      - command:
        - --vmodule=cloud/identity/hybrid/charon/*=9
    
  2. Redémarrez le pod d'identité de service GKE en le supprimant à l'aide de la commande suivante:

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

    Un pod devrait être réactivé en quelques secondes.

  3. Une fois le pod redémarré, exécutez la commande d'origine qui renvoie une réponse inattendue afin de renseigner plus de détails dans les journaux du pod d'identité de service GKE.

  4. Enregistrez le résultat de ces journaux dans un fichier à l'aide de la commande suivante:

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

Si les groupes attendus ne figurent pas dans les journaux du pod d'identité de service GKE, vérifiez que la configuration du cluster est correcte. S'il existe d'autres problèmes liés à l'identité de service GKE, consultez la page Résoudre les problèmes d'accès des utilisateurs ou Résoudre les problèmes de configuration au niveau du parc.

tls: oversized record erreurs

Symptôme

Vous pourriez rencontrer une erreur semblable à ceci :

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

L'agent Connect tente de se connecter via HTTPS à un proxy qui n'accepte que les connexions HTTP. L'agent Connect n'est compatible qu'avec les proxys HTTP basés sur CONNECT.

Solution

Vous devez reconfigurer vos variables d'environnement proxy de la manière suivante :

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

oauth2: cannot fetch token erreurs

Symptôme

Vous pourriez rencontrer une erreur semblable à ceci :

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

Le proxy HTTP en amont a peut-être réinitialisé la connexion, car cette URL particulière n'est pas autorisée par votre proxy HTTP. Dans l'exemple ci-dessus, 1.1.1.1:80 est l'adresse du proxy HTTP.

Solution

Vérifiez que votre liste d'autorisation de proxy HTTP inclut les URL ou les domaines suivants :

gkeconnect.googleapis.com
oauth2.googleapis.com/token
www.googleapis.com/oauth2/v1/certs

Erreurs de plantage et de redémarrage du pod Connect Agent

Symptôme

Vous pouvez rencontrer des erreurs intermittentes "Agent inaccessible" dans la console Google Cloud pour votre cluster et/ou vous constaterez peut-être que le pod a redémarré plusieurs fois:

$ kubectl get pods -n gke-connect
NAME                                                READY   STATUS    RESTARTS   AGE
gke-connect-agent-20230706-03-00-6b8f75dd58-dzwmt   1/1     Running   5          99m

Pour résoudre ce problème, décrivez le pod pour voir si son dernier état a été arrêté en raison d'une erreur de mémoire saturée (OOMKilled). :

  kubectl describe pods/gke-connect-agent-20230706-03-00-6b8f75dd58-dzwmt -n gke-connect
        <some details skipped..>
        Last State:     Terminated
        Reason:       OOMKilled
Causes possibles
Par défaut, les pods de l'agent Connect disposent d'une limite de RAM de 256 Mio. Si le cluster a installé de nombreuses charges de travail, il est possible que certaines requêtes et réponses ne puissent pas être traitées comme prévu.
Solution

Mettez à jour le déploiement de Connect Agent et accordez-lui une limite de mémoire plus élevée, par exemple:

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

PermissionDenied erreurs

Symptôme

Vous pourriez rencontrer une erreur semblable à ceci :

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

Vous n'avez pas lié le rôle Identity and Access Management (IAM) requis au compte de service Google Cloud que vous avez créé pour autoriser l'agent Connect à se connecter à Google. Le compte de service Google Cloud nécessite le rôle IAM gkehub.connect.

Cela peut également se produire si vous supprimez et recréez le compte de service Google Cloud du même nom. Dans ce cas, vous devez également supprimer et recréer la liaison de rôle IAM. Pour en savoir plus, consultez la section Supprimer et recréer des comptes de service.

Solution

Liez le rôle gkehub.connect à votre compte de service (notez que le rôle gkehub.admin ne dispose pas des autorisations nécessaires pour se connecter et qu'il n'est pas conçu pour être utilisé par des comptes de service).

Par exemple, pour un projet nommé my-project et un compte de service Google Cloud appelé gkeconnect@my-project.iam.gserviceaccount.com, exécutez la commande suivante pour lier le rôle au compte de service :

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

Vous pouvez afficher les autorisations du compte de service et vérifier qu'elles ont été appliquées à un compte de service Google Cloud en examinant le résultat de la commande ci-dessous. Le rôle role: roles/gkehub.connect devrait être lié au compte de service Google Cloud associé.

gcloud projects get-iam-policy my-project

Erreur lors de la liaison du rôle IAM au compte de service Google Cloud

Symptôme

Vous pourriez rencontrer une erreur semblable à ceci :

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

Vous ne disposez peut-être pas des autorisations IAM nécessaires pour exécuter la commande gcloud projects add-iam-policy-binding.

Solution

Vous devez disposer de l'autorisation resourcemanager.projects.setIamPolicy. Si vous disposez des rôles Project IAM Admin, Owner ou Editor, vous devriez pouvoir exécuter la commande. Si vous n'y parvenez pas en raison d'une règle de sécurité interne, contactez votre administrateur.

Erreur liée à une clé de compte de service non valide

Symptôme

Vous pourriez rencontrer une erreur semblable à ceci :

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

Ces journaux indiquent que l'agent Connect a été fourni avec une clé de compte de service non valide lors de l'installation.

Solution

Créez un fichier JSON contenant les identifiants du compte de service, puis réinstallez l'agent Connect en suivant la procédure pour enregistrer un cluster.

Erreur liée à une clé de compte de service arrivée à expiration

Symptôme

Vous pourriez rencontrer une erreur semblable à ceci :

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."}
Causes possibles

Ces journaux indiquent que l'agent Connect appelait Connect avec une clé de compte de service non valide. Le fichier de clé du compte de service peut contenir des erreurs ou la clé peut avoir expiré.

Pour vérifier si la clé a expiré, utilisez la console Google Cloud pour répertorier vos clés de compte de service et leurs les dates d'expiration.

Solution

Créez un fichier JSON contenant les identifiants du compte de service puis réinstallez l'agent Connect en suivant la procédure pour enregistrer un cluster.

Erreur suite à une horloge système faussée

Symptôme

Vous pourriez rencontrer une erreur semblable à ceci :

acceptCall: failed to parse token in req [rpc_id=1]: Token used before issued [rpc_id=1]
Causes possibles

Le message du journal indique généralement un décalage d'horloge sur le cluster. Le jeton émis par le cluster dispose d'un horodatage non synchronisé, et est par conséquent refusé.

Solution

Pour vérifier si l'horloge n'est pas correctement synchronisée, Vous pouvez exécuter la commande date sur votre cluster et la comparer à l'heure normale. En règle générale, un décalage de quelques secondes entraînera ce problème. Pour le résoudre, resynchronisez l'horloge de votre cluster.

Les charges de travail ne s'affichent pas dans la console Google Cloud

Symptômes

Les journaux de Connect Agent peuvent signaler les erreurs suivantes :

"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"`
Causes possibles

Ces journaux indiquent que Google Cloud tente d'accéder au cluster à l'aide des identifiants fournis lors de l'enregistrement. Les erreurs 403 indiquent que les identifiants ne disposent pas des autorisations nécessaires pour accéder au cluster.

Solution

Vérifiez le jeton et le compte auquel il est associé et assurez-vous qu'il dispose des autorisations appropriées sur le cluster.

Date limite du contexte dépassée

Symptôme

Vous pourriez rencontrer une erreur semblable à ceci :

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

Cette erreur indique un problème de mise en réseau TCP de bas niveau où l'agent Connect ne peut pas communiquer avec gkeconnect.googleapis.com.

Solution

Vérifiez que les charges de travail des pod de ce cluster peuvent résoudre gkeconnect.googleapis.com sur le port 443 et disposent d'une connectivité sortante sur cette adresse.

Échec intermittent de connexion de l'agent

Symptômes

Les journaux de Connect Agent peuvent signaler les erreurs suivantes :

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]
Causes possibles

La connexion à Connect se ferme lorsque l'agent Connect ne dispose pas de ressources suffisantes, par exemple sur des instances AWS EC2 plus petites telles que t3.medium.

Solution

Si vous utilisez AWS et le type d'instance T3, activez T3 illimité ou utilisez un type d'instance avec plus de ressources. pour vos pools de nœuds.

Fleet ne peut pas accéder au projet

Symptômes

Lors de certaines opérations Fleet (généralement l'enregistrement du cluster), vous pouvez rencontrer une erreur semblable à celle-ci :

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

Le compte de service par défaut de Fleet, gcp-sa-gkehub, peut être dissocié accidentellement d'un projet. L'agent de service Fleet est un rôle IAM qui accorde au compte de service les autorisations nécessaires pour gérer les ressources du cluster. Si vous supprimez cette liaison de rôle du compte de service, le compte de service par défaut est dissocié du projet, ce qui peut vous empêcher d'enregistrer des clusters et d'effectuer d'autres opérations sur ceux-ci.

Vous pouvez vérifier si le compte de service a été supprimé de votre projet à l'aide de gcloud CLI ou de la console Google Cloud. Si la commande ou le tableau de bord n'affiche pas gcp-sa-gkehub parmi vos comptes de service, c'est que ce compte a été dissocié.

gcloud

Exécutez la commande suivante :

gcloud projects get-iam-policy PROJECT_NAME

PROJECT_NAME est le nom du projet dans lequel vous essayez d'enregistrer le cluster.

Console

Accédez à la page IAM et admin dans la console Google Cloud.

Solution

Si vous avez supprimé la liaison de rôle d'agent de service Fleet, exécutez les commandes suivantes pour la restaurer :

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

Pour confirmer que la liaison de rôle a été activée :

gcloud projects get-iam-policy PROJECT_NAME

Si vous voyez le nom du compte de service avec le rôle gkehub.serviceAgent, la liaison de rôle a été activée. Exemple :

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

Erreur lors de l'enregistrement d'un cluster GKE à partir d'un projet différent de Fleet

Symptômes

Lorsque vous enregistrez un cluster GKE à partir d'un projet différent du projet Fleet, vous pouvez rencontrer une erreur semblable à celle-ci dans gcloud CLI:

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

Vous pouvez le vérifier dans la journalisation en appliquant les filtres suivants:

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

Causes possibles

Le compte de service Fleet par défaut ne dispose pas des autorisations requises dans le projet du cluster GKE.

Solution

Accordez au compte de service Fleet par défaut les autorisations requises avant d'enregistrer le cluster.

Erreur lors de l'enregistrement/de l'annulation de l'enregistrement d'un cluster GKE ou de la mise à jour des détails d'appartenance à un parc pour un cluster GKE enregistré lors de la rotation des identifiants

Symptômes

Lors de la rotation des identifiants de votre cluster (https://cloud.google.com/kubernetes-engine/docs/how-to/credential-rotation), vous pouvez rencontrer des erreurs si vous enregistrez ou annulez l'enregistrement d'un cluster GKE ou si vous mettez à jour l'appartenance pour un cluster GKE enregistré.

ERROR: (gcloud.container.hub.memberships.unregister) "code": 13,
"message": "an internal error has occurred"
Causes possibles

Les identifiants du cluster sont dans un état intermédiaire où le service de parc ne peut pas y accéder.

Solution

Terminez la rotation avant d'enregistrer le cluster ou d'annuler son enregistrement, ou de mettre à jour l'appartenance à un cluster GKE enregistré.

Erreur lors de la désactivation de l'API Fleet

Symptômes

Lorsque vous essayez de désactiver l'API Fleet (gkehub.googleapis.com), vous pouvez rencontrer une erreur semblable à celle-ci :

Not ready to deactivate the service on this project; ensure there are no more resources managed by this service.
Causes possibles

Des clusters sont toujours enregistrés sur Google Cloud (appartenances) ou avec des fonctionnalités au niveau du parc activées dans ce projet. Toutes les appartenances ou fonctionnalités doivent être désinscrites ou désactivées pour que l'API puisse être désactivée.

  • Pour afficher les clusters actuellement enregistrés, suivez les instructions de la page Afficher les membres du parc.

  • Pour voir toutes les fonctionnalités actives au niveau du parc de votre projet, procédez comme suit :

gcloud et cURL

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

PROJECT_NAME est le nom du projet dans lequel vous essayez de désactiver l'API Fleet.

Console

Si GKE Enterprise est activé dans votre projet, consultez la page Gestionnaire de fonctionnalités dans la console Google Cloud. Les fonctionnalités répertoriées comme ENABLED sont des fonctionnalités actives au niveau du parc.

Solution

Tout d'abord, annulez l'enregistrement de tous les clusters encore enregistrés dans le parc de votre projet. Tous les clusters doivent être désenregistrés pour que certaines fonctionnalités puissent être désactivées.

Désactivez ensuite toutes les fonctionnalités au niveau du parc. Actuellement, cela n'est possible qu'avec l'API REST Fleet.

  1. Désactiver les fonctionnalités au niveau du parc que vous avez activées pour votre projet

    $ gcloud alpha container hub FEATURE_COMMAND disable
    
  2. Désactiver les outils d'activation et de mesure des fonctionnalités, qui sont activés par défaut.

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

    FEATURE est le nom de la fonctionnalité à désactiver (par exemple, authorizer ou metering).

Autorisations de cluster manquantes lors de l'enregistrement d'un cluster

Symptôme :

Lorsque vous essayez d'enregistrer un cluster avec un compte utilisateur ou un compte de service Google Cloud, vous obtenez peut-être une erreur semblable à celle-ci :

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"
Cause possible :

Le compte qui tente d'enregistrer le cluster ne dispose pas du rôle RBAC (contrôle des accès basé sur les rôles) cluster-admin sur le cluster, alors que celui-ci est requis.

Résolution :

Accordez le rôle RBAC cluster-admin au compte avant d'enregistrer le cluster.

Erreur Failed to check if the user is a cluster-admin: Unable to connect to the server lors de l'enregistrement d'un cluster

Symptôme :

Lorsque vous essayez d'enregistrer un cluster, vous obtenez peut-être une erreur semblable à celle-ci :

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
Cause possible :

La machine sur laquelle vous exécutez la commande d'enregistrement gcloud ne peut pas se connecter au point de terminaison externe du cluster. Cela se produit généralement si vous disposez d'un cluster privé avec accès/adresse IP externe désactivé, mais que l'adresse IP externe de votre machine ne figure pas sur la liste d'autorisation. Notez que l'enregistrement d'un cluster GKE ne nécessite pas cette exigence après la version gcloud 407.0.0.

Résolution :

Assurez-vous que la machine sur laquelle vous souhaitez exécuter la commande d'enregistrement gcloud peut accéder au serveur d'API du cluster. Si l'accès externe n'est pas activé sur votre cluster, déposez une demande auprès de l'assistance Google Cloud.

Obtenir de l'aide supplémentaire

Pour envoyer une demande à l'assistance Google Cloud pour GKE Enterprise, procédez comme suit:

  1. Déposez une demande auprès de l'assistance Google Cloud
  2. Suivez les instructions de la section Collecte des journaux Connect Agent pour enregistrer les journaux Connect.
  3. Si vous dépannez un cluster sur site à l'aide de Google Groupes ou d'une assistance tierce, suivez les instructions de la page Collecter les journaux d'identité de service GKE pour enregistrer les journaux d'identité de service GKE. Veillez à nettoyer les journaux du pod dans le fichier enregistré si nécessaire.
  4. Joignez les journaux pertinents à votre demande.