コンテンツにスキップ

Ingress Controller@Ingress Controller 系

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. Ingress Controller とは

Ingress Controller は、kube-controller のように単一/複数の Ingress に watch イベントを送信する。

Ingress のルールに応じたリバースプロキシやロードバランサー (Ingress Controller の種類による) を作成し、Node 外から受信した通信を Service にルーティングする。

注意点として、Ingress Controller が Service にルーティングするのであって、Ingress はあくまでルーティングのルールを定義しているだけである。

Kubernetes の周辺ツール (例:Prometheus、AlertManager、Grafana、ArgoCD など) のダッシュボードを複数人で共有して参照する場合には、何らかのアクセス制限を付与した Ingress を作成することになる。

kubernetes_ingress-controller


02. 外部 Ingress Controller の使用

外部 Ingress Controller の種類

Ingress Controller には種類があり、 Controller ごとに作成するリバースプロキシやロードバランサーが異なる。

外部 Ingress Controller の種類 リバースプロキシ、ロードバランサー 開発環境 本番環境
Nginx Ingress Controller Nginx ✅ ✅
minikube の ingress アドオン (実体は Nginx Ingress Controller) Nginx ✅
AWS Load Balancer Controller AWS ALB ✅
Google Cloud CLB Controller Google Cloud CLB ✅
Istio Ingress Controller Istio Ingress Gateway (実体は Envoy) ✅ ✅
Contour Controller Envoy ✅ ✅
... ... ... ...


AWS Load Balancer Controller の場合

パブリックネットワーク
⬇⬆️︎
Amazon Route 53
⬇⬆️︎
# L7 ロードバランサー (単一の L7 ロードバランサーを作成し、異なるポートを開放する複数の L4 ロードバランサーの振り分ける)
AWS Load Balancer ControllerによるAWS ALB
⬇⬆️︎
# L4 ロードバランサー
NodePort Service (ポート番号はランダムでよい)
⬇⬆️︎
Pod


Istio Ingress Controller の場合

パブリックネットワーク
⬇⬆️︎
Amazon Route 53
⬇⬆️︎
  # L7 ロードバランサー (単一の L7 ロードバランサーを作成し、異なるポートを開放する複数の L4 ロードバランサーの振り分ける)
AWS ALB
⬇⬆️︎
  # L4 ロードバランサー
NodePort Service (Istio Ingress Gateway)
⬇⬆️︎
Gateway
⬇⬆️︎
VirtualService
⬇⬆️︎
  # L4 ロードバランサー
ClusterIP Service
⬇⬆️︎
Pod


03. 機能

Ingress の検知

Ingress に定義したルーティングのルールを検知する。

Kubernetes Cluster に単一の Ingress Controller を作成するとよい。

また、各 Namespace 用に定義した Ingress を使用して、各 Namespace の Service にルーティングするとよい。


インバウンド通信とアウトバウンド通信

Ingress Controller は、名前では Ingress となっているが Egress (アウトバウンド通信) も扱う。


Ingress の設定値のバリデーション

Ingress Controller は、『***-controller-admission』という Service で webhook サーバーを公開している。

この webhook サーバーは、新しく追加された Ingress の設定値のバリデーションを実行する。

これにより、不正な Ingress が稼働することを防止できる。

この webhook サーバーの登録時、まず『***-create』という Job 配下の Pod が、有効期限の長いサーバー証明書を持つ Secret を作成する。

その後、『***-patch』という Job 配下の Pod が、ValidatingWebhookConfiguration にこのサーバー証明書を設定し、webhook サーバーにサーバー証明書が割り当てられる。


サーバー証明書の割り当て

Ingress Controller は、Secret に設定されたサーバー証明書を参照し、これを自身のロードバランサー (例:Nginx) に渡す。

kubernetes_ingress-controller_certificate