koukiblog

たぶんweb系の話題

Nginx Ingress Controller v1.0 でIngress リソースが作れなくなって困った話

Nginx Ingress Controllerをv0.3からV1.0系にアップデートしたのだけど、そのときにIngressリソース作成時にエラーが出るようになってはまったのでメモ。

エラーはこういうエラーが出ました

Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post https://ingress-nginx-controller-admission.ingress-nginx.svc:443/extensions/v1beta1/ingresses?timeout=30s: context deadline exceeded

同じエラーのIssueがありました。 github.com

Issue内にも記載がある通り、MasterノードからWorkerノードのポート:8443でのアクセスを許可すれば解決しました。(なぜかIssueは解決していなくて、0.3系にバージョンダウンしたりAdmission Webhookを無効にしたりして解決してる方もいる様子)

この問題は、GKEのプライベートクラスタなど、MasterノードからWorkerノードへのアクセスを制限しているのが原因のようです。僕が検証していた環境はGKEのプライベートクラスタだったので、ファイアウォールルールの追加が必要でした。Issueをみると様々な環境でこの問題が発生してるようなので、もしかすると他の要因もあるかもしれないですが・・

NginxIngressControllerとGKEどちらのドキュメントにも記載がありました。

For private clusters, you will need to either add an additional firewall rule that allows master nodes access to port 8443/tcp on worker nodes, or change the existing rule that allows access to ports 80/tcp, 443/tcp and 10254/tcp to also allow access to port 8443/tcp.

See the GKE documentation on adding rules and the Kubernetes issue for more detail. Installation Guide - NGINX Ingress Controller

  • GKE
このセクションでは、限定公開クラスタにファイアウォール ルールを追加する方法について説明します。デフォルトでは、クラスタ コントロール プレーンはポート 443(HTTPS)および 10250(kubelet)上のみでノードおよび Pod への TCP 接続を開始するようにファイアウォール ルールによって制限されています。一部の Kubernetes 機能では、他のポート上でアクセスを許可するためにファイアウォール ルールを追加する必要があります。

追加のファイアウォール ルールを必要とする Kubernetes 機能は次のとおりです。

アドミッション Webhook
集計 API サーバー
Webhook 変換
動的監査の構成
通常、ServiceReference フィールドを持つ API では、追加のファイアウォール ルールが必要です。

cloud.google.com

Admission Webhookはv1.0から利用されているので、アップデート時にこの問題に直面すると結構はまりやすい気はしました。アプリケーションの動作確認はしてたけど、Ingressリソース作成成功するかのような確認はしてなかったので結構あせりました。