ingress-nginxをGKEにデプロイしたときに何が起こるか

はじめに

  • GKEのクラスターにIngressをデプロイする場合、annotationにkubernetes.io/ingress.class: nginxを追加すると、ingress-nginxが用いられる
  • GKEにデプロイした時にKubernetes Ingress APIを介してGoogle Cloudのネットワークロードバランサ―が生成されるが、Google Cloudで実際どういう構成になるのか、ingress-gceの場合とどう違うのかがイメージできなかったので、最小限のアプリ(Ingress+Service+Pod)をデプロイしたときに何が生成されてどういう関係性なのかを調査した
  • 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)をデプロイしたとき、下図のような構成になる
ingress-nginxとService, Podをデプロイしたときの構成イメージ
  • 生成されるGoogle Cloudのサービスはタイミングはそれぞれ下記の通り
    • K8s clusterと3つのVM instatnceはGKEにクラスターを作成したとき
    • ロードバランサとターゲットプールはIngressをデプロイしたとき
  • ingress-nginxは、type: LoadbalancerというServiceを使っているため、TCP/UDP ネットワークロードバランサが生成される
  • 上図では、ロードバランサ―からPodへのアクセスを簡略化しているが、実際のイメージは下図の左側のように、iptablesなどを介する
デフォルトの動作(左)とコンテナネイティブのロードバランサの動作の比較
(引用:https://cloud.google.com/kubernetes-engine/docs/concepts/container-native-load-balancing
  • ロードバランサ―に紐づくターゲットプールに設定されている転送ルールは、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アドレスを確認できる
  • バックエンドサービスを設定し、背後でサービスを実行する
    • バックエンドサービス:Cloud Load Balancing によるトラフィックの分散方法を定義する
    • バックエンドサービスに設定する分散方法は、「バックエンド」と呼ばれる
  • 今回のケースでは、Ingressをデプロイすることで、「外部TCP/UDP ネットワークロードバランサが生成され、そのバックエンドサービスのバックエンドとしてVM instanceが3つを含み、ingress-nginx-controllerの設定と連携した転送ルールをもつターゲットプールが設定される」という状況

VM instance

  • 厳密にはGKEクラスターを作成したときにインスタンスが3つ作成される
  • 各VM instanceは、KuberenetesにはNodeとして認識され、Podが配置される
  • nginx-controllerはPodとして動作する

参考