Résoudre les problèmes liés au webhook d'admission

Cette page explique comment résoudre les problèmes liés au webhook d'admission Config Sync. Pour en savoir plus sur le webhook, consultez la page Empêcher les écarts de configuration.

Résoudre les erreurs KNV 2009

Les sections suivantes vous aident à résoudre les erreurs KNV2009.

Connexion du webhook d'admission refusée

Si la protection contre les écarts est activée, vous pouvez recevoir l'erreur suivante lorsque le rapprochement tente d'appliquer une configuration au cluster :

KNV2009: Internal error occurred: failed calling webhook "v1.admission-webhook.configsync.gke.io": Post "https://admission-webhook.config-management-system.svc:8676/admission-webhook?timeout=3s": dial tcp 10.92.2.14:8676: connect: connection refused

Ce message d'erreur signifie que le webhook d'admission n'est pas encore prêt ou qu'il est devenu défaillant. Il s'agit généralement d'une erreur temporaire que vous pourriez voir lors de l'amorçage de Config Sync.

Si le problème persiste, décrivez le déploiement du webhook d'admission pour voir si ses pods peuvent être programmés et sont opérationnels.

kubectl describe deploy admission-webhook -n config-management-system

kubectl get pods -n config-management-system -l app=admission-webhook

Un déploiement avec des pods opérationnels produit un résultat semblable à ce qui suit :

Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
...
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
...

Délai d'expiration des E/S de requête du webhook d'admission

Si vous recevez une erreur semblable à ce qui suit lorsque le rapprochement tente d'appliquer une configuration au cluster, le port du webhook d'admission 8676 peut être bloqué par le pare-feu sur le réseau du plan de contrôle :

KNV2009: Internal error occurred: failed calling webhook "v1.admission-webhook.configsync.gke.io": Post https://admission-webhook.config-management-system.svc:8676/admission-webhook?timeout=3s: dial tcp 10.1.1.186:8676: i/o timeout

Pour résoudre ce problème, ajoutez une règle de pare-feu pour autoriser le port 8676, utilisé par le webhook d'admission de Config Sync à des fins de prévention contre les dérives. Le port 8676 doit être ouvert depuis le plan de contrôle vers les nœuds, car le plan de contrôle doit pouvoir atteindre le backend du webhook sur les nœuds du cluster.

Le webhook d'admission a refusé une requête

Si vous rencontrez l'erreur suivante lorsque vous essayez d'appliquer une modification à un champ géré par Config Sync, vous avez peut-être effectué une modification incompatible :

error: OBJECT could not be patched: admission webhook "v1.admission-webhook.configsync.gke.io"
denied the request: fields managed by Config Sync can not be modified

Si la protection contre les écarts est activée, lorsque vous déclarez un champ dans une configuration et que votre dépôt est synchronisé avec un cluster, Config Sync gère ce champ. Toute modification que vous tentez d'apporter à ce champ est une modification incompatible.

Par exemple, si vous disposez d'une configuration de déploiement portant le libellé environment:prod dans votre dépôt et que vous essayez de remplacer ce libellé par environment:dev dans votre cluster, vous générez un conflit et recevez le message d'erreur ci-dessus. Toutefois, si vous ajoutez une étiquette (par exemple, tier:frontend) au déploiement, il n'y aura pas de conflit.

Si vous souhaitez que Config Sync ignore les modifications apportées à un objet, vous pouvez ajouter l'annotation décrite dans la section Ignorer les mutations d'objets.

Échec de la suppression de tous les types de ressources

Un espace de noms bloqué dans la phase Terminating a la condition suivante :

    message: 'Failed to delete all resource types, 1 remaining: admission webhook
      "v1.admission-webhook.configsync.gke.io" denied the request: system:serviceaccount:kube-system:namespace-controller
      is not authorized to delete managed resource "_configmap_bookstore_cm1"'
    reason: ContentDeletionFailed
    status: "True"
    type: NamespaceDeletionContentFailure

Cette erreur se produit lorsque vous essayez de supprimer un objet Namespace d'un dépôt racine, mais que certains objets sous l'espace de noms sont toujours gérés activement par un rapprochement de l'espace de noms. Lorsqu'un espace de noms est supprimé, le contrôleur d'espace de noms, dont le compte de service est system:serviceaccount:kube-system:namespace-controller, tente de supprimer tous les objets de cet espace de noms. Cependant, le webhook d'admission Config Sync n'autorise que le rapprochement racine ou de l'espace de noms racine pour supprimer ces objets, et interdit au contrôleur d'espace de noms de supprimer ces objets.

Pour contourner ce problème, supprimez le webhook d'admission Config Sync :

kubectl delete deployment.apps/admission-webhook -n config-management-system

ConfigManagement Operator recrée le webhook d'admission Config Sync.

Si cette solution ne fonctionne pas, vous devrez peut-être réinstaller Config Sync.

Pour éviter de rencontrer à nouveau l'erreur, supprimez le dépôt d'espaces de noms avant de supprimer l'espace de noms.

Étapes suivantes