Kubernetes

Ingress いんぐれす

KubernetesロードバランサーHTTPルーティングSSL終端Nginxクラウドネイティブ
Ingressについて教えて

簡単に言うとこんな感じ!

Ingressはホテルの「フロント受付」みたいなものだよ! 外から来たお客さん(HTTPリクエスト)を「レストランはこちら」「スパはこちら」って正しい部屋(サービス)に案内してくれるKubernetesの入口係なんだ!


Ingressとは

Ingress(イングレス)とは、Kubernetesクラスター(複数のサーバーをまとめて管理する仕組み)の外部から来るHTTP/HTTPSのトラフィックを、クラスター内部の適切なサービスへ振り分けるためのAPIオブジェクトです。英語の “ingress” は「入口・入場」を意味し、まさにクラスターへの「玄関口」の役割を担います。

Kubernetesでアプリを動かすとき、外の世界からアクセスさせるには何らかの「入口」が必要です。単純な方法として NodePort(ノードのポートを直接開放)や LoadBalancer(クラウドのロードバランサーを1サービスごとに用意)がありますが、サービスが増えるたびにコストや管理の手間が増大します。Ingressはそれを解決し、1つの入口で複数のサービスへのルーティングを一元管理できる仕組みです。

たとえば example.com/api へのリクエストはAPIサービスへ、example.com/shop へのリクエストはショッピングサービスへ、といった振り分けをYAMLファイル1枚で定義できます。さらにSSL/TLS証明書の終端処理(HTTPSの暗号・復号をここで行うこと)も担えるため、各サービス側で証明書を個別管理する必要がなくなります。


Ingressの構造と仕組み

Ingressは大きく 「IngressリソースとIngress Controller」の2層構造になっています。

要素役割
Ingressリソースルーティングルールを定義するYAMLオブジェクトkind: Ingress で書くマニフェスト
Ingress Controllerルールを読んで実際にトラフィックを制御するプロセスNginx / Traefik / AWS ALB / GCE

Kubernetesにデフォルトで組み込まれているのは「Ingressリソース(ルール定義)」だけで、実際に動くIngress Controllerは別途インストールが必要な点が重要です。

ルーティングの種類

ルーティング種別説明
ホストベースドメイン名で振り分けapi.example.com → APIサービス
パスベースURLパスで振り分け/shop → ショップサービス
組み合わせホスト+パスを併用app.example.com/v2 → v2サービス

覚え方

「I(ngressは)入口係、C(ontrollerが)制御係」 IngressリソースとIngress Controllerはセットで使うものと覚えよう!

主なIngress Controller一覧

Controller特徴向いているシーン
Nginx Ingress Controller最も広く使われる。OSSオンプレ・マルチクラウド
Traefik自動証明書取得(Let’s Encrypt)が得意小規模・開発環境
AWS ALB Ingress ControllerAWSのALBと連携AWS EKS環境
GCE Ingress ControllerGoogle Cloud LBと連携GKE環境
Istio Gatewayサービスメッシュと統合マイクロサービス複雑構成

歴史と背景

  • 2014年 — Kubernetesがオープンソース公開。当初はサービス公開手段としてNodePortとLoadBalancerのみ
  • 2015年 — Kubernetes 1.1でIngressリソースがベータ機能として初登場。HTTP(S)ルーティングの標準的な方法として提案される
  • 2016〜2018年 — Nginx、Traefik、HAProxyなどサードパーティのIngress Controllerが急速に充実。本番環境での採用が広まる
  • 2019年 — AWS、GCP、Azureが各自のマネージドKubernetes(EKS/GKE/AKS)でIngress Controllerをフルサポート
  • 2020年 — Kubernetes 1.18でIngressリソースが一般提供(GA)に昇格。networking.k8s.io/v1 APIグループへ移行
  • 2021年〜現在 — より高機能な後継として Gateway API の開発が進行中。Ingressの限界(高度なトラフィック制御)を補う次世代仕様として注目される

IngressとKubernetesの他の公開方法との比較

外部からKubernetesサービスを公開する方法は複数あり、用途によって使い分けます。

方式特徴コスト感向いているケース
ClusterIPクラスター内部のみ通信可内部サービス間通信
NodePortノードのIPとポートを直接公開開発・テスト用途
LoadBalancerクラウドのLBを1サービスに1台割当高(サービス数×LB費用)単一の重要サービス
Ingress1つのLBで複数サービスに振り分け中(LBは1台で済む)本番・複数サービス
Gateway APIIngressの後継・高機能版中〜高複雑なトラフィック制御

以下にIngress経由でのトラフィック流れを図解します。

クライアント ブラウザ/ アプリ HTTPS Ingress Controller /api → APIサービス /shop → ショップ SSL終端 APIサービス Pod × 3 ショップ サービス Pod × 2 Webサービス Pod × 2 Ingress リソース (YAMLで定義) ルール読込 Kubernetes クラスター

関連する規格・RFC

規格・RFC番号内容
RFC 7230HTTP/1.1 メッセージ構文とルーティングの基礎(IngressがルーティングするHTTPの仕様)
RFC 8446TLS 1.3(IngressのSSL終端で利用される暗号化プロトコル)
RFC 7540HTTP/2(多くのIngress ControllerがサポートするHTTPプロトコル)

関連用語

  • Kubernetes — コンテナを大規模に管理・運用するオーケストレーションプラットフォーム
  • Pod — Kubernetesで動くコンテナの最小単位
  • Service(Kubernetes)Pod群への安定したアクセス窓口を提供するKubernetesオブジェクト
  • LoadBalancer — 複数のサーバーへトラフィックを分散させる装置・仕組み
  • SSL/TLS — 通信を暗号化するセキュリティプロトコル。IngressのHTTPS終端で使われる
  • Gateway API — Ingressの後継として開発中のKubernetes標準トラフィック管理API
  • Nginx — 最も広く使われるIngress Controllerの実装のひとつ
  • マイクロサービス — アプリを小さなサービスに分割するアーキテクチャ。Ingressが複数サービスを束ねる文脈で重要