koukiblog

たぶんweb系の話題

Nginx Ingress ControllerはAnnotationに不正な値をセットすると503を返す

起きたこと

Nginx Ingress Controllerが突然503しか返さなくなり、原因を調べるのにめちゃくちゃ時間がかかってしまった。

前提

Nginx Ingress Controllerは、ユーザーの記述したManifestを元にNginxのconfを生成します。これは、Nginx Ingress ControllerのPodにログインして、 /etc/nginx/nginx.conf を参照すると確認できます。

原因

Nginx Ingress Controllerのソースコードを確認すると、confを生成しているテンプレートがあり、503を返す箇所を確認することができます。なぜエラーなのかもコメントとして出力されます。

ingress-nginx/nginx.tmpl at ff74d0ff3316a1446ffc73ae0e7a05a8a252551f · kubernetes/ingress-nginx · GitHub

巨大なif文なので、ちょっと読みづらいですが、

            {{ else }}
            # Location denied. Reason: {{ $location.Denied | quote }}
            return 503;
            {{ end }}

に対応するif文は、1069行目の

{{ if isLocationAllowed $location }}

です。

ingress-nginx/nginx.tmpl at ff74d0ff3316a1446ffc73ae0e7a05a8a252551f · kubernetes/ingress-nginx · GitHub

たとえば、White List SourceRange のようにCIDRを期待しているannotationに、CIDRではない値をセットすること、 isLocationAllowdがFalseになり、503を返します。

Annotationの一覧はこちら

kubernetes.github.io

学び

Nginx Ingress Controllerをある種ブラックボックスとして扱っていたのですが、Nginx Ingress Controllerはnginxのconfを生成しているということを知っていれば、もっと早く解決できたので、利用しているミドルウェアが何をしているのかはだいたいでいいので把握するようにしておきたいと思いました。とはいえ、まさかNginxのconfにエラーメッセージがあるとは思い至らないのでなかなか難しいところですが。