ingress-nginxって何?
ingress-nginxの説明をする前に、KubernetesのIngressとIngress Controllerの説明を少し。
Ingressって何?
Ingressの公式ドキュメントによると、Ingressとは、
An API object that manages external access to the services in a cluster, typically HTTP.
Ingress can provide load balancing, SSL termination and name-based virtual hosting.
サービスへのアクセスを制御する機能として、ロードバランシングや、SSL、バーチャルホストなどの機能を提供するためのAPIオブジェクトのこと。
Ingress Controllerって何?
Ingress Controllerの公式ドキュメントによると、Ingress Controllerとは、
In order for the Ingress resource to work, the cluster must have an ingress controller running.
Ingressリソースが設定で、その設定どおりに動く実態がIngress Controllerといった感じ。
実装としては、envoyベースやHAProxyベース、nginxベースなど、様々なものが存在しており、それぞれIngressが定める仕様を満たしつつ、様々な独自の拡張機能(Canaryリリースの仕組みなど)を提供している。
ユーザーが自分たちの要件に合わせて、どの実装をIngress Controllerとして選択して利用するかを決めることになる。
実際には、通常のアプリケーションのように、Ingress Controller用のDeploymentやServiceをKubernetesにデプロイする必要がある。
ingress-nginxって何?
ようやく本題。kubernetes/ingress-nginxは、Ingress Controllerの実装の1つで、Kubernetes Communityのリポジトリとして開発が進められている。
nginxベースのIngress Controllerとして、NGINX, Inc.が提供しているNGINX Ingress Controller for Kubernetesもあるが、こちらとは別物。
ingress-nginxはコミュニティベースが開発が進められているため、実験的な機能なども多く追加されている。
具体的な差異については、公式ドキュメントにも書かれている。
ingress-nginxはどのような仕組みで動いているのか
how-it-works.mdに概要が書かれているが、ソースコード(v0.26.1)を見ながら全体を図示してみるとこんな感じ(なはず)。
メイン処理
メインのプロセスはGoでビルドされたバイナリが実行され、Kubernetesのリソース(Ingress, ConfigMap, Service, etc..)情報を元に、nginxの制御を行っている。具体的には、
- Kubernetesのリソース情報を取得
- nginxプロセスの起動/リロード
- nginx.confの作成/更新
- LuaモジュールのConfigurationの更新
のような処理を行っている。
Kubernetesリソースの監視
Ingressリソースなど、nginxのConfigurationを構成するための情報が更新された場合、ingress-nginxにも反映させなければいけない。そのために、ingress-nginxはkubernetes/client-goライブラリを通じて、Kubernetesの各種リソースの監視を行っている。
どのような仕組みで監視を行っているかは、sample-controllerリポジトリのcontroller-client-go.mdがわかりやすいので、気になる人はこちらを見てほしい。
Luaモジュール
Goでビルドされたバイナリの他に、ingress-nginxは、nginxプロセス内で動くLuaモジュールも提供している。これらのモジュールは、受け取ったConfiguration情報を元に、各種アルゴリズムでのロードバランシング、Canaryリリースの制御などを行っている。
続き
ingress-nginxはどうやって動いているのか(2)では、より詳細な処理の流れをコードを追いながら見ていく。