Webhook の検証によって Ingress リソース操作が拒否されました
仮想プライベートクラウド クラシック・インフラストラクチャー
kubectl コマンドを実行して Ingress リソースを更新または作成すると、以下の例のようなエラー・メッセージが表示されます。
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"
問題によっては、特定またはすべての Ingress リソースを作成または更新できない場合があります。 また、特定の構成を使用できないようにすることもできます。
Ingress 検証は、Ingress リソースが無効である可能性があるアプリケーションを禁止するために有効になっています。 適用しようとしている構成が無効であるために拒否されたか、Webhook が失敗しています。
Ingress の検証が有効になっている場合、検証 Web フックがクラスターにデプロイされ、各 Ingress リソースが作成または更新される前に検証されます。 この Webhook は、(検証が有効になっている) 各 ALB デプロイメントから ALB レプリカの 1 つを呼び出し、その ALB ポッドがリソースを検証します。 Webhook には、ALB のポッドが使用可能でない場合に操作が成功しないようにする FailurePolicy が構成されています。
Ingress の検証では、通常の操作の一環として無効なリソースが拒否されるため、特定のリソースを拒否する理由を特定することが重要です。
問題を特定して軽減するには、以下のセクションを確認してください。
無効な構成が検証 Webhook によって拒否されました
通常の操作の場合、Ingress リソースが拒否されると、障害情報には、問題を示す理由付きの denied the request 応答が含まれます。
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
この場合は、適用しようとしている Ingress リソースがその ALB に対して有効であること、および使用しようとしている機能 (スニペット・アノテーションなど) が使用可能で有効になっていることを確認する必要があります。 リソースを修正した後、単にリソースの適用を再試行することができます。
Webhook 自体に障害が発生している
Webhook 自体に問題がある場合は、障害情報に denied the request が表示されず、代わりに以下の例のような Internal error occurred メッセージが表示されます。
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
Webhook 自体のデバッグについては、 Webhook のデバッグ に関する資料を参照してください。 調査または問題の修正の一環として、ALB の検証機能を無効にすることをお勧めします。これを行うには、 検証機能の無効化 のセクションを参照してください。
検証機能の無効化
デバッグ・サービスまたはリストア・サービスの一部として、妥当性検査 Webhook を使用不可にすることが必要になる場合があります。 これを行うには、入口デプロイメントをカスタマイズするために、 ConfigMap で enableIngressValidation 構成オプションを "false" に設定する必要があります。
この構成オプションは ALB ごとに存在するため、個々の ALB デプロイメントに対してこの機能を選択的に有効または無効にすることができます。
検証 Webhook の有効化または無効化には、数分かかる場合があります。 クラスターで現在有効な検証 Webhook を確認するには、以下の kubectl コマンドを使用します。
kubectl get -n kube-system ValidatingWebhookConfiguration -l 'app.kubernetes.io/part-of=managed-ingress'