NGINX.COM
Web Server Load Balancing with NGINX Plus

KubernetesのIngressロードバランシングのプロビジョニングと構成には、これまでKubernetes Ingressリソースが使用されてきました。Ingressリソースでは、SSL/TLSターミネーション、HTTPロードバランシング、Layer 7ルーティングを簡単に構成できますが、それ以上のカスタマイズはできません。アノテーション、ConfigMap、カスタムテンプレートを代わりに使用することになりますが、以下のような制限があります。

  • 範囲がグローバルであり、きめ細かく設定できない
  • エラーが発生しやすく、作業が困難
  • 安全ではない

NGINX Ingressリソースは、オープンソース版NGINXとNGINX Plusベースの両方のバージョンのNGINX Ingressコントローラーに対応する代替手段です。ネイティブかつ簡単に利用でき、インデント付きの構成で、次のようなIngressロードバランシング機能を簡単に実装できます。

  • サーキットブレーカー – アプリケーションエラーの適切な処理
  • 高度なルーティング – A/Bテストやブルーグリーンデプロイメント
  • ヘッダー操作 – アプリケーションロジックをNGINX Ingressコントローラーにオフロード
  • 相互TLS認証(mTLS) – ゼロトラストまたはアイデンティティーベースのセキュリティ
  • Webアプリケーションファイアウォール(WAF) – HTTP脆弱性攻撃からの保護

NGINX Ingressリソースを既存のNGINXユーザーが使用することで、Kubernetes以外の環境からロードバランシングの構成を簡単に再利用して、すべてのNGINXロードバランサーで同じ構成が使用されるようにすることができます。

以下のVirtualServer(VS)オブジェクトは、SSL/TLSターミネーションやパスベースルーティングなどのIngressコントローラーの基本機能のプロビジョニングのサンプルです。ドメイン名がapp.example.comでURIに/productsを入力したリクエストはproductsサービスに、URIに/billingを入力したリクエストはbillingサービスにルーティングされます。

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
name: app
spec:
host: app.example.com
tls:
secret: app-secret
upstreams:
- name: products
service: products-svc
port: 80
- name: billing
service: billing-svc
port: 80
routes:
- path: /products
action:
pass: products
- path: /billing
action:
pass: billing

The object needs to reference a Kubernetes Secret object to establish SSL/TLS connections with clients. The Secret contains sensitive data such as the SSL certificate and key for encrypting data. For more about Secrets, see .
VirtualServerオブジェクトは、Kubernetes Secretオブジェクトを参照して、クライアントとのSSL/TLS接続を確立する必要があります。Secretには、SSL証明書やデータを暗号化する鍵などの機密データが含まれています。Secretの詳細については、Kubernetesのドキュメントを参照してください。

高度なルーティング

トラフィックのインテリジェントなルーティングにより、次のようなユースケースに対応します。

  • トラフィックのデバッグ – リクエストを新しいテストインスタンスにルーティングする
  • トラフィックの分割 – トラフィックのサブセットをKubernetesサービスにルーティングする
  • ブルーグリーンデプロイメント – エンドユーザーを更新した本番ワークロードにスムーズに移行する

クライアントから提示された接続属性に基づき、リクエストをルーティングすることができます。この例では、トラフィックがセッションCookieに基づきルーティングされます。セッションCookieが一致する認証されたユーザーは、app-edgeインスタンスにルーティングされます。

kind: VirtualServer
metadata:
name: cafe
spec:
host: cafe.example.com
upstreams:
- name: app-edge
service: app-edge-svc
port: 80
- name: app-stable
service: app-stable-svc
port: 80
routes:
- path: /
matches:
- conditions:
- cookie: session
value: suxxis-12hs6dds-dhfgry-ssss
action:
pass: app-edge
action:
pass: app-stable

以下の構成例では、ブルーグリーンデプロイメントを使用して、アプリケーションの本番(ブルー)バージョンから新バージョン(グリーン)にトラフィックを切り替えることで、新バージョンが本番レベルのトラフィックを処理でき、実際に改善されていることを、サービスを中断させることなく検証しています。この例では、入ってくるトラフィックの90%が本番環境版(products-v1)に、10%が新バージョン(products-v2)に送信されるようにしています。product-v2で十分なパフォーマンスが得られなかったとしても、その問題が影響するユーザーは少ないため、すぐにこの分割を変更してすべてのトラフィックをproduct-v1に戻すことができます。products-v2で十分なパフォーマンスが得られることがわかった場合は、この分割を(少しずつ、または一度に)調整してルーティングされるトラフィックを多くし、products-v1が受信するトラフィックがなくなった段階でproducts-v1を廃止し、グリーンインスタンスを新しいブルー(本番)インスタンスに変えることができます。

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
name: app
spec:
host: app.example.com
upstreams:
- name: products-v1
service: products-v1-svc
port: 80
- name: products-v2
service: products-v2-svc
port: 80
routes:
- path: /products
splits:
- weight: 90
action:
pass: products-v1
- weight: 10
action:
pass: products-v2

GitHubリポジトリには、NGINX Ingressコントローラーをデプロイする詳細なサンプルが数多く提供されています。

ポリシー

ポリシーは、一度定義すれば異なるチームがアプリケーションの異なる領域に適用することができる、NGINX Ingressのリソースです。ポリシーが個別のKubernetesオブジェクトとして適用されることで、次のような機能が実装されます。

  • レート制限 – ユーザーが実行できるリクエストの数量を制限する
  • mTLS認証 – クライアントとサーバーの両方の証明書を構成可能な認証局(CA)に対して検証する
  • IPアドレスベースのアクセス制御リスト – トラフィックを、IPアドレス/サブネットに基づき、許可または拒否する
  • JWT検証 – ユーザーをIDトークンで認証し、シングルサインオンを有効にする
  • WAF – アプリケーションを脅威や脆弱性から保護する

以下のPolicyオブジェクトの例は、レート制限を規定しています。rateフィールドで定義したレート制限(この例の場合は秒あたり1リクエスト)は、リクエストから${binary_remote_address}変数に取得され、一意のオリジンIPアドレスにそれぞれ適用されます。

apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
name: rate-limit-policy
spec:
rateLimit:
rate: 1r/s
key: ${binary_remote_addr}
zoneSize: 10M

ポリシーをVirtualServer(VS)オブジェクトやVirtualServerRoute(VSR)オブジェクトで参照することで、NGINX Ingressコントローラーポリシーがトラフィックに適用されるようにする必要があります。

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
name: webapp
spec:
host: webapp.example.com
policies:
- name: rate-limit-policy
upstreams:
- name: webapp
service: webapp-svc
port: 80
routes:
- path: /
action:
pass: webapp

NGINX Ingressリソースの詳細については、関連するドキュメントを参照してください。

関連資料

Ingress Controllerの選択ガイド, Part 1: 要件の特定

ブログ

Ingress Controllerの選択ガイド, Part 1: 要件の特定

規模が大きくなるにつれて、Ingress Controllerの選択はより重要になります。それは、トラフィックを A 地点から B 地点に移動させるという基本的な機能以上のものを提供できるからです。高度なトラフィック管理から、組み込みのセキュリティの可視化まで、Ingress ControllerはKubernetesスタックの中で最も強力なツールの1つになり得ます。

 
Kubernetesでのマルチテナントとネームスペースの分離を実現

ブログ

Kubernetesでのマルチテナントとネームスペースの分離を実現

NGINX Ingress Controllerをデプロイメント、エンタープライズのパターンでは共有のNGINX Ingress Controllerでネームスペースを分けた実装が一般的です。

 
Kubernetes のテスト環境から本番環境への移行

EBOOK

Kubernetes のテスト環境から本番環境への移行

快適なKubernetes環境を実現するには、Kubernetesネイティブなやり方でトラフィックを理解し、管理する必要があります。 このEBOOK では、POC からカナリアリリース、ブルーグリーンデプロイメントを利用し本番環境にいたるまで、トラフィックフローを柔軟に効果的に管理する際に必要となる情報や、Kubernetes 戦略に求められる要素を明確でわかりやすい解説と共に提供いたします。