Résoudre les problèmes liés à Config Connector


Cette page décrit les techniques de dépannage que vous pouvez utiliser pour résoudre les problèmes Config Connector et les problèmes courants que vous pouvez rencontrer lors de l'utilisation le produit.

Techniques de dépannage de base

Vérifier la version de Config Connector

Exécutez la commande suivante pour obtenir la version de Config Connector installée et faire une référence notes de version pour vérifier que la version en cours d'exécution prend en charge les fonctionnalités et les ressources que vous souhaitez utiliser:

kubectl get ns cnrm-system -o jsonpath='{.metadata.annotations.cnrm\.cloud\.google\.com/version}'

Vérifier l'état et les événements de la ressource

En général, vous pouvez déterminer le problème de vos ressources Config Connector en inspecter l'état de vos ressources Kubernetes. Vérification en cours l'état et les événements d'une ressource sont particulièrement utiles pour déterminer Échec du rapprochement de la ressource par Config Connector et raison du rapprochement a échoué.

Vérifier que Config Connector est en cours d'exécution

Pour vérifier que Config Connector est en cours d'exécution, vérifiez que tous ses pods READY:

kubectl get pod -n cnrm-system

Exemple de résultat :

NAME                                            READY   STATUS    RESTARTS   AGE
cnrm-controller-manager-0                       1/1     Running   0          1h
cnrm-deletiondefender-0                         1/1     Running   0          1h
cnrm-resource-stats-recorder-77dc8cc4b6-mgpgp   1/1     Running   0          1h
cnrm-webhook-manager-58496b66f9-pqwhz           1/1     Running   0          1h
cnrm-webhook-manager-58496b66f9-wdcn4           1/1     Running   0          1h

Si Config Connector est installé namespaced-mode, vous aurez un pod contrôleur (cnrm-controller-manager) pour chaque espace de noms chargé de gérer les ressources Config Connector dans cet espace de noms.

Vous pouvez vérifier l'état du pod contrôleur responsable d'une en exécutant la commande suivante:

kubectl get pod -n cnrm-system \
    -l cnrm.cloud.google.com/scoped-namespace=NAMESPACE \
    -l cnrm.cloud.google.com/component=cnrm-controller-manager

Remplacez NAMESPACE par le nom de l'espace de noms.

Consulter les journaux du contrôleur

Le pod contrôleur consigne les informations et les erreurs liées au rapprochement Ressources Config Connector.

Vous pouvez consulter les journaux du pod contrôleur en exécutant la commande suivante:

kubectl logs -n cnrm-system \
    -l cnrm.cloud.google.com/component=cnrm-controller-manager \
    -c manager

Si Config Connector est installé namespaced-mode, la commande précédente affiche les journaux de tous les pods contrôleurs combinés. Toi Vous pouvez consulter les journaux du pod contrôleur pour un espace de noms spécifique en exécutant la commande suivante:

kubectl logs -n cnrm-system \
    -l cnrm.cloud.google.com/scoped-namespace=NAMESPACE \
    -l cnrm.cloud.google.com/component=cnrm-controller-manager \
    -c manager

Remplacez NAMESPACE par le nom de l'espace de noms.

Découvrez comment inspecter et interroger les journaux de Config Connector.

Abandonner et acquérir la ressource

Dans certains cas, vous devrez peut-être mettre à jour un champ immuable dans une ressource. Depuis vous ne pouvez pas modifier les champs immuables, vous devez abandonner, puis acquérir la ressource:

  1. Mettez à jour la configuration YAML de la ressource Config Connector et définissez l'annotation cnrm.cloud.google.com/deletion-policy pour abandon.
  2. Appliquez la configuration YAML mise à jour pour mettre à jour Config Connector la règle de suppression d'une ressource.
  3. Abandonner Config Connector ressource.
  4. Mettre à jour les champs immuables qui doivent être modifiés dans le fichier YAML configuration.
  5. Appliquez la configuration YAML mise à jour acquiert l'abandon ressource.

Problèmes courants

La ressource est mise à jour toutes les 5 à 15 minutes

Si votre ressource Config Connector n'arrête pas de passer de l'état UpToDate à Updating toutes les 5 à 10 minutes, il est probable Config Connector détecte des différences involontaires entre les données l'état souhaité et l'état réel, ce qui fait que Config Connector mettre à jour la ressource.

Tout d'abord, vérifiez qu'aucun système externe n'est constamment modifier la ressource Config Connector ou Google Cloud (par exemple, pipelines CI/CD, contrôleurs personnalisés, tâches Cron, etc.).

Si le comportement n'est pas dû à un système externe, vérifiez si Google Cloud modifier l'une des valeurs spécifiées dans votre ressource Config Connector. Pour Par exemple, dans certains cas, Google Cloud modifie la mise en forme majuscules) des valeurs des champs, ce qui génère une différence entre les valeurs l'état souhaité et l'état réel.

Obtenez l'état de la ressource Google Cloud à l'aide de l'API REST (pour Par exemple, par exemple, ContainerCluster) ou la Google Cloud CLI. Comparez ensuite cet état à celui de Config Connector. ressource. Recherchez les champs dont les valeurs ne correspondent pas, puis mettez à jour votre Ressource Config Connector à mettre en correspondance. Recherchez en particulier les valeurs ont été reformatés par Google Cloud. Par exemple, consultez les problèmes sur GitHub N° 578 et N° 294.

Notez que cette méthode n'est pas parfaite, puisque les API Config Connector et Les modèles de ressources Google Cloud sont différents, mais ils devraient vous permettre dans la plupart des cas de différences inattendues.

Si vous ne parvenez pas à résoudre votre problème, consultez la section Autres aide.

Suppressions d'espaces de noms bloquées sur "Arrêt en cours"

La suppression d'espaces de noms peut rester bloquée sur Terminating si vous avez Config Connector installé dans namespaced-mode Si l'objet ConfigConnectorContext de l'espace de noms a été supprimé avant que Les ressources Config Connector de cet espace de noms sont supprimées. Lorsque l'espace de noms ConfigConnectorContext a été supprimé, Config Connector est désactivé pour cela qui empêche les ressources Config Connector restantes d'être supprimé.

Pour résoudre ce problème, vous devez effectuer un nettoyage forcé, puis manuellement les ressources Google Cloud sous-jacentes.

Pour atténuer ce problème à l'avenir, supprimez uniquement le ConfigConnectorContext une fois que toutes les ressources Config Connector de son espace de noms ont été supprimées Kubernetes. Éviter de supprimer des espaces de noms entiers avant tous les objets Config Connector que les ressources de cet espace de noms sont supprimées ConfigConnectorContext risque d'être supprimé en premier.

Vous pouvez également voir comment supprimer un espace de noms contenant un projet et ses enfants ou un dossier et ses les enfants peuvent se retrouver bloqués.

Suppressions de ressources bloquées sur "DeleteFailed" après la suppression du projet

Les suppressions de ressources Config Connector peuvent rester bloquées sur DeleteFailed si son projet Google Cloud avait été supprimé au préalable.

Pour résoudre ce problème, restaurez le projet sur Google Cloud pour permettre à Config Connector de supprimer les ressources enfants restantes de Kubernetes. Vous pouvez également effectuer un nettoyage forcé.

Pour atténuer ce problème à l'avenir, ne supprimez que les projets Google Cloud une fois que toutes leurs ressources Config Connector enfants ont été supprimées Kubernetes. Évitez de supprimer des espaces de noms entiers pouvant contenir à la fois un la ressource Project et ses ressources Config Connector enfants depuis le Project ressource peut être supprimée en premier.

Métadonnées Compute Engine non définies

Si l'état de votre ressource Config Connector est UpdateFailed avec un message indiquant que les métadonnées Compute Engine ne sont pas définies, cela signifie probablement que Le compte de service IAM utilisé par Config Connector n'existe pas.

Exemple de message UpdateFailed:

Update call failed: error fetching live state: error reading underlying
resource: summary: Error when reading or editing SpannerInstance
"my-project/my-spanner- instance": Get
"https://spanner.googleapis.com/v1/projects/my-project/instances/my-spanner-instance?alt=json":
metadata: Compute Engine metadata "instance/service-accounts/default/token?
scopes=https%!A(MISSING)%!F(MISSING)%!F(MISSING)www.googleapis.com%!F(MISSING)auth%!F(MISSING)compute%!C(MISSING)https%!A(MISSING)%!F(MISSING)%!F(MISSING)www.googleapis.com%!F(MISSIN
G)auth%!F(MISSING)cloud-platform%!C(MISSING)https%!A(MISSING)%!F(MISSING)%!F(MISSING)www.googleapis.com%!F(MISSING)auth%!F(MISSING)cloud-identity%!C(MISSING)https%!A(MISSING)%!F(MISS
ING)%!F(MISSING)www.googleapis.com%!F(MISSING)auth%!F(MISSING)ndev.clouddns.readwrite%!C(MISSING)https%!A(MISSING)%!F(MISSING)%!F(MISSING)www.googleapis.com%!F(MISSING)auth%!F(MISSIN
G)devstorage.full_control%!C(MISSING)https%!A(MISSING)%!F(MISSING)%!F(MISSING)www.googleapis.com%!F(MISSING)auth%!F(MISSING)userinfo.email%!C(MISSING)https%!A(MISSING)%!F(MISSING)%!F
(MISSING)www.googleapis.com%!F(MISSING)auth%!F(MISSING)drive.readonly" not
defined, detail:

Pour résoudre le problème, assurez-vous que le compte de service IAM utilisé par Config Connector existe.

Pour atténuer ce problème à l'avenir, veillez à respecter les Installation de Config Connector instructions.

Erreur 403: les champs d'application d'authentification de la requête sont insuffisants

Si l'état de votre ressource Config Connector est UpdateFailed avec un message indiquant une erreur 403 en raison d'un nombre insuffisant de champs d'application d'authentification, signifie probablement que la charge de travail Identity n'est pas activée sur votre cluster GKE.

Exemple de message UpdateFailed:

Update call failed: error fetching live state: error reading underlying
resource: summary: Error when reading or editing SpannerInstance
"my-project/my-spanner-instance": googleapi: Error 403: Request had
insufficient authentication scopes.

Pour examiner le problème, procédez comme suit :

  1. Enregistrez la configuration de pod suivante sous wi-test.yaml :

    apiVersion: v1
    kind: Pod
    metadata:
      name: workload-identity-test
      namespace: cnrm-system
    spec:
      containers:
      - image: google/cloud-sdk:slim
        name: workload-identity-test
        command: ["sleep","infinity"]
      serviceAccountName: cnrm-controller-manager
    

    Si vous avez installé Config Connector à l'aide de namespaced mode, serviceAccountName devrait être cnrm-controller-manager-NAMESPACE. Remplacez NAMESPACE par l'espace de noms que vous avez utilisé lors de la l'installation.

  2. Créez le pod dans votre cluster GKE :

    kubectl apply -f wi-test.yaml
    
  3. Ouvrez une session interactive dans le pod :

    kubectl exec -it workload-identity-test \
        --namespace cnrm-system \
        -- /bin/bash
    
  4. Affichez votre identité :

    gcloud auth list
    
  5. Vérifier que l'identité répertoriée correspond au compte de service Google lié à vos ressources.

    Si le compte de service Compute Engine par défaut apparaît cela signifie que Workload Identity n'est pas activé un cluster GKE et/ou un pool de nœuds.

  6. Quittez la session interactive, puis supprimez le pod de votre Cluster GKE:

    kubectl delete pod workload-identity-test \
        --namespace cnrm-system
    

Pour résoudre ce problème, utilisez un cluster GKE avec Workload Identity est activé.

Si la même erreur s'affiche toujours sur un cluster GKE avec Workload Identity activé. Vérifiez que vous n'avez pas oublié d'activer également Workload Identity sur les pools de nœuds du cluster. En savoir plus sur activation de Workload Identity sur un nœud existant pools de nœuds. Nous vous recommandons d'activer Workload Identity sur tous les pools de nœuds de votre cluster, car Config Connector peut s'exécuter sur n'importe lequel d'entre eux.

403 Forbidden: L'appelant n'a pas d'autorisation. consultez la documentation "Workload Identity"

Si l'état de votre ressource Config Connector est UpdateFailed avec un message indiquant une erreur 403 liée à Workload Identity, cela signifie probablement Le compte de service Kubernetes de Config Connector ne dispose pas des autorisations Autorisations IAM permettant d'emprunter l'identité de votre service IAM en tant qu'utilisateur Workload Identity.

Exemple de message UpdateFailed:

Update call failed: error fetching live state: error reading underlying
resource: summary: Error when reading or editing SpannerInstance
"my-project/my-spanner- instance": Get
"https://spanner.googleapis.com/v1/projects/my-project/instances/my-spanner-instance?alt=json":
compute: Received 403 `Unable to generate access token; IAM returned 403
Forbidden: The caller does not have permission
This error could be caused by a missing IAM policy binding on the target IAM
service account.
For more information, refer to the Workload Identity documentation:
  https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#creating_a_relationship_between_ksas_and_gsas

Pour résoudre et limiter ce problème à l'avenir, reportez-vous à la page Config Connector instructions d'installation.

Erreur 403: l'appelant ne dispose pas de l'autorisation IAM

Si l'état de votre ressource Config Connector est UpdateFailed avec un message indiquant que l'appelant ne dispose pas d'une autorisation IAM, cela signifie probablement Le compte de service IAM utilisé par Config Connector ne dispose pas du paramètre l'autorisation IAM indiquée dans le message, qui est nécessaire pour gérer la ressource Google Cloud.

Exemple de message UpdateFailed:

Update call failed: error fetching live state: error reading underlying
resource: summary: Error when reading or editing SpannerInstance
"my-project/my-spanner- instance": googleapi: Error 403: Caller is missing IAM
permission spanner.instances.get on resource
projects/my-project/instances/my-spanner-instance., detail:

Si l'erreur persiste après avoir accordé votre accès les autorisations IAM appropriées, puis vérifiez que votre ressource est créée dans le bon projet. Consultez le Le champ spec.projectRef de la ressource Config Connector (ou son L'annotation cnrm.cloud.google.com/project-id si la ressource n'est pas compatible avec spec.projectRef) et vérifiez que la ressource fait référence au le bon projet. Notez que Config Connector utilise le nom de l'espace de noms comme ID de projet si ni la ressource, ni l'espace de noms ne spécifient de projet cible. En savoir plus sur la configuration du projet cible pour une utilisation à l'échelle du projet ressources.

Si l'erreur persiste, vérifiez si Workload Identity est sur votre cluster GKE.

Pour atténuer ce problème à l'avenir, assurez-vous de suivre les Installation de Config Connector instructions.

Version non compatible avec les installations de modules complémentaires Config Connector

Si vous ne parvenez pas à activer le module complémentaire Config Connector, le message d'erreur suivant s'affiche : Node version 1.15.x-gke.x s unsupported. Pour résoudre ce problème, vérifiez que la version du cluster GKE respecte la les exigences liées à la version et aux fonctionnalités.

Pour obtenir toutes les versions valides de vos clusters, exécutez la commande suivante :

gcloud container get-server-config --format "yaml(validMasterVersions)" \
    --zone ZONE

Remplacez ZONE par la zone Compute Engine.

Choisissez une version répondant aux exigences dans la liste.

Le message d'erreur s'affiche également si Workload Identity ou Surveillance GKE sont désactivés. Assurez-vous que ces fonctionnalités sont activées pour corriger l'erreur.

Impossible de modifier des champs immuables

Config Connector rejette les mises à jour de champs immuables à d'admission.

Par exemple, la mise à jour d'un champ immuable avec kubectl apply entraîne d'échouer immédiatement.

Cela signifie que les outils qui réappliquent continuellement des ressources (par exemple, GitOps) peuvent se retrouver bloqué lors de la mise à jour d'une ressource s'ils ne gèrent pas les erreurs d'admission.

Config Connector n'autorise pas la mise à jour des champs immuables. pour effectuer une telle mise à jour consiste à supprimer et recréer la ressource.

Erreur lors de la mise à jour des champs immuables en l'absence de mise à jour

Les erreurs suivantes peuvent s'afficher dans l'état de Config Connector ressource peu de temps après la création ou l'acquisition d'une ressource Google Cloud à l'aide de Config Connector:

  • Update call failed: error applying desired state: infeasible update: ({true \<nil\>}) would require recreation (exemple)

  • Update call failed: cannot make changes to immutable field(s) (exemple)

Cela ne signifie peut-être pas que vous avez effectivement mis à jour la ressource, mais que la raison peut-être que l'API Google Cloud a modifié un champ immuable que vous gérez dans la ressource Config Connector. Cela a causé une incohérence entre l'état souhaité et l'état actuel des champs immuables.

Vous pouvez résoudre le problème en mettant à jour les valeurs de ces champs immuables dans la ressource Config Connector pour qu'elle corresponde à l'état actuel. Pour y parvenir, vous devez procédez comme suit:

  1. Mettez à jour la configuration YAML de la ressource Config Connector et définissez l'annotation cnrm.cloud.google.com/deletion-policy pour abandon.
  2. Appliquez la configuration YAML mise à jour pour mettre à jour Config Connector la règle de suppression d'une ressource.
  3. Abandonnez la ressource Config Connector.
  4. afficher l'état actuel de la ressource Google Cloud correspondante ; à l'aide de gcloud CLI.
  5. Identifier l'incohérence entre la sortie de la gcloud CLI et le fichier YAML configuration de la ressource Config Connector et mettez à jour ces champs dans la configuration YAML.
  6. Appliquez la configuration YAML mise à jour acquérir la ressource abandonnée.

La ressource n'a pas d'état

Si vos ressources n'ont pas de champ status, il est probable Config Connector ne s'exécute pas correctement. Vérifiez que Config Connector est en cours d'exécution.

Aucun résultat pour le genre "Foo"

Lorsque cette erreur se produit, cela signifie que votre cluster Kubernetes ne l'objet CRD pour le genre de ressource Foo doit être installé.

Vérifiez que le genre est un genre de ressource pris en charge par Config Connector.

Si le genre est compatible, cela signifie que votre installation de Config Connector est obsolètes ou non valides.

Si vous avez installé Config Connector à l'aide du module complémentaire GKE, votre installation devrait être mise à niveau automatiquement. Si vous avez installé manuellement dans Config Connector, vous devez effectuer une mise à niveau.

Consultez le dépôt GitHub pour déterminer les genres de ressources compatibles avec les versions de Config Connector (par exemple, les genres compatibles avec Config Connector v1.44.0).

Les étiquettes ne sont pas propagées vers la ressource Google Cloud

Config Connector propage les étiquettes trouvées dans metadata.labels au sous-réseau ressource Google Cloud. Notez toutefois que les services Google Cloud sont compatibles avec les étiquettes. Consultez la documentation de l'API REST de la ressource (pour voici la documentation de l'API PubSubTopic) pour vérifier libellés compatibles.

Échec de l'appel du webhook x509: le certificat repose sur l'ancien champ "Nom commun"

Si un message d'erreur semblable à l'exemple suivant s'affiche, il se peut que vous rencontriez un problème avec les certificats:

Error from server (InternalError): error when creating "/mnt/set-weaver-dns-record.yml": Internal error occurred: failed calling webhook "annotation-defaulter.cnrm.cloud.google.com": Post "https://cnrm-validating-webhook.cnrm-system.svc:443/annotation-defaulter?timeout=30s": x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0

Pour contourner ce problème, supprimez les pods et les certificats appropriés:

kubectl delete -n cnrm-system secrets cnrm-webhook-cert-abandon-on-uninstall
kubectl delete -n cnrm-system secrets cnrm-webhook-cert-cnrm-validating-webhook
kubectl delete -n cnrm-system pods -l "cnrm.cloud.google.com/component=cnrm-webhook-manager"

Une fois ces ressources supprimées, le certificat approprié est régénéré.

Pour en savoir plus sur cette erreur, consultez la Problème GitHub.

Erreur due à des caractères spéciaux dans le nom de la ressource

Les caractères spéciaux ne sont pas valides dans le champ Kubernetes metadata.name. Si vous rencontrez une erreur semblable à l'exemple suivant, le Le champ metadata.name de la ressource comporte probablement une valeur comportant des caractères spéciaux:

a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')

Par exemple : SQLUser La ressource contient un caractère non valide dans metadata.name:

apiVersion: sql.cnrm.cloud.google.com/v1beta1
kind: SQLUser
metadata:
  name: test.example@example-project.iam
spec:
  instanceRef:
    name: test-cloudsql-db
  type: "CLOUD_IAM_USER"

Si vous essayez de créer cette ressource, vous obtenez l'erreur suivante:

Error from server (Invalid): error when creating "sqlusercrd.yaml": SQLUser.sql.cnrm.cloud.google.com "test.example@example-project.iam" is invalid: metadata.name: Invalid value: "test.example@example-project.iam": a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')

Si vous souhaitez donner à votre ressource un nom qui n'est pas un nom Kubernetes valide, mais qu'il s'agit d'un nom de ressource Google Cloud valide, vous pouvez utiliser resourceID, comme illustré dans l'exemple suivant:

apiVersion: sql.cnrm.cloud.google.com/v1beta1
kind: SQLUser
metadata:
  name: 'test'
spec:
  instanceRef:
    name: sqlinstance-sample-postgresql
  host: "%"
  type: CLOUD_IAM_USER
  resourceID: test.example@example-project.iam

Cette configuration oblige Config Connector à utiliser resourceID au lieu de metadata.name comme nom de ressource.

Impossible de supprimer des champs de la spécification de ressource

Supprimer un champ de la spécification d'une ressource Config Connector (en mettant à jour le champ fichier .yaml de la ressource et en réappliquer, ou en utilisant kubectl edit pour modifier la spécification des ressources) ne supprime pas ce champ du champ Spécification de la ressource Config Connector ou ressource Google Cloud sous-jacente. La suppression d'un champ de la spécification rend simplement ce champ gérée en externe.

Si vous souhaitez remplacer la valeur d'un champ par un champ vide ou par défaut dans la ressource Google Cloud, vous devez remettre à zéro le champ Spécification de la ressource Config Connector:

  • Pour le champ de type liste, définissez le champ sur une liste vide à l'aide de [].

    L'exemple suivant montre le champ targetServiceAccounts que nous souhaitons supprimer:

    spec:
      targetServiceAccounts:
        - external: "foo-bar@foo-project.iam.gserviceaccount.com"
        - external: "bar@foo-project.iam.gserviceaccount.com"
    

    Pour supprimer ce champ, laissez la valeur vide:

    spec:
      targetServiceAccounts: []
    
  • Pour le champ de type primitif, laissez le champ vide en utilisant l'une des options suivantes:

    Type Valeur vide
    chaîne ""
    Bool "faux"
    entier 0

    L'exemple suivant montre le champ identityNamespace que nous souhaitons supprimer:

    spec:
      workloadIdentityConfig:
        identityNamespace: "foo-project.svc.id.goog"
    

    Pour supprimer ce champ, laissez la valeur vide:

    spec:
      workloadIdentityConfig:
        identityNamespace: ""
    
  • Pour les champs de type "Objet", Config Connector ne propose actuellement aucun moyen simple Définissez un champ de type d'objet entier sur "NULL". Vous pouvez essayer de définir les sous-champs du est vide ou par défaut en suivant les instructions ci-dessus et vérifiez s'il fonctionne.

KNV2005: le synchroniseur met à jour la ressource de manière excessive

Si vous utilisez Config Sync et vous les erreurs de détection KNV2005 erreurs pour ressources Config Connector, il est probable que Config Sync et Config Connector se disputent la ressource.

Exemple de message de journal:

KNV2005: detected excessive object updates, approximately 6 times per
minute. This may indicate Config Sync is fighting with another controller over
the object.

Config Sync et Config Connector sont considérés comme des conflits sur une ressource s'ils continuent de mettre à jour les mêmes champs avec des valeurs différentes. Mise à jour One déclenche l'action de l'autre utilisateur et la mise à jour de la ressource, ce qui amène l'autre à agir, mettre à jour la ressource, etc.

Le combat n'est pas un problème dans la plupart des domaines. Les champs spécifiés dans Config Sync ne change pas par Config Connector, contrairement aux champs qui ne le sont pas. spécifiées dans Config Sync et définies par défaut par Config Connector sont ignorées par Config Sync Par conséquent, pour la plupart des champs, Config Sync et Config Connector ne doit jamais mettre à jour le même champ avec des valeurs différentes valeurs.

à l'exception des champs de liste. De la même manière que Config Connector sous-champs par défaut des champs d'objet, Config Connector peut aussi dans des objets à l'intérieur de listes. Toutefois, étant donné que les champs sont listés dans Config Connector, ressources sont atomiques, la valeur par défaut des sous-champs est considérée comme la modification de la liste.

Par conséquent, Config Sync et Config Connector se disputeront si Config Sync définit un champ de liste, et Config Connector définit par défaut tous les sous-champs. dans cette liste.

Pour contourner ce problème, vous disposez des options suivantes:

  1. Mettez à jour le fichier manifeste de la ressource dans le dépôt Config Sync en fonction des éléments Config Connector tente de définir la ressource sur.

    Pour cela, vous pouvez arrêter temporairement la synchronisation de configuration, d'attendre que Config Connector ait rapproché la ressource, puis Mettre à jour le fichier manifeste de la ressource pour qu'il corresponde à la ressource de l'API Kubernetes Google Cloud.

  2. Empêcher Config Sync de réagir aux mises à jour de la ressource sur le le serveur d'API Kubernetes en définissant l'annotation De client.lifecycle.config.k8s.io/mutation à ignore. Découvrez comment pour que Config Sync ignore l'objet mutations.

  3. Empêchez Config Connector de mettre à jour entièrement les spécifications de la ressource en définissant l'annotation cnrm.cloud.google.com/state-into-spec sur absent ressource. Cette annotation n'est pas compatible avec toutes les ressources. Pour savoir si votre prend en charge l'annotation, vérifiez page de référence des ressources. En savoir plus sur l'annotation

failed calling webhook

Il est possible que Config Connector soit dans un état où vous ne pouvez pas désinstaller Config Connector. Cela se produit généralement lors de l'utilisation du module complémentaire Config Connector et de la désactivation Config Connector avant supprimer les objets CRD Config Connector. Lorsque vous tentez de la désinstaller, un message d'erreur semblable à celui-ci s'affiche:

error during reconciliation: error building deployment objects: error finalizing the deletion of Config Connector system components deployed by ConfigConnector controller: error waiting for CRDs to be deleted: error deleting CRD accesscontextmanageraccesslevels.accesscontextmanager.cnrm.cloud.google.com: Internal error occurred: failed calling webhook "abandon-on-uninstall.cnrm.cloud.google.com": failed to call webhook: Post "https://abandon-on-uninstall.cnrm-system.svc:443/abandon-on-uninstall?timeout=3s": service "abandon-on-uninstall" not found

Pour résoudre cette erreur, vous devez d'abord supprimer manuellement les webhooks:

kubectl delete validatingwebhookconfiguration abandon-on-uninstall.cnrm.cloud.google.com --ignore-not-found --wait=true
kubectl delete validatingwebhookconfiguration validating-webhook.cnrm.cloud.google.com --ignore-not-found --wait=true
kubectl delete mutatingwebhookconfiguration mutating-webhook.cnrm.cloud.google.com --ignore-not-found --wait=true

Vous pouvez ensuite désinstaller Config Connector.

Erreur de mise à jour concernant IAMPolicy, IAMPartialPolicy et IAMPolicyMember

Si vous supprimez une ressource Config Connector IAMServiceAccount avant de nettoyer les ressources IAMPolicy, IAMPartialPolicy et IAMPolicyMember qui dépendent de ce compte de service : Config Connector ne parvient pas à localiser le compte de service référencé dans ces ressources IAM lors du rapprochement. L'état UpdateFailed s'affiche avec un message d'erreur semblable à celui-ci:

Update call failed: error setting policy member: error applying changes: summary: Request `Create IAM Members roles/[MYROLE] serviceAccount:[NAME]@[PROJECT_ID].iam.gserviceaccount.com for project \"projects/[PROJECT_ID]\"` returned error: Error applying IAM policy for project \"projects/[PROJECT_ID]\": Error setting IAM policy for project \"projects/[PROJECT_ID]\": googleapi: Error 400: Service account [NAME]@[PROJECT_ID].iam.gserviceaccount.com does not exist., badRequest

Pour résoudre ce problème, vérifiez vos comptes de service et vérifiez si le compte de service requis pour ces ressources IAM a été supprimé. Si le compte de service est supprimé, nettoyez également les ressources IAM Config Connector associées. Pour IAMPolicyMember, supprimez l'intégralité de la ressource. Pour IAMPolicy et IAMParitialPolicy, ne supprimez que les liaisons qui impliquent le compte de service supprimé. Toutefois, ce nettoyage ne supprime pas immédiatement les liaisons de rôles Google Cloud. Les liaisons de rôles Google Cloud sont conservées pendant 60 jours en raison de la conservation appliquée au compte de service supprimé. Pour en savoir plus, consultez la documentation Google Cloud IAM sur la suppression d'un compte de service.

Pour éviter ce problème, vous devez toujours nettoyer les ressources IAMPolicy, IAMPartialPolicy et IAMPolicyMember Config Connector avant de supprimer le IAMServiceAccount référencé.

Ressource supprimée par Config Connector

Config Connector ne supprime jamais vos ressources sans cause externe. Par exemple, vous pouvez exécuter kubectl delete à l'aide d'outils de gestion de la configuration tels que Argo CD ou l'utilisation d'un client API personnalisé peut entraîner la suppression de ressources.

On pense souvent à tort que Config Connector a créé et supprimé certaines ressources de votre cluster. Par exemple, si vous utilisez Config Connector, peut remarquer des requêtes de suppression du gestionnaire de contrôleurs Config Connector certaines ressources depuis les messages de journal de conteneurs ou le cluster Kubernetes les journaux d'audit. Ces demandes de suppression sont le résultat de déclencheurs externes Config Connector tente de rapprocher les requêtes de suppression.

Pour savoir pourquoi une ressource a été supprimée, vous devez examiner la première requête de suppression qui a été envoyée à la ressource correspondante. La La meilleure façon de procéder est d'examiner les journaux d'audit du cluster Kubernetes.

Par exemple, si vous utilisez GKE, vous pouvez utiliser Cloud Logging pour interroger des données, les journaux d'audit du cluster GKE. Par exemple, si vous voulez voir pour les requêtes de suppression initiales d'une ressource BigQueryDataset nommée foo dans bar, vous devez exécuter une requête semblable à celle-ci:

resource.type="k8s_cluster"
resource.labels.project_id="my-project-id"
resource.labels.cluster_name="my-cluster-name"
protoPayload.methodName="com.google.cloud.cnrm.bigquery.v1beta1.bigquerydatasets.delete"
protoPayload.resourceName="bigquery.cnrm.cloud.google.com/v1beta1/namespaces/bar/bigquerydatasets/foo"

À l'aide de cette requête, vous rechercherez la première demande de suppression, puis vous vérifierez authenticationInfo.principalEmail de ce message de suppression de journal pour déterminer cause de la suppression.

Arrêt du pod du contrôleur en raison de l'arrêt OOMKille

Si une erreur OOMKilled s'affiche sur un pod de contrôleur Config Connector, cela signifie que un conteneur ou le pod entier a été arrêté, car la mémoire utilisée était supérieure à la limite autorisée. Vous pouvez le vérifier en exécutant la commande kubectl describe. L'état du pod peut être OOMKilled ou Terminating. En outre, l'examen des journaux d'événements du pod peut révéler toute occurrence d'événements liés à l'OOM.

kubectl describe pod POD_NAME -n cnrm-system

Remplacez POD_NAME par le pod que vous dépannez.

Pour résoudre ce problème, vous pouvez utiliser la ressource personnalisée ControllerResource afin d'augmenter la demande de mémoire et la quantité de mémoire. pour le pod.

PodSecurityPolicy empêche les mises à niveau

Après Passer du module complémentaire Config Connector à une installation manuelle et à la mise à niveau de Config Connector vers une nouvelle version, l'utilisation de PodSecurityPolicies peut empêcher la mise à jour des pods cnrm.

Pour vérifier que les règles PodSecurityPolicy empêchent votre mise à niveau, procédez comme suit : vérifier les événements de config-connector-operator et recherchez une erreur semblable à celle-ci:

create Pod configconnector-operator-0 in StatefulSet configconnector-operator failed error: pods "configconnector-operator-0" is forbidden: PodSecurityPolicy: unable to admit pod: [pod.metadata.annotations[seccomp.security.alpha.kubernetes.io/pod]: Forbidden: seccomp may not be set pod.metadata.annotations[container.seccomp.security.alpha.kubernetes.io/manager]: Forbidden: seccomp may not be set]

Pour résoudre ce problème, vous devez Spécifier l'annotation sur la règle PodSecurityPolicy qui correspond à l'annotation mentionnée dans l'erreur. Dans Dans l'exemple précédent, l'annotation est seccomp.security.alpha.kubernetes.io.

Nettoyage forcé

Si vos ressources Config Connector sont bloquées lors de leur suppression et que vous souhaitez simplement vous pouvez les supprimer de votre cluster Kubernetes, vous pouvez forcer leur suppression en supprimant ses finalisateurs.

Pour supprimer les finaliseurs d'une ressource, modifiez la ressource à l'aide de kubectl edit, supprimez le champ metadata.finalizers, puis enregistrez le fichier dans et conserver les modifications apportées au serveur d'API Kubernetes.

Étant donné que la suppression du finaliseur d'une ressource permet à celle-ci d'être immédiatement supprimé du cluster Kubernetes, Config Connector peut (mais pas n'ont pas forcément la possibilité d'effectuer la suppression ressource Google Cloud. Cela signifie que vous pouvez supprimer manuellement vos ressources Google Cloud par la suite.

Surveillance

Métriques

Vous pouvez utiliser Prometheus pour collecter et afficher les métriques Config Connector.

Journalisation

Tous les pods Config Connector génèrent des journaux structurés au format JSON.

Les journaux des pods contrôleurs sont particulièrement utiles pour déboguer les problèmes de rapprochement des ressources.

Vous pouvez interroger les journaux pour des ressources spécifiques en filtrant les éléments suivants : dans les messages de journal:

  • logger: contient le genre de la ressource en minuscules. Par exemple, le logger des ressources PubSubTopic est pubsubtopic-controller.
  • resource.namespace: contient l'espace de noms de la ressource.
  • resource.name: contient le nom de la ressource.

Utiliser Cloud Logging pour les requêtes de journaux avancées

Si vous utilisez GKE, vous pouvez utiliser Cloud Logging pour interroger des données les journaux d'une ressource spécifique à l'aide la requête suivante:

# Filter to include only logs coming from the controller Pods
resource.type="k8s_container"
resource.labels.container_name="manager"
resource.labels.namespace_name="cnrm-system"
labels.k8s-pod/cnrm_cloud_google_com/component="cnrm-controller-manager"

# Filter to include only logs coming from a particular GKE cluster
resource.labels.cluster_name="GKE_CLUSTER_NAME"
resource.labels.location="GKE_CLUSTER_LOCATION"

# Filter to include only logs for a particular Config Connector resource
jsonPayload.logger="RESOURCE_KIND-controller"
jsonPayload.resource.namespace="RESOURCE_NAMESPACE"
jsonPayload.resource.name="RESOURCE_NAME"

Remplacez les éléments suivants :

  • GKE_CLUSTER_NAME par le nom du cluster GKE exécutant Config Connector.
  • GKE_CLUSTER_LOCATION par l'emplacement du cluster GKE exécutant Config Connector. Exemple :us-central1
  • RESOURCE_KIND par le genre de la ressource, en minuscules. Exemple : pubsubtopic.
  • RESOURCE_NAMESPACE par l'espace de noms de la ressource.
  • RESOURCE_NAME par le nom de la ressource.

Aide supplémentaire

Pour obtenir de l'aide supplémentaire, vous pouvez signaler un problème sur GitHub ou contactez l'assistance Google Cloud.