ingress-nginxをGKEにデプロイしたときに何が起こるか
はじめに
- GKEのクラスターにIngressをデプロイする場合、annotationに
kubernetes.io/ingress.class: nginx
を追加すると、ingress-nginxが用いられる- ingress-nginxは、Kuberentesコミュニティが管理しているNGINXベースのIngress Controller
(NGINXが管理しているNGINX & NGINX Plus Ingress Controllerとは別) - Ingressについてはこちらもご参考に:Kubernetes Ingressについて
- ingress-nginxは、Kuberentesコミュニティが管理しているNGINXベースのIngress Controller
- GKEにデプロイした時にKubernetes Ingress APIを介してGoogle Cloudのネットワークロードバランサ―が生成されるが、Google Cloudで実際どういう構成になるのか、ingress-gceの場合とどう違うのかがイメージできなかったので、最小限のアプリ(Ingress+Service+Pod)をデプロイしたときに何が生成されてどういう関係性なのかを調査した
- 調査したGKEおよびその他環境のversionや、デプロイ手順の詳細はこちら:ingress-gceとingress-nginxをGKEにデプロイする手順
- ingress-nginxをデプロイした場合の調査はこちら:ingress-gce(GKE Ingress)をGKEにデプロイしたときに何が起こるか
- Ingressのyamlは下記の通り(ServiceとDeploymentのyamlはこちら)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress annotations: kubernetes.io/ingress.class: nginx spec: defaultBackend: service: name: web port: number: 8080
ingress-nginxをデプロイしたときの構成
- Service、Podを一つ含むDeployment、Ingress(ingress-ingress)をデプロイしたとき、下図のような構成になる
- 生成されるGoogle Cloudのサービスはタイミングはそれぞれ下記の通り
- K8s clusterと3つのVM instatnceはGKEにクラスターを作成したとき
- ロードバランサとターゲットプールはIngressをデプロイしたとき
- ingress-nginxは、
type: Loadbalancer
というServiceを使っているため、TCP/UDP ネットワークロードバランサが生成される - 上図では、ロードバランサ―からPodへのアクセスを簡略化しているが、実際のイメージは下図の左側のように、iptablesなどを介する
- ロードバランサ―に紐づくターゲットプールに設定されている転送ルールは、nginx-ingress-controllerと連携しており、ingress-nginxに設定可能な細かいルールまで反映できるという利点がある
Google Couldの要素(ロードバランサ―、VMインスタンス)の詳細は以降にまとめる
構成要素
TCP/UDP ネットワークロードバランサ
- Cloud Load Balancingというサービスが提供するロードバランサのうちの一つ
- 厳密には、ターゲットプールベースの外部TCP/UDP ネットワークロードバランサ
- ターゲットプール:ロードバランサがアクセスを割り振るVM instance群
- ターゲットプールは、設定したVM instance群にどのようにアクセスを割り振るかを設定する、転送ルールを持ち
- L4ロードバランサであり、一つの外部IP アドレスをもつ
- 外部からアクセスすべきIPアドレスは、Ingressのアドレスと連携されているため、
kubectl
でIngressの設定を見るとIPアドレスを確認できる
- 外部からアクセスすべきIPアドレスは、Ingressのアドレスと連携されているため、
- バックエンドサービスを設定し、背後でサービスを実行する
- バックエンドサービス:Cloud Load Balancing によるトラフィックの分散方法を定義する
- バックエンドサービスに設定する分散方法は、「バックエンド」と呼ばれる
- 今回のケースでは、Ingressをデプロイすることで、「外部TCP/UDP ネットワークロードバランサが生成され、そのバックエンドサービスのバックエンドとしてVM instanceが3つを含み、ingress-nginx-controllerの設定と連携した転送ルールをもつターゲットプールが設定される」という状況
VM instance
- 厳密にはGKEクラスターを作成したときにインスタンスが3つ作成される
- 各VM instanceは、KuberenetesにはNodeとして認識され、Podが配置される
- nginx-controllerはPodとして動作する
ディスカッション
コメント一覧
まだ、コメントがありません