コンテンツにスキップ

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