編集部 – この記事は、包括的なeBook『Managing Kubernetes Traffic with F5 NGINX: 実践ガイド』からの抜粋です。今すぐ無料でダウンロード。
Kubernetesを初めて導入する多くの組織は、Kubernetesコミュニティが開発・保守するNGINX Ingress Controller(kubernetes/ingress-nginx)から始めます。しかし、Kubernetes環境の成熟に伴い、NGINXをデータプレーンとして維持しながら、高度な機能や商用サポートが必要になる組織もあります。
選択肢の1つは、F5 NGINXが開発および保守するNGINX Ingress Controller(nginxinc/kubernetes-ingress)に移行することです。ここでは、2つのプロジェクトの違いによって生じる複雑な問題を回避できるよう、詳細な手順を説明します。
これらの選択肢の違いについては、F5のブログ記事「Ingress Controller選定ガイド、パート4:NGINX Ingress Controllerの選択肢」をご覧ください。
この記事では以降、2つのプロジェクトを区別するため、Kubernetesコミュニティが管理するNGINX Ingress Controller(kubernetes/ingress-nginx)を「コミュニティ版Ingress Controller」、F5 NGINXが管理するもの(nginxinc/kubernetes-ingress)を「NGINX Ingress Controller」と呼びます。
コミュニティ版IngressコントローラーからNGINX Ingress Controllerに移行する方法は2つあります。
- オプション1:NGINX Ingressリソースを使用して移行
これは最適なソリューションです。その理由は、NGINX Ingressリソースが、本番環境レベルのKubernetes環境で必要となる、より幅広いIngressネットワーク機能をサポートしているためです。NGINX Ingressリソースの詳細については、ウェビナー「NGINX Ingress Controlleによる高度なKubernetesデプロイr」をご覧ください。 - オプション2:Kubernetes Ingressリソースを使用して移行
標準のKubernetes Ingressリソースを使用してIngressの負荷分散ルールを定義する方針の場合は、このオプションを推奨します。
オプション1:NGINX Ingressリソースを使用した移行
この移行オプションでは、標準のKubernetes Ingressリソースを使用して基本機能を設定し、NGINX Ingressリソースを使用して機能と使いやすさを向上させ、構成を強化します。
NGINX Ingressリソースのカスタムリソース定義(CRD)であるVirtualServer、VirtualServerRoute、TransportServer、GlobalConfiguration、Policyを使用すると、構成の各部分に対する制御をAppDevチームやセキュリティチームなどの異なるチームへ容易に委任できるほか、構成の安全性と検証機能を強化できます。
SSL終端とHTTPパスベースルーティングの設定
この表は、標準のKubernetes IngressリソースのspecフィールドにおけるSSL終端とレイヤー7のパスベースルーティングの設定を、NGINX specリソースのVirtualServerフィールドに対応付けています。2つのリソースでは構文とインデントが若干異なりますが、基本的なIngress機能は同じです。
| Kubernetes Ingressリソース | NGINX VirtualServerリソース |
|---|---|
|
|
TCP/UDPロードバランシングとTLSパススルーの設定
コミュニティ版Ingressコントローラーでは、KubernetesのConfigMap APIオブジェクトが、TCPおよびUDPサービスを公開する唯一の方法です。
NGINX Ingress Controllerでは、TransportServerリソースで、TCP/UDPおよびTLS Passthroughの負荷分散に関する幅広いオプションを定義できます。TransportServerリソースは、GlobalConfigurationリソースと組み合わせて使用し、受信接続と送信接続を制御します。
詳細については、F5のブログ記事「NGINX IngressリソースでのTCP、UDP、TLSパススルーサービスのサポート」をご覧ください。
コミュニティ版Ingress ControllerのアノテーションをNGINX Ingress Resourcesに変換
本番環境向けのKubernetesデプロイでは、カナリアデプロイやブルーグリーンデプロイ、トラフィックのスロットリング、イングレス/エグレスのトラフィック操作など、高度なユースケースに対応するために、基本的なIngressルールの拡張が必要になることがよくあります。
コミュニティ版Ingress Controllerでは、こうしたユースケースの多くをKubernetesの「アノテーション」で実装しています。しかし、これらのアノテーションの多くは、極めて限定的なNGINX Ingressリソース定義に対応するカスタムLua拡張機能を使用して構築されています。そのため、安定性とサポートが確保された本番環境で高度な機能を実装する用途には適していません。
以降のセクションでは、コミュニティ版IngressコントローラーのアノテーションをNGINX Ingress Controllerリソースに変換する方法を説明します。
カナリアデプロイ
本番環境のコンテナワークロードにコード変更を頻繁に反映する場合でも、既存ユーザーへのサービス提供を継続する必要があります。カナリアデプロイとブルーグリーンデプロイを使用すれば、サービスを継続しながら、NGINX Ingress Controllerのデータプレーン上でデプロイを実行でき、本番運用レベルのKubernetes環境で安定した予測可能な更新を実現できます。
この表は、コミュニティ版IngressコントローラーのVirtualServerおよびVirtualServerRouteリソースにおけるカナリアデプロイ用のアノテーションに対応するフィールドを示しています。
コミュニティ版Ingressコントローラーは、次の優先順位でカナリアアノテーションを評価します。
nginx.ingress.kubernetes.io/canary-by-headernginx.ingress.kubernetes.io/canary-by-cookienginx.ingress.kubernetes.io/canary-by-weight
NGINX Ingress Controllerで同じように評価するには、NGINX VirtualServerまたはVirtualServerRouteマニフェスト内に、この順序で記述する必要があります。
| Community Ingress Controller | NGINX Ingress Controller |
|---|---|
|
|
|
|
|
|
|
|
トラフィック制御
マイクロサービス環境では、アプリケーションは本質的に一時的な存在であり、エラーレスポンスを返す可能性が高くなります。そのためDevOpsチームは、アプリケーションが正常でない場合や想定どおりに機能していない場合にエラー状態が発生するのを防ぐため、サーキットブレーカー、レート制限、接続制限などのトラフィック制御ポリシーを幅広く活用しています。
この表は、NGINX VirtualServerおよびVirtualServerRouteリソースのフィールドのうち、コミュニティ版Ingressコントローラーの次のアノテーションに対応するものを示しています。レート制限、カスタムHTTPエラー、カスタムデフォルトバックエンド、URI書き換え。
| Community Ingress Controller | NGINX Ingress Controller |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表に示すとおり、本稿執筆時点では、NGINX Ingressリソースに以下の4つのCommunity Ingress Controllerアノテーションを直接変換するフィールドはないため、スニペットを使用する必要があります。この4つのアノテーションをPolicyリソースで直接サポートする機能は、NGINX Ingress Controllerの今後のリリースで提供される予定です。
nginx.ingress.kubernetes.io/limit-connectionsnginx.ingress.kubernetes.io/limit-ratenginx.ingress.kubernetes.io/limit-rate-afternginx.ingress.kubernetes.io/limit-whitelist
ヘッダー操作
HTTPヘッダーには、HTTPトランザクションに関与するシステムにとって重要かつ関連性の高い追加情報が含まれているため、多くのユースケースでHTTPヘッダーの操作が役立ちます。たとえば、コミュニティ版Ingressコントローラーでは、クロスオリジンリソース共有(CORS)ヘッダーを有効化して設定できます。CORSヘッダーは、ブラウザーのフロントエンドJavaScriptコードからバックエンドアプリケーションまたはWebサーバーに接続するAJAXアプリケーションで使用されます。
次の表は、NGINX VirtualServerおよびVirtualServerRouteリソースのフィールドのうち、コミュニティ版Ingressコントローラーのヘッダー操作用アノテーションに対応するものを示しています。
| Community Ingress Controller | NGINX Ingress Controller |
|---|---|
|
|
プロキシと負荷分散
具体的なユースケースに応じて、NGINX Ingress Controllerでその他のプロキシ機能や負荷分散機能を設定することもできます。これらの機能には、負荷分散アルゴリズムの指定に加え、プロキシ接続のタイムアウトやバッファリングの設定が含まれます。
この表は、upstreamフィールドにあるステートメントのうち、コミュニティ版Ingress Controllerの次のアノテーションに対応するNGINX VirtualServerおよびVirtualServerRouteリソースのステートメントを示しています。NGINXロードバランシングのカスタマイズ、プロキシのタイムアウト、プロキシのバッファリング、およびサービスのCluster IPアドレスとポートへの接続のルーティング。
| コミュニティ版Ingress Controller | NGINX Ingress Controller |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mTLS認証
A サービスメッシュは、厳格なゼロトラスト環境で特に有用です。この環境では、クラスター内の分散アプリケーションが相互認証によって安全に通信します。では、クラスターに出入りするトラフィック(南北トラフィック)にも同等のセキュリティを適用する必要がある場合は、どうすればよいでしょうか。
Ingress ControllerレイヤーでmTLS認証を設定すると、外部接続のエンドシステムが有効な証明書を提示し、相互に認証できるようになります。
この表は、NGINX Policyリソースのフィールドのうち、コミュニティ版Ingress Controllerのアノテーションである「クライアント証明書認証」および「バックエンド証明書認証」に対応するものを示しています。
| コミュニティ版Ingress Controller | NGINX Ingress Controller |
|---|---|
|
|
|
|
セッション永続化(NGINX Plus限定)
この表は、NGINX Policyリソースのフィールドのうち、NGINX PlusベースのNGINX Ingress Controllerでのみ使用でき、コミュニティ版Ingress Controllerのセッション永続化(アフィニティ)アノテーションに対応するものを示しています。
| コミュニティ版Ingress Controller | NGINX Ingress Controller |
|---|---|
|
|
オプション2:Kubernetes Ingressリソースを使用して移行
コミュニティ版IngressコントローラーからNGINX Ingress Controllerに移行する2つ目の方法は、標準のKubernetes IngressリソースでアノテーションとConfigMapのみを使用し、必要に応じてmaster/minion方式の処理を利用することです。これにより、すべての設定をIngressオブジェクト内に保持できます。
注:この方法では、Ingressリソースのspecフィールドを変更しないでください。
アノテーションを使用した高度な設定
次の表は、NGINX Ingress Controllerがサポートするアノテーションに直接対応する、コミュニティ版Ingressコントローラーのアノテーションを示しています。
| Community Ingress Controller | NGINX Ingress Controller | NGINX Directive |
|---|---|---|
| N/A | ||
| Default:
|
||
|
||
|
||
|
||
|
||
|
||
|
||
| N/A | ||
|
|
N/A2 |
1コミュニティ版Ingressコントローラーでは、一部の負荷分散アルゴリズムの実装にLuaを使用しています。NGINX Ingress Controllerには、それらすべてに相当する機能があるわけではありません。
2HTTPトラフィックをHTTPSにリダイレクトします。コミュニティ版IngressコントローラーではLuaコードで実装していますが、NGINX Ingress ControllerではNGINXネイティブの「if」条件を使用します。
次の表は、NGINX PlusベースのNGINX Ingress Controllerでサポートされるアノテーションに直接対応する、コミュニティ版Ingressコントローラーのアノテーションを示しています。
| コミュニティ版Ingress Controller | NGINX PlusベースのNGINX Ingress Controller |
|---|---|
|
|
注:NGINX PlusベースのNGINX Ingress Controllerには、コミュニティ版Ingress Controllerではまったくサポートされていない機能向けの追加アノテーションがあります。これには、アクティブヘルスチェックや、JSON Web Tokenを使用した認証(JWT)などが含まれます。
ConfigMapによるグローバル設定
次の表は、コミュニティ版Ingress ControllerのConfigMapキーと、それぞれに直接対応するNGINX Ingress ControllerのConfigMapキーの対応関係を示しています。一部のConfigMapキー名は同一です。また、コミュニティ版Ingress ControllerとNGINX Ingress Controllerには、それぞれ相手側にはないConfigMapキーもあります(表には記載していません)。
まとめ
カスタムのNGINX Ingressリソース、またはアノテーションとConfigMapを使用する標準のKubernetes Ingressリソースのいずれかを使用して、コミュニティ版IngressコントローラーからNGINX Ingress Controllerに移行できます。前者は、より幅広いネットワーク機能をサポートしているため、本番環境レベルのKubernetes環境により適しています。
この記事は、包括的なeBook『Managing Kubernetes Traffic with F5 NGINX: A Practical Guide』からの抜粋です。今すぐ無料でダウンロード。
NGINX PlusベースのNGINX Ingress Controllerを、30日間の無料トライアルで今すぐお試しいただくか、ユースケースについてご相談ください。
著者について

関連するブログ記事
チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。
AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。
JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。
F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。
NGINX PlusによるAWS Auto Scalingグループの負荷分散
新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります