すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:NGINX Ingress コントローラーの更新

最終更新日:Apr 15, 2025

クラスターをアップグレードした後、新しい Kubernetes バージョンの一部の API は廃止されているため、NGINX Ingress コントローラーも更新する必要がある場合があります。この更新は、安定性とセキュリティ、および最新機能へのアクセスを確保するためにも推奨されます。

手順

NGINX Ingress コントローラーはデータプレーンの主要コンポーネントであるため、その安定性を確保する必要があります。

NGINX Ingress コントローラーを最新バージョンに更新すると、互換性の問題が発生する可能性があります。これは、最新バージョンが NGINX Ingress コントローラーの大幅な変更(大幅なカスタム変更を含む)を含むメジャーアップデートであるためです。さらに、インプレース更新では、NGINX Ingress コントローラーの更新後すぐに互換性の問題が発生するとは限らないため、潜在的なリスクが高くなります。

他のコンポーネントとは異なり、NGINX Ingress コントローラーは段階的に更新されます。これにより、ワークロードの状態を確認し、例外が発生した場合に更新をロールバックできます。

フェーズ 1:事前チェック

システムは、更新前に NGINX Ingress コントローラーの事前チェックを自動的に実行して、要件への準拠を確認します。NGINX Ingress コントローラーが前提条件を満たしていない場合、またはコンポーネントの状態が異常な場合は、コンポーネントを更新する前に、手動で問題を修正する必要があります。

フェーズ 2:検証

新しいバージョンの NGINX Ingress コントローラー用にポッドが作成されます。このポッドは、新しいバージョンの状態と Ingress ルールを検証するために使用されます。ポッドが作成されると、ユーザー トラフィックの一部がポッドに配信されます。コンテナー ログを分析するか、Simple Log Service または Managed Service for Prometheus を使用して、ユーザー トラフィックが期待どおりに処理されているかどうかを確認できます。

新しいバージョンのポッドが作成されると、更新プロセスは一時停止されます。コンポーネントとワークロードに例外が発生しないことを確認したら、手動で更新プロセスを再開できます。例外を特定した場合は、更新をロールバックし、新しいバージョンのポッドを削除できます。

更新をロールバックするには、デプロイメントの spec.minReadySeconds パラメーターと spec.strategy パラメーターを変更します。

フェーズ 3:リリース

リリース フェーズでは、ローリング更新が実行され、古いバージョンの NGINX Ingress コントローラーが新しいバージョンに置き換えられます。NGINX Ingress コントローラーのすべてのポッドが更新されると、更新プロセスは一時停止され、コンポーネントとワークロードの状態を確認できます。例外が発生しないことを確認したら、更新を完了できます。例外を特定した場合は、すべてのポッドの NGINX Ingress コントローラーを古いバージョンにロールバックしてから、更新を終了できます。

フェーズ 4:ロールバック(オプション)

更新中に発生する例外を特定できるように、検証フェーズとリリース フェーズでは更新プロセスが自動的に一時停止されます。例外を特定した場合は、NGINX Ingress コントローラーを古いバージョンにロールバックできます。

前提条件

  • NGINX Ingress コントローラーを更新する前に、ビジネストラフィックを監視し、例外を特定する方法があることを確認してください。 Simple Log Service または Managed Service for Prometheus を使用して、ビジネストラフィックを監視できます。 詳細については、「nginx-ingress-controller のアクセスログの分析と監視」および「Managed Service for Prometheus の使用」をご参照ください。

  • NGINX Ingress コントローラーの状態が正常であり、NGINX Ingress コントローラーのすべてのポッドが Ready 状態であり、エラー ログが生成されていないことを確認してください。

  • HorizontalPodAutoscaler(HPA)などの自動スケーリング ルールが使用されていないことを確認してください。自動スケーリング ルールが存在する場合は、ルールを削除し、更新を完了してから、ルールを再作成してください。

  • LoadBalancer サービスが期待どおりに実行されていることを確認してください。

  • 更新中に NGINX Ingress コントローラーまたは Ingress ルールを変更しないでください。

  • NGINX Ingress のバージョンが 0.44 より前の場合は、更新時にプレフィックス マッチングの違いに注意してください。 詳細については、「更新に関する注意事項」をご参照ください。

  • NGINX Ingress ポッドを適切に作成およびスケジュールできるように、クラスターに十分なノードがあることを確認してください。コンポーネントは、カナリア リリース戦略を使用して更新されます。まず、ターゲット バージョンの NGINX Ingress を実行するポッドが作成されます。トラフィックが検証されたら、[続行] をクリックしてローリング更新をトリガーします。

手順

  1. ACK コンソール にログインします。左側のナビゲーション ウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。左側のナビゲーション ウィンドウで、[操作] > [アドオン] を選択します。

  3. [アドオン] ページで、NGINX Ingress コントローラーを見つけて、右下の [アップグレード] をクリックします。

  4. 表示されるページで情報を確認し、[開始] をクリックして更新を開始します

    説明

    更新プロセス中はいつでも更新ページに戻ることができます。または、[アドオン] ページで [進捗状況] をクリックして、更新の進捗状況を表示することもできます。

  5. フェーズ 1 で事前チェックが実行されます。事前チェックが完了すると、更新は自動的にフェーズ 2 に進みます。

    NGINX Ingress コントローラーが事前チェックに合格しなかった場合は、[事前チェック] の下の [詳細の表示] をクリックして、[レポートの表示] ページに移動します。次に、このページに表示されている問題のトラブルシューティングを行います。詳細については、このトピックの「事前チェック」セクションをご参照ください。問題を修正した後、[再試行] をクリックして、更新を再開します。

  6. 検証フェーズが終了すると、更新プロセスは一時停止します。 NGINX Ingress コントローラーとワークロードのステータスを確認できます。 詳細については、このトピックの検証セクションをご参照ください。

    • ポッドが作成できない問題の修正方法の詳細については、この Topic の「検証およびリリースフェーズでポッドが作成できない場合はどうすればよいですか。」セクションをご参照ください。また、ポッドのエラーログを分析して、ポッドの起動に失敗した原因を特定することもできます。問題を修正した後、[再試行] をクリックして、検証を再度実行します。

    • ワークロードで例外が発生した場合は、[ロールバック] をクリックして更新をロールバックします。ロールバックが完了すると、更新プロセスは終了します。アドオンページで [アップグレード] をクリックして、更新を再開できます。

  7. 検証に合格したら、[続行] をクリックしてリリース フェーズに進みます。リリース フェーズ中のローリング更新が完了すると、更新プロセスは一時停止されます。 NGINX Ingress コントローラーとワークロードの状態を確認できます。ワークロードに例外が発生した場合は、[ロールバック] をクリックして更新をロールバックします。ロールバックが完了すると、更新プロセスは終了します。アドオン ページでアップグレードをクリックして、更新を再開できます。

  8. 例外が発生しない場合は、[続行] をクリックして更新を完了します。

    説明

    更新プロセスが 1 週間以内に完了していることを確認してください。

事前チェック

事前チェック表

チェック項目

内容

トラブルシューティング

デプロイメントが存在する

NGINX Ingress コントローラーのデプロイメント(kube-system/nginx-ingress-controller)が存在するかどうかを確認します。

該当なし

デプロイメントが正常

NGINX Ingress コントローラーのデプロイメントによって制御されるすべてのポッドが Ready 状態であるかどうかを確認します。これらのポッドがローリング更新を実行していないか、他の不安定な状態で実行されていないことを確認してください。

該当なし

エラー ログ

ポッド エラー ログの最新の 200 件のログ エントリを確認します。重大度レベルが Error または Fatal のエラーが存在しないことを確認してください。

上記のエラーが存在する場合は、無効な構成が原因で NGINX Ingress コントローラーで最近例外が発生しました。問題を修正してから、更新を再開する必要があります。 詳細については、「NGINX Ingress コントローラーのトラブルシューティング」をご参照ください。

LoadBalancer サービスが正常

NGINX Ingress コントローラーの LoadBalancer サービス(kube-system/nginx-ingress-lb)が存在するかどうかを確認します。 LoadBalancer サービスが存在する場合は、LoadBalancer サービスでエラー イベントが生成されているかどうかを確認します。

LoadBalancer サービスが存在しない場合は、警告イベントが生成されます。

LoadBalancer サービスが存在しない場合は、「NGINX Ingress コントローラーがインストールされているクラスターの kube-system 名前空間にある nginx-ingress-lb サービスを手動で削除する」問題の解決策について、「リスクの高い操作に関する使用上の注意と手順」をご参照ください。

LoadBalancer サービスでエラー イベントが生成された場合は、イベントの内容に基づいて問題を解決します。 詳細については、「サービスのトラブルシューティング」トピックの「サービス エラーと解決策」セクションをご参照ください。サービスのタイプが LoadBalancer でない場合は、このチェック項目はスキップされます。

HPA

NGINX Ingress コントローラーのデプロイメントで HPA が使用されているかどうかを確認します。 HPA は、更新プロセス中にスケーリング アクティビティをトリガーし、更新に悪影響を与える可能性があります。

したがって、NGINX Ingress コントローラーを更新する前に、クラスターから HPA リソースを削除し、更新が終了した後に HPA を再構成する必要があります。

デプロイメント

NGINX Ingress コントローラーのデプロイメントに互換性のある変更のみが含まれているかどうかを確認します。

更新では、NGINX Ingress コントローラーのデプロイメントに加えたカスタム変更を保持できません。

  • NGINX Ingress コントローラーの更新後、デプロイメントでは次のパラメーターのみがカスタム パラメーターとして保持されます。

    • replicas:レプリケートされたポッドの数。

    • template.metadata.labels:ポッド ラベル。

    • template.spec.nodeSelector:ポッド セレクター。

    • template.spec.tolerations:許容。

    • template.spec.containers[0].resources:NGINX Ingress コントローラーのコンテナーのリソース制限。

  • 次のパラメーターは事前チェックには影響しませんが、NGINX Ingress コントローラーの更新後に廃止されます。

    • template.metadata.annotations セクションの redeploy-timestamp パラメーター。

    • kubectl.kubernetes.io/restartedAt アノテーション。

    • scheduler.alpha.kubernetes.io/critical-pod アノテーション。

    • imagePullPolicy パラメーター。

    • パラメーターの値が Default に設定されている場合の template.spec.containers.securityContext.procMount パラメーター。

    • Webhook 構成(ランタイム パラメーター、ボリューム、ポートを含む)。

NGINX Ingress コントローラーのデプロイメントで上記のパラメーターを変更しても、このチェック項目が FAIL になることはありません。上記のパラメーター以外にデプロイメントに変更を加えた場合、古いバージョンを使用した場合、またはすべての更新要件を満たさずに NGINX Ingress コントローラーを更新した場合は、このチェック項目は FAIL になります。このチェック項目が FAIL になる一般的な理由を以下に示します。

  • Enterprise Distributed Application Service(EDAS)を使用してカスタム ボリュームをマウントしました。更新中は EDAS を一時停止する必要があります。

  • podAntiAffinity 設定が標準テンプレートの podAntiAffinity 設定と異なります。これは、テンプレートの変更が原因である可能性があります。たとえば、podAntiAffinity 設定が required から preferred に変更されています。 podAntiAffinity 設定を手動で変更して、podAntiAffinity 設定が標準テンプレートの podAntiAffinity 設定と同じになるようにする必要があります。

  • 排他的ノードを指定するために nodeAffinity パラメーターが追加されています。代わりに nodeSelector パラメーターを使用する必要があります。

このチェック項目が FAIL になる場合は、デプロイメント テンプレートを手動で復元できます。 詳細については、このトピックの「デプロイメント テンプレートがチェックに合格しない場合はどうすればよいですか?」セクションをご参照ください。

Ingress 構成

クラスター内の Ingress に互換性のある機能のみが含まれているかどうかを確認します。

クラスター内の Ingress で互換性のない機能が使用されている場合、NGINX Ingress コントローラーの更新後、NGINX Ingress コントローラーがユーザー トラフィックを期待どおりに配信できない可能性があります。その結果、サービス中断が発生する可能性があります。 Ingress 関連の互換性の問題を修正する方法については、このトピックの「互換性の問題」セクションをご参照ください。

コンポーネント構成

kube-system 名前空間の nginx-configuration ConfigMap に互換性のない構成が含まれているかどうかを確認します。

ConfigMap に互換性のない構成が含まれている場合、NGINX Ingress コントローラーの更新後、NGINX Ingress コントローラーがユーザー トラフィックを期待どおりに配信できない可能性があります。その結果、サービス中断が発生する可能性があります。 Ingress 関連の互換性の問題を解決する方法については、このトピックの「互換性の問題」セクションをご参照ください。

互換性の問題

開発とメンテナンス中に、新しいバージョンの NGINX Ingress コントローラーでは、新機能の導入、既存機能の強化、またはセキュリティ問題の修正が行われる場合があります。ただし、これらの更新により、内部アーキテクチャの変更または依存ライブラリのバリエーションが原因で、以前のバージョンとの互換性の問題が発生する可能性もあります。 NGINX Ingress コントローラーのリリースノートの詳細については、「NGINX Ingress コントローラー」をご参照ください。

ネイティブ NGINX 検証チェックはデフォルトで無効になっています

影響を受けるバージョン: v1.11.5-aliyun.1 より前のバージョン

CVE-2025-1974 を修正するために、v1.11.5-aliyun.1 以降、NGINX Ingress コントローラーはデフォルトでネイティブ NGINX 構成検証(nginx -t ロジックと同等)を無効にします。コンポーネントの検証 Webhook は有効なままですが、スニペット アノテーションで定義された構成は検証されません。スニペット以外のアノテーションのみが検証されます。スニペット構成については、NGINX によって生成されたランタイム エラー ログを通じて有効性を検証する必要があります。脆弱性の詳細については、「脆弱性 CVE-2025-1097、CVE-2025-1098、CVE-2025-1974、CVE-2025-24513、および CVE-2025-24514 に関するセキュリティ アドバイザリ」をご参照ください。

スニペット アノテーションを使用する場合は、スニペットを変更するたびに次のコマンドを実行して、NGINX Ingress コントローラー ポッド ログで構成エラーを監視します。

kubectl logs -f <Nginx-ingress-pod-name> -n kube-system |grep Error

ネイティブ NGINX 検証機能を保持するには、リスク評価を徹底的に行った後、enable-nginx-native-validation: "true" パラメーターを kube-system/nginx-configuration ConfigMap に手動で追加して有効にします。

スニペット アノテーションはデフォルトで許可されていません

影響を受けるバージョン: v1.9.3-aliyun.1 より前のバージョン。

セキュリティ上の理由から、NGINX Ingress コントローラー v1.9.3-aliyun.1 以降のバージョンでは、スニペット アノテーションは許可されていません。

  • nginx.ingress.kubernetes.io/configuration-snippet

  • nginx.ingress.kubernetes.io/server-snippet

  • nginx.ingress.kubernetes.io/stream-snippet

  • nginx.ingress.kubernetes.io/auth-snippet

  • nginx.ingress.kubernetes.io/modsecurity-snippet

セキュリティと安定性を確保するために、特定の機能を使用する場合は、スニペット アノテーションではなく、対応するアノテーションまたは設定を使用することをお勧めします。

スニペット アノテーションを使用する場合は、リスクを評価し、allow-snippet-annotations: "true"kube-system/nginx-configuration ConfigMap に追加して、スニペット アノテーションを許可します。

以前の TLS バージョンとの非互換性

影響を受けるバージョン: v1.7.0-aliyun.1 より前のバージョン。

TLS 1.1 以前のバージョンにはセキュリティ上の問題があります。 NGINX Ingress コントローラーは、次の TLS バージョンをサポートしなくなりました: TLS 1.1 および TLS 1.0。 NGINX Ingress コントローラーを更新する前に、サービスが TLS 1.1 以前のバージョンに依存しておらず、TLS 1.1 以前のバージョンがサービスの TLS 設定から削除されていることを確認してください。 ConfigMap への変更はすぐに有効になります。

次の内容は、kube-system 名前空間の NGINX Ingress コントローラーの nginx-configuration ConfigMap の TLS 設定の例を示しています。

ssl-protocols: SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2 TLSv1.3

サービスが TLS 1.1 以前のバージョンに依存していないことを確認したら、この構成行を削除してデフォルトの TLS 設定を使用できます。また、TLS 設定から TLS 1.1、TLS 1.0、SSL 3.0、および SSL 2.0 を削除することもできます。例:

ssl-protocols: TLSv1.2 TLSv1.3

以前の TLS バージョンを使用する場合は、必要なドキュメントを参照して構成を完了してください。 詳細については、「Nginx Ingress FAQ」トピックの「Ingress でサポートされている SSL/TLS バージョンはどれですか?」セクションをご参照ください。

nginx.ingress.kubernetes.io/rewrite-target アノテーションに関連する非互換性の問題

影響を受けるバージョン: 0.22.0 より前のバージョン。

  • NGINX Ingress コントローラー 0.22.0 では、nginx.ingress.kubernetes.io/rewrite-target アノテーションの使用方法が変更されています。 NGINX Ingress コントローラー 0.22.0 以降のバージョンでは、rewrite-target アノテーションを使用する場合、キャプチャ グループを明示的に指定する必要があります。

  • 0.22.0 より前の NGINX Ingress コントローラー バージョンの rewrite-target アノテーションは、それ以降のバージョンの rewrite-target アノテーションと互換性がありません。 NGINX Ingress コントローラーを更新する前に、rewrite-targetconfiguration-snippet に置き換えてください。

たとえば、NGINX Ingress コントローラーのバージョンが 0.22.0 より前で、次の Ingress ルールを使用しているとします。

YAML コンテンツを表示

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: rewrite
  namespace: default
spec:
  rules:
  - host: rewrite.bar.com
    http:
      paths:
      - path: /something/
        pathType: Prefix
        backend:
          service:
            name: http-svc
            port:
              number: 80
      - path: /something123/
        pathType: Prefix
        backend:
          service:
            name: http-svc-1
            port:
              number: 80

次のコンテンツに基づいて Ingress ルールを変更します。

YAML コンテンツを表示

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # rewrite アノテーションを使用します。 /something は、末尾のスラッシュ(/)を除くパスを示します。
    # Ingress に複数のパスが含まれている場合は、同じ数の rewrite アノテーションを追加します。
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite "(?i)/something(/|$)(.*)" /$2 break;
      rewrite "(?i)/something123(/|$)(.*)" /$2 break;
  name: rewrite
  namespace: default
spec:
  rules:
  - host: rewrite.bar.com
    http:
      paths:
      - path: /something/ # 以前のバージョンの Ingress のパスと同じ値を保持します。
        pathType: Prefix
        backend:
          service:
            name: http-svc
            port:
              number: 80
      - path: /something123/ # 以前のバージョンの Ingress のパスと同じ値を保持します。
        pathType: Prefix
        backend:
          service:
            name: http-svc-1
            port:
              number: 80

Ingress ルールを変更したら、NGINX Ingress コントローラーの更新を開始できます。更新が完了したら、次のコンテンツに基づいて Ingress ルールを変更します。

YAML

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # 一致するコンテンツを参照します。
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: rewrite
  namespace: default
spec:
  rules:
  - host: rewrite.bar.com
    http:
      paths:
      # キャプチャ グループを使用します。
      - path: /something(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: http-svc
            port:
              number: 80
      # キャプチャ グループを使用します。
      - path: /something123(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: http-svc-1
            port:
              number: 80

非推奨の NGINX ネイティブ root および alias ディレクティブ

影響を受けるバージョン:1.2.1-aliyun.1 より前のバージョン。

これらのディレクティブに関連するセキュリティ リスクのため、新しいバージョンの NGINX Ingress コントローラー では、これらの使用が非推奨になっています。更新する前に、Ingress 構成に snippet フィールドに追加された root または alias ディレクティブが含まれていないことを確認してください。

検証

NGINX Ingress コントローラーとワークロードの状態を確認する

ACK の監視機能に加えて、ACK では、Simple Log Service、Managed Service for Prometheus ダッシュボード、およびコンテナー ログを使用して NGINX Ingress コントローラーの状態を監視することもできます。上記のサービスをアクティブにするには、「nginx-ingress-controller のアクセスログの分析と監視」および「Managed Service for Prometheus の使用」をご参照ください。

Simple Log Service

ACK コンソールで Simple Log Service によって収集されたログを表示できます。

  1. ACK コンソール にログインします。左側のナビゲーション ウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。左側のウィンドウで、[操作] > [ログセンター] を選択します。

  3. [アプリケーションログ] タブをクリックします。次に、ログストアのドロップダウンリストから [nginx-ingress] を選択し、[ログストアの選択] をクリックします。

    説明

    nginx-ingress が存在しない場合は、NGINX Ingress コントローラーでログ収集機能が有効になっているかどうかを確認します。詳細については、「nginx-ingress-controller のアクセスログを分析およびモニタリングする」をご参照ください。

ログ リストでアプリケーションのアクセスログを表示したり、クエリ文でポッドを指定してポッドのアクセスログを表示したりできます。たとえば、クエリ文で新しい NGINX Ingress コントローラー バージョンのポッドを指定できます。新しいポッドへのリクエストの成功率が期待どおりであり、新しいポッドに送信されたリクエストの数が古いポッドに送信されたリクエストの数と同じであることを確認してください。新しいポッドの統計が古いポッドの統計と大幅に異なる場合は、更新をロールバックします。

説明

リクエストが Ingress ルールと一致しない場合、404 エラーが返されます。デフォルトでは、エラーはアクセスログに記録されません。

Managed Service for Prometheus ダッシュボード

Managed Service for Prometheus が提供するダッシュボードを使用して、NGINX Ingress コントローラーによって処理されたリクエストを監視できます。

  1. ACK コンソール にログインします。左側のナビゲーション ウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。左側のウィンドウで、[操作] > [Prometheus 監視] を選択します。

  3. [ネットワーク監視] タブをクリックし、次に [イングレス] タブをクリックします。

    説明

    [Ingresses] タブが表示されない場合は、NGINX Ingress コントローラーに対して Prometheus メトリック収集が構成されているかどうかを確認してください。詳細については、「Managed Service for Prometheus を使用する」をご参照ください。

ダッシュボードで Ingress のメトリックを表示したり、特定のポッドのメトリックを表示したりできます。新しいポッドへのリクエストの成功率が正常であり、新しいポッドに送信されたリクエストの数が古いポッドに送信されたリクエストの数と同じであることを確認してください。新しいポッドの統計が古いポッドの統計と大幅に異なる場合は、更新をロールバックします。

説明

Ingress のルールでホストが指定されていない場合、Ingress のメトリックは収集されません。デフォルトのホストはアスタリスク(*)に設定されています。

ポッド ログ

トラブルシューティングのために kubectl を使用してポッド ログを出力できます。

  • 重大度レベルが Warn、Error、および Crit の NGINX エラーを含むポッド ログを出力するには、次のコマンドを実行します。

    kubectl logs -n kube-system <ポッド名> | grep -e warn -e error -e crit
  • コントローラー エラーを含むポッド ログを出力するには、次のコマンドを実行します。

    kubectl logs -n kube-system <ポッド名> | grep "^[EF]"

更新に関する注意事項

NGINX Ingress コントローラーを更新する場合は、プレフィックス マッチングの変更に注意してください。パス構成がリクエスト URL と一致していることを確認してください。そうでない場合、リクエストに対して状態コード 404 が返されます。

既知の問題

プレフィックス マッチングの違いは、さまざまなバージョンの NGINX Ingress コントローラーに存在する可能性があり、サービス アクセスの問題につながる可能性があります。

  • 0.44 より前のバージョンでは、プレフィックス マッチングルールは緩やかです。たとえば、プレフィックス /aaa/bbb は、リクエスト URL の /aaa/bbbbb と一致する可能性があります。

  • 更新後、プレフィックス マッチングルールはより厳格になり、正確なリクエスト URL のみに一致します。上記の例では、リクエスト URL の /aaa/bbbbb は一致しません。代わりに、状態コード 404 が返されます。

影響範囲

v0.44 より前の NGINX Ingress コントローラーが影響を受けます。リリースノートの詳細については、「NGINX Ingress コントローラー」をご参照ください。関連するプルリクエスト情報については、「kubernetes/ingress-nginx #6443」を参照してください。

サンプル構成

次の YAML テンプレートを使用して、0.22.0.5-552e0db-aliyun(以前のバージョン)や 1.2.1-aliyun.1+(以降のバージョン)など、異なるバージョンの NGINX Ingress コントローラーによってレンダリングされた NGINX 構成を比較できます。

  apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    labels:
      ingress-controller: nginx
    name: test
    namespace: default
  spec:
    ingressClassName: nginx
    rules:
    - host: www.example.com
      http:
        paths:
        - backend:
            service:
              name: api-resources-svc
              port:
                number: 8080
          path: /api/resource
  • 以前のバージョン

    0.22.0.5-552e0db-aliyun などのバージョンでは、NGINX 構成は次のとおりです。

    Location /api/resource   # パスはスラッシュ(/)で終わりません。

    上記の構成では、パス /api/resource を使用すると、以前のバージョンの NGINX で http://www.example.com/api/resource からアクセスできます。

    説明

    実際のリクエスト パスは resources であり、resource ではありません。

  • 以降のバージョン

    NGINX Ingress コントローラーが 1.2.1-aliyun.1+ などの以降のバージョンに更新されると、NGINX 構成は次のようになります。

    Location /api/resource/  # パスはスラッシュ(/)で終わります。
    {
    }
    ...
    Location = /api/resource  # 正確なマッチングのために別の場所が追加されます。
    {
    }

    http://www.example.com/api/resources にアクセスしようとすると、HTTP 状態コード 404 が返されます。

FAQ

NGINX Ingress コントローラーを特定のバージョンに更新できますか?更新が成功した後、以前のバージョンにロールバックできますか?

NGINX Ingress コントローラーを特定のバージョンに更新することはできません。 NGINX Ingress コントローラーは段階的に更新され、最新バージョンにのみ更新できます。更新が完了すると、ロールバックできません。

検証フェーズとリリース フェーズでポッドの作成に失敗した場合はどうすればよいですか?

原因

解決策

ACK が新しい NGINX Ingress コントローラー バージョンのポッドを起動するときに例外が発生します。たとえば、ACK がポッドの構成のロードに失敗します。その結果、ポッドはクラッシュ状態のままになります。

上記の方法を使用してポッド ログを出力し、問題のトラブルシューティングを行います。 詳細については、「NGINX Ingress コントローラーのトラブルシューティング」をご参照ください。

ポッドのスケジューリングエラーは通常、専用ノードに NGINX Ingress コントローラーをデプロイするときに発生します。 ACK が新しいバージョンの NGINX Ingress コントローラーのポッドを作成するときに、リソース制限とノード セレクターが原因で、ACK がポッドのノードを見つけることができない場合があります。

コンポーネントを更新する前に、クラスターにノードを追加するか、オフピーク時に NGINX Ingress コントローラーのポッドの数を減らして、新しいポッドをノードにスケジュールできるようにします。

デプロイメント テンプレートがチェックに合格しない場合はどうすればよいですか?

デプロイメント テンプレートがチェックに合格しない場合は、[原因] の右側のハイパーリンクをクリックして、[コンポーネントの比較] ページに移動します。チェックに合格しなかったコンポーネント パラメーターを表示できます。

  1. [NGINX Ingress コントローラーの更新] ページで、[事前チェック] の下の [詳細の表示] をクリックします。

  2. [クラスタコンポーネントの結果] セクションの [レポート] ページで、① でマークされた赤いボックス内の結果をクリックします。[結果] タブで、[デプロイメントテンプレート] をクリックします。次に、② でマークされた [原因] の右側のハイパーリンクをクリックします。

    image..png

  3. [コンポーネントの比較] ページで、チェックに合格しなかったコンポーネント パラメーターを表示できます。

    [コンポーネントの比較] ページでは、標準コンポーネント テンプレートが左側に表示され、現在のコンポーネント テンプレートが右側に表示されます。 [コンポーネントの比較] ページには、互換性のあるパラメーターと互換性のないパラメーターを含むテンプレート間の違いが表示され、ページの下部に違いがリストされます。 [コンポーネントの比較] ページには、コンポーネントがチェックに合格したかどうかと、違いの原因となっているパラメーターも表示されます。

    次の図では、テンプレート間に相違点があり、その相違点の原因となっているパラメーターは .spec.template.spec.containers.(nginx-ingress-controller).args です。nginx-ingress-controller は、パラメーターが属するコンテナーの名前です。比較結果から、標準テンプレートの args パラメーターには --v=2 が指定されているのに対し、現在のテンプレートの args パラメーターには --v=3 が指定されていることがわかります。コンポーネントを更新する前に、args パラメーターを変更する必要があります。

    image..png

  4. 違いの原因となっているパラメーターを変更します。

    左側のナビゲーションウィンドウで、[ワークロード] > [デプロイメント] を選択します。[デプロイメント] ページで、NGINX Ingress コントローラーを見つけて、[アクション] 列の [詳細] > [YAML で表示] を選択します。[YAML の編集] ダイアログボックスで、args パラメーターの値を --v=3 から --v=2 に変更します。

  5. args パラメーターを変更した後、[コンポーネントの比較] ページをリフレッシュして、差異が修正されたかどうかを確認できます。[コンポーネントの比較チェックに合格しました。] がページの下部に表示されている場合、デプロイメント テンプレートはチェックに合格しています。

    説明

    システムは、NGINX Ingress コントローラーのポッドを再起動して、デプロイメントへの変更を適用します。関連する操作は、オフピーク時に実行することをお勧めします。

    image..png

参考資料