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リソースの詳細については、関連するドキュメントを参照してください。