Kubernetesの負荷分散に対応するNGINXおよびNGINX Plus Ingress Controller

NGINX | 2016年12月05日

複数のマシンで構成されるクラスター全体にわたり、コンテナ内のマイクロサービスアプリケーションを大規模に実行、管理することは容易ではありません。Kubernetesは、強力なコンテナオーケストレーションソリューションによって、この課題への対応を支援します。耐障害性、自動スケーリング、ローリングアップデート、ストレージ、サービスディスカバリ、負荷分散など、重要な機能を備えています。

このブログ記事では、NGINX Open SourceまたはNGINX Plusを、HTTPトラフィック向けのKubernetes組み込みロードバランシングフレームワークであるIngressと併用する方法について説明します。Ingressでは、Kubernetesクラスター内のサービスへの外部トラフィックのルーティングを制御するルールを設定できます。Kubernetesとロードバランサーを統合するためにクラスターへデプロイするソフトウェアであるIngressコントローラーを提供しているロードバランサーであれば、どれでも選択できます。ここでは、Ingressと、NGINX PlusおよびNGINX向けに提供しているIngressコントローラーを使用して、マイクロサービスアプリケーションのロードバランシングを設定する方法を紹介します。

[編集者注:これまでNGINXとNGINX Plusで別々に提供されていたコントローラーは、両方に対応する単一の「Ingress controller」に統合されました。]

このブログ記事では、Ingressを使用したKubernetes向けHTTPロードバランシングのみを取り上げます。その他のロードバランシングオプションについて詳しくは、F5のブログ記事「NGINX PlusによるKubernetesサービスのロードバランシング」をご覧ください。

注:このブログ記事で取り上げる手順の詳細な説明は、F5の「GitHubリポジトリ」でご確認いただけます。この記事では必要な手順をすべて説明するのではなく、該当する説明へのリンクを掲載しています。

NGINXおよびNGINX Plus向けIngress Controller

サンプルアプリケーションをデプロイして負荷分散を設定する前に、ロードバランサーを選択し、対応するIngressコントローラーをデプロイする必要があります。

Ingressコントローラーは、特定のロードバランサーをKubernetesと統合するソフトウェアです。F5はNGINX Open SourceとNGINX Plusの両方に対応するIngressコントローラーを開発しており、現在、F5のGitHubリポジトリで公開しています。サードパーティが開発した実装もあります。詳しくは、KubernetesのGitHubリポジトリにある「Ingress Controllers」ページをご覧ください。

クラスターにNGINXまたはNGINX Plus Ingress Controllerをデプロイするための詳しい手順については、F5の「GitHubリポジトリ」をご覧ください。

サンプルのマイクロサービスアプリケーション

このサンプルアプリケーションは、複数のサービスで構成され、それぞれが個別にデプロイされる一般的なマイクロサービスWebアプリケーションです。cafeという名前のこのアプリケーションでは、teaサービスを介して紅茶を、またはcoffeeサービスを介してコーヒーを注文できます。HTTPリクエストのURIで希望する飲み物を指定します。末尾が/teaのURIでは紅茶を、末尾が/coffeeのURIではコーヒーを注文できます。アプリケーションへの接続はSSL/TLSで保護する必要があります。

以下の図は、アプリケーションの概念図です。NGINX Plusロードバランサーは、クライアントリクエストを適切なサービスにルーティングするとともに、SSL/TLSでクライアント接続を保護するという重要な役割を担います。

NGINXおよびNGINX Plus Ingressコントローラーに付属するサンプルの「cafe」マイクロサービスアプリケーションで、Kubernetesの負荷分散を示しています

クラスターにアプリケーションをデプロイするには、F5のGitHubリポジトリに記載されている手順に従ってください。

IngressによるKubernetesロードバランシングの設定

このcafeアプリでは、ロードバランサーが次の2つの機能を提供する必要があります。

  • リクエストURIに基づくルーティング(「パスベースルーティング」とも呼ばれます)
  • SSL/TLS終端

Ingressで負荷分散を設定するには、Ingressリソースにルールを定義します。このルールでは、外部トラフィックをクラスター内のサービスにルーティングする方法を指定します。

このリソースでは、ドメイン名ごとに複数の仮想サーバーを定義できます。通常、仮想サーバーは、クラスターにデプロイされた1つのマイクロサービスアプリケーションに対応します。各サーバーでは、次の設定が可能です。

  • 複数のパスベースのルールを指定できます。リクエストURIに基づいて、トラフィックがアプリケーション内の異なるサービスに送信されます。
  • SSL/TLS証明書とキーを参照して、SSL/TLS終端を設定します。

Ingressの詳細な説明と例については、Ingressドキュメントページをご覧ください。

以下は、cafe‑ingress.yaml(cafeアプリ用)のIngressリソースです。

コード例を読み込み中…

1行ずつ確認すると、次のことがわかります。

  • 4行目で、リソースに「cafe‑ingress」という名前を付けます。
  • 6~9行目でSSL/TLS終端を設定します:
    • 9行目では、Secretリソースを名前「cafe‑secret」で参照しています。このリソースにはSSL/TLS証明書と鍵が含まれており、Ingressリソースより先にデプロイする必要があります。
    • 8行目では、証明書とキーをcafe.example.com仮想サーバーに適用します。
  • 11行目では、ドメイン名「cafe.example.com」を持つ仮想サーバーを定義します。
  • 13~21行目では、パスに基づく2つのルールを定義します。
    • 14~17行目で定義されているルールは、ロードバランサーに対し、URIが「/tea」のリクエストを、クラスター内に「tea」サービスとしてデプロイされている「tea‑svc」という名前のコンテナ間で分散するよう指示します。
    • 18~21行目で定義されているルールは、ロードバランサーに対し、URIが「/coffee」のリクエストを、クラスター内に「coffee‑svc」という名前でデプロイされている「coffee‑svc」サービスのコンテナ間で分散するよう指示します。
    • どちらのルールも、対応するサービスのポート80にリクエストを分散するようロードバランサーに指示します。

クラスターにIngressリソースとSecretリソースをデプロイする手順の詳細については、F5のGitHubリポジトリをご覧ください。

アプリケーションのテスト

NGINX Plus Ingress Controller、アプリケーション、Ingressリソース、Secretリソースをデプロイすると、アプリケーションをテストできます。

When we make a tea request with the /tea URIを使用してteaリクエストを送信すると、ブラウザーにteaサービスが生成したページが表示されます。

Kubernetesの負荷分散用NGINXおよびNGINX Plus Ingressコントローラーに付属するサンプルの「tea」マイクロサービスが、リクエストの詳細を含むインデックスページを返している画面

「tea」サービスと「coffee」サービスが実際に飲み物を提供するのではなく、実行中のコンテナに関する情報とリクエストの詳細を返すことに、あまりがっかりされないことを願います。返される情報には、コンテナのホスト名とIPアドレス、リクエストURI、クライアントIPアドレスが含まれます。ページを更新するたびに、異なるコンテナからレスポンスが返されます。

また、NGINX Plusの「ライブアクティビティモニタリング」ダッシュボードに接続し、NGINX Plusとアプリケーションの各コンテナから、リアルタイムの負荷分散メトリクスを確認できます。

NGINX Plusのライブアクティビティ監視ダッシュボードには、Kubernetesの負荷分散用NGINXおよびNGINX Plus Ingressコントローラーに付属するサンプル「cafe」アプリケーション内のマイクロサービス間で、NGINX Plusがリクエストを負荷分散する様子が表示されています

Ingress Controllerの拡張機能

Ingressは、基本的なHTTP負荷分散機能を提供します。しかし、アプリケーションの負荷分散要件はより複雑になることが多く、Ingressでは対応できない場合があります。こうした要件の一部に対応するため、Ingress Controllerに複数の拡張機能を追加しました。これにより、ロードバランサーを直接設定する代わりに、引き続きKubernetesリソースを使用して負荷分散を設定しながら、高度な負荷分散機能も活用できます。

利用可能な拡張機能の一覧については、F5の「GitHubリポジトリ」をご覧ください。

さらに、Kubernetesリソースを使用して、NGINX設定をカスタマイズするための仕組みも提供しています。ConfigMapリソースまたはアノテーションを介して設定できます。たとえば、proxy_connect_timeoutディレクティブやproxy_read_timeoutディレクティブの値をカスタマイズできます。

負荷分散の要件がIngressとF5の拡張機能でサポートされる範囲を超える場合は、Ingress Controllerを使用せずにNGINX Plusをデプロイして構成する別の方法を推奨します。詳しくは、F5のブログ記事「NGINX PlusによるKubernetesサービスの負荷分散」をご覧ください。

NGINX PlusとControllerを組み合わせるメリット

NGINX Plusを使用すると、Ingress Controllerでは、NGINXで得られるメリットに加えて、次のメリットも得られます。

  • 変化の激しい環境での安定性 – Ingress経由で公開されるサービスのPod数が変わるたびに、Ingressコントローラーは、その変更を反映するためにNGINXまたはNGINX Plusの設定を更新する必要があります。NGINX Open Sourceでは、設定ファイルを手動で変更し、設定を再読み込みする必要があります。NGINX Plusでは、動的再設定APIを使用して、設定ファイルを再読み込みせずに設定を更新できます。これにより、設定の再読み込みが非常に頻繁に行われた場合に発生する可能性がある、メモリ使用量の増加やシステム全体の過負荷を防止できます。
  • リアルタイム統計 – NGINX Plusは、高度なリアルタイム統計を提供します。APIまたは組み込みのダッシュボードからアクセスでき、NGINX Plusとアプリケーションのパフォーマンスを把握するのに役立ちます。
  • セッション維持 – セッション維持を有効にすると、NGINX Plusは「sticky cookie」方式を使用して、同じクライアントからのすべてのリクエストが常に同じバックエンドコンテナに渡されるようにします。

まとめ

Kubernetesは、Ingressを使用して外部トラフィックをクラスター内のサービスにルーティングするためのHTTPロードバランシング機能を標準で提供します。NGINXとNGINX PlusはKubernetesのロードバランシングと統合され、Ingressの機能を完全にサポートするとともに、より高度なロードバランシング要件に対応する拡張機能も提供します。

NGINX PlusとIngressコントローラーをお試しいただくには、今すぐ30日間の無料トライアルを開始するか、ユースケースについてご相談ください。


共有
タグ: F5 NGINX, 2016, Tech

関連するブログ記事

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
NGINX | 2024/01/18

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する

OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
NGINX | 2023/05/31

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正

Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
NGINX | 2023/02/09

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法

Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINX | 2022/05/24

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング

NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
NGINX | 2018/08/17

SELinuxでNGINXおよびNGINX Plusを使用する

Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。

NGINX PlusによるAWS Auto Scalingグループの負荷分散
NGINX | 2017/03/06

NGINX PlusによるAWS Auto Scalingグループの負荷分散

新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります