Ingress(イングレス)
Ingress(イングレス)は、Kubernetes(クーバネティス)環境において、クラスタ内部のサービスへ外部からHTTP/HTTPSトラフィックをルーティングするためのAPIオブジェクトです。簡単に言うと、ウェブサイトへのアクセスを、適切なサーバーに振り分ける「交通整理役」のようなものです。🚗
Ingressがないとどうなるの?
Kubernetesクラスタ内で動くアプリケーション(サービス)は、通常、クラスタ内部のプライベートIPアドレスを持っています。そのため、外部のインターネットから直接アクセスすることはできません。外部からアクセスできるようにするには、通常、以下の方法が考えられます。
- NodePort: 各ワーカーノード(サーバー)の特定のポートを開放し、そのポート経由でサービスにアクセスできるようにする方法です。しかし、多くのサービスを公開するとポートの管理が煩雑になります。
- LoadBalancer: クラウドプロバイダが提供するロードバランサーをプロビジョニングし、それ経由でサービスにアクセスできるようにする方法です。これは便利ですが、サービスごとにロードバランサーが必要になり、コストがかさむ場合があります。
これらの方法では、設定が複雑になったり、コストが増えたりする課題がありました。
Ingressの役割とメリット
Ingressは、これらの課題を解決し、より柔軟かつ効率的に外部からのアクセスを制御します。
- 単一のエントリーポイント: 複数のサービスに対して、一つのIPアドレス(またはドメイン名)でアクセスを受け付けることができます。これにより、クライアントは複数のIPアドレスを覚える必要がなくなります。
- ルーティングルール: 受信したリクエストのURLパスやホスト名に基づいて、どのサービスにトラフィックを振り分けるかを細かく設定できます。
- 例:「
example.com/blog
へのアクセスはブログサービスへ」「example.com/shop
へのアクセスはショッピングサービスへ」 - 例:「
blog.example.com
へのアクセスはブログサービスへ」「shop.example.com
へのアクセスはショッピングサービスへ」
- 例:「
- SSL/TLS終端: HTTPS通信のために必要なSSL/TLS証明書をIngressの段階で処理できます。これにより、バックエンドのサービス側でSSL/TLSの設定をする手間が省けます。
- ロードバランシング機能: トラフィックを複数のバックエンドサービスインスタンスに分散し、負荷を均等に保ちます。
Ingress Controllerとの関係
Ingress自体は「交通整理のルール」を定義するだけです。実際にそのルールを解釈し、トラフィックをルーティングする役割を担うのがIngress Controllerです。Nginx Ingress Controller、GCE Ingress Controller、Traefikなど、様々なIngress Controllerが存在します。
Google CloudのGKE(Google Kubernetes Engine)では、デフォルトでGCE Ingress Controllerが利用でき、Google Cloudのロードバランサーと連携して動作します。
どんな時に便利?
- 複数のWebサービスを一つのドメインで公開したい場合: マイクロサービスアーキテクチャで複数のサービスが連携するようなシステムで特に有効です。
- 異なるパスやサブドメインでサービスを切り替えたい場合: 会社のウェブサイトとブログを同じドメインで運用したいが、アクセス先を分けたい場合など。
- SSL/TLS証明書を一元管理したい場合: 複数のサービスでSSLを利用する際に、Ingressで一括して証明書を管理できます。