Opérations de ressource Ingress refusées par la validation du webhook
Cloud privé virtuel Infrastructure classique
Lors de l'exécution de commandes kubectl pour mettre à jour ou créer des ressources Ingress, des messages d'erreur similaires aux exemples suivants s'affichent.
Error from server (BadRequest): error when creating "example-ingress.yaml": admission webhook "validate.nginx.ingress.kubernetes.io" denied the request: nginx.ingress.kubernetes.io/configuration-snippet annotation cannot be used. Snippet directives are disabled by the Ingress administrator
Error from server (InternalError): error when creating "test-broken-ingress.yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": failed to call webhook: Post "https://public-crcppcl2s207t5c95g1qgg-alb1-ingress-admission.kube-system.svc:443/networking/v1/ingresses?timeout=10s": no endpoints available for service "public-crcppcl2s207t5c95g1qgg-alb1-ingress-admission"
En fonction du problème, il se peut que vous ne puissiez pas créer ou mettre à jour certaines ou toutes les ressources Ingress. Vous pouvez également être empêché d'utiliser certaines configurations.
La validation Ingress est activée pour interdire l'application de ressources Ingress potentiellement non valides. La configuration que vous tentez d'appliquer n'est pas valide et a été refusée ou le webhook a échoué.
Lorsque la validation Ingress est activée, un webhook de validation est déployé sur le cluster qui valide chaque ressource Ingress avant qu'elle ne soit créée ou mise à jour. Ce webhook appelle l'une des répliques d'équilibreur de charge d'application à partir de chaque déploiement d'équilibreur de charge d'application (où la validation est activée) et ce pod d'équilibreur de charge d'application valide la ressource. Le webhook comporte une FailurePolicy configurée qui empêche l'opération d'aboutir si aucun pod n'est disponible pour un équilibreur de charge d'application.
La validation Ingress refuse les ressources non valides dans le cadre de son fonctionnement normal. Il est donc important d'identifier la raison du refus d'une ressource particulière.
Consultez les sections suivantes pour identifier et atténuer le problème.
Configurations non valides refusées par le webhook de validation
En cas de fonctionnement normal, lorsque la ressource Ingress est refusée, les informations d'échec contiennent une réponse denied the request avec une raison indiquant le problème.
Error from server (BadRequest): error when creating "example-ingress.yaml": admission webhook "validate.nginx.ingress.kubernetes.io" denied the request: nginx.ingress.kubernetes.io/configuration-snippet annotation cannot be used. Snippet directives are disabled by the Ingress administrator
Dans ce cas, vous devez vérifier que la ressource Ingress que vous tentez d'appliquer est valide pour cet équilibreur de charge d'application, et que les fonctions qu'il tente d'utiliser sont disponibles et activées (telles que les annotations de fragment). Après avoir corrigé la ressource, vous pouvez simplement réessayer d'appliquer la ressource.
Le webhook lui-même échoue
En cas de problème avec le webhook lui-même, vous ne verrez pas denied the request dans les informations d'échec, mais vous verrez un message Internal error occurred, comme dans l'exemple suivant.
Error from server (InternalError): error when creating "example-ingress.yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post https://public-crcppcl2s207t5c95g1qgg-alb1-ingress-admission.kube-system.svc:443/networking/v1/ingresses?timeout=10s: dial tcp 172.21.70.236:443: connect: connection timed out
Pour déboguer le webhook lui-même, consultez notre documentation sur les webhooks de débogage. Dans le cadre de l'investigation ou de la résolution du problème, vous pouvez désactiver la fonction de validation pour l'équilibreur de charge d'application. Pour ce faire, voir la section Désactivation de la fonction de validation.
Désactivation de la fonction de validation
Il peut arriver que vous souhaitiez désactiver le webhook de validation dans le cadre d'un service de débogage ou de restauration. Pour ce faire, vous devez définir l'option de configuration enableIngressValidation sur "false" dans ConfigMap pour personnaliser le déploiement Ingress.
Notez que cette option de configuration existe pour chaque équilibreur de charge d'application afin que vous puissiez activer ou désactiver cette fonction de manière sélective pour des déploiements d'équilibreur de charge d'application individuels.
L'activation ou la désactivation des webhooks de validation peut prendre quelques minutes. Pour vérifier les webhooks de validation actuellement en vigueur pour votre cluster, vous pouvez utiliser la commande kubectl suivante:
kubectl get -n kube-system ValidatingWebhookConfiguration -l 'app.kubernetes.io/part-of=managed-ingress'