ingress-nginxの仕組み

ingress-nginxを使っているのだけど、中の仕組みをあまり知らなかったので調べた。まず、ngix-ingress-controllerからバックエンドへリクエストがどう流れるのかだが、簡単に以下の図のようになる。

nginx-ingress-controllerまでの流れはService Typeによるが、ここではNodePortを指定している。externalTrafficPolicyをClusterにしておくと、どのノードにリクエストが届いてもnginx-ingress-controller Podにルーティングされる。もちろん、Podが複数ある場合は、ロードバランスされる。

さて、気になるのはnginx-ingress-controllerから先。結論から書くと、IngressにのBackendに設定したサービスのエンドポイントにロードバランスしている。Podの中をみてみると、nginx-ingress-controllerとnginxが動いている。nginx-ingress-controllerはk8sのapi-serverにアクセスし、サービスのエンドポイントを取得する。nginx側ではluaが動いていて、Backendを登録するためのURLを提供している。ngix-ingress-controllerはそのURLへPOSTしてサービスのエンドポイントをnginxに伝える。

エンドポイントはngx.shared.configuration_dataの中に保存されており、balancer_by_lua_blockから呼ばれるbalancer.balance()から参照され、ロードバランスするという仕組み。なお、ロードバランスのアルゴリズムはラウンドロビンとEWMAの2種類が使える。デフォルトはラウンドロビン。他にも色々設定とかありそうだけど、概ねの仕組みはこのようになっているようだ。

Reference: