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

Container Service for Kubernetes:NGINX Ingressコントローラの使用に関する注意事項

最終更新日:Dec 10, 2024

NGINX Ingressコントローラーは、Container Service for Kubernetes (ACK) クラスターにデプロイされ、Ingressの制御に使用されます。 NGINX Ingressコントローラは高いパフォーマンスを提供し、コントローラの設定をカスタマイズできます。 ACKが提供するNGINX Ingressコントローラーは、オープンソースバージョンに基づいて開発されており、Alibaba Cloudサービスと統合できます。 NGINX IngressコントローラーはACKクラスターにデプロイされます。 NGINX Ingressコントローラーの安定性は、その構成とクラスターのステータスに依存します。 このトピックでは、NGINX Ingressコントローラーの使用方法について説明します。

目次

NGINX Ingressコントローラのパフォーマンスと安定性を向上させる

適切な数のコントローラポッドを指定し、適切なリソース制限を設定する

デフォルトでは、[アドオン] ページからNGINX Ingressコントローラーをインストールする場合、またはクラスターを作成するときに、2つのポッドがプロビジョニングされます。 ビジネス要件に基づいて、コントローラポッドの数を調整できます。

NGINX Ingressコントローラをデプロイするときは、コントローラポッドが異なるノードに分散されていることを確認してください。 これにより、コントローラポッドと単一障害点 (SPOF) 間のリソース競合を防ぐことができます。 NGINX Ingressコントローラのパフォーマンスと安定性を確保するために、コントローラポッドを排他ノードにスケジュールできます。 詳細については、「排他的ノードを使用してNGINX Ingressコントローラーのパフォーマンスと安定性を確保する」をご参照ください。 NGINX Ingressコントローラポッドのリソース制限は設定しないことを推奨します。 これにより、メモリ不足 (OOM) エラーによるサービスの中断を防ぐことができます。 リソース制限が必要な場合は、CPU制限を1,000ミリコア以上に設定し、メモリ制限を2 GiB以上に設定することを推奨します。 YAMLファイルのCPU制限の形式は1000mです。

排他的ノードを使用してNGINX Ingressコントローラのパフォーマンスと安定性を向上させる

NGINX Ingressコントローラのパフォーマンスを最適化する

システム設定を変更し、NGINXパラメーターを調整して、NGINX Ingressコントローラーのパフォーマンスを最適化できます。

  • システム設定の変更: デフォルトでは、Alibaba Cloudが提供するオペレーティングシステムの一部の一般的な設定が最適化されています。 バックログキューや使用可能なポートの最大範囲など、他のシステム設定を変更することもできます。 システム設定を変更すると、NGINX Ingressコントローラーは多数の同時接続を処理できます。 これにより、ポート不足による接続障害も防止される。

  • Tune NGINXパラメータ:

    • 各ワーカープロセスが処理できる最大接続数: 各ワーカーへの最大接続数を変更して、NGINX Ingressコントローラーが多数の同時接続を処理できるようにすることができます。

    • キープアライブ要求: NGINX Ingressコントローラーは、キープアライブ接続を介してバックエンドポッドに要求を送信します。 各キープアライブ接続で処理できるリクエストの最大数を増やすことができます。 このように、キープアライブ接続をより長く持続させて、より多くの要求を処理できる。

    • Keepalive timeout: バックエンドポッドへのkeepalive接続のタイムアウト期間が、NGINX Ingressコントローラーへの接続のタイムアウト期間よりも短くないことを確認します。 デフォルトでは、ACKクラスターのNGINX Ingressコントローラーへの接続のタイムアウト時間は900秒です。

デフォルトでは、上記のパラメーターはNGINX Ingressコンポーネントで最適化されています。 ほとんどの場合、NGINX Ingressコントローラーの設定はビジネス要件を満たすことができます。 他の要件がある場合は、ConfigMapでシステム設定とNGINX設定を変更できます。 詳細については、「ConfigMaps」をご参照ください。

ロードに基づいて自動スケーリングを実行するようにHPAを設定する

ほとんどの場合、NGINX Ingressコントローラーはトラフィックスパイクを処理できます。 NGINX Ingressコントローラーが高負荷シナリオで要件を満たすことができない場合は、水平ポッドオートスケーラー (HPA) を設定してIngressコントローラーポッドをスケールアウトできます。 詳細については、「水平ポッド自動スケーリングの実装」をご参照ください。

重要

HPAがコントローラポッドをスケーリングすると、サービス中断が発生する可能性があります。 HPAを設定するときは注意が必要です。

次のYAMLテンプレートは、HPAの設定方法の例を示しています。

apiVersion: autoscaling/v2beta1
種類: HorizontalPodAutoscaler
メタデータ:
  名前: nginx-ingress-controller-hpa
  名前空間: kube-system
spec:
   scaleTargetRef:
     apiVersion: apps/v1
     kind: Deployment
     name: nginx-ingress-controller
   minReplicas: 2
   maxReplicas: 5
   metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 50 

バックエンドアプリケーション用のPreStopフックの設定

バックエンドアプリケーションでローリング更新が実行されると、NGINX Ingressコントローラーは終了中のポッドのエンドポイントを削除し、処理中のリクエストの接続を維持します。 バックエンドポッドが終了信号を受信した直後に終了すると、ポッドに送信されて処理中の要求が失敗する可能性があります。 この場合、時間シーケンスの問題により、後続の要求がポッドに送信される可能性があります。 これは交通損失につながります。

この問題によるトラフィック損失を回避するために、バックエンドポッドのPreStopフックを設定することを推奨します。 このようにして、バックエンドポッドは、エンドポイントが削除された後も一定期間実行され続けます。

ポッドテンプレートに次の設定を追加します。

apiVersion: apps/v1
kind: 配置
spec:
  テンプレート:
    仕様:
      containers:
      -name: アプリ
        ライフサイクル:
          # PreStopフックを設定して、ポッドが終了するまで30秒間実行し続けるようにします。 
          # podテンプレートでsleepコマンドを指定できます。 
          preStop:
            exec:
              command:
              -睡眠
              -30 

NGINX Ingressコントローラの可観測性を向上させる

PrometheusのSimple Log ServiceとManaged Serviceを使用してNGINX Ingressコントローラーの可観測性を向上させる

NGINX Ingressコントローラーは、Prometheus用のSimple Log ServiceとManaged Serviceに基づいたIngressダッシュボードを提供します。これにより、サービスへのトラフィックに関するより良い洞察を得ることができます。

  • Log Service:

    • クラスターの作成時に [Log Serviceの有効化] と [Ingressダッシュボードの作成] を選択した場合、[ACKコンソール] にログインし、[ネットワーク] > [Ingress] を選択すると、[Ingressの概要] セクションで [Simple log Service] に基づいてACKが提供するIngressダッシュボードを表示できます。 [操作] > [ログセンター] を選択して、NGINX Ingressコントローラーのログを表示することもできます。 詳細については、「nginx-ingressのアクセスログの分析と監視」をご参照ください。

    • クラスターの作成時に [Log Serviceの有効化] または [Ingressダッシュボードの作成] を選択しない場合は、ログ収集のコンポーネントとルールを手動で設定できます。 詳細については、「nginx-ingressのアクセスログの分析と監視」をご参照ください。 NGINX Ingressコントローラーを監視する方法の詳細については、「Ingressダッシュボードの監視」をご参照ください。

  • Prometheusのマネージドサービス: クラスターを作成するときに、Prometheusのマネージドサービスを有効にできます。 クラスターの作成後、[Operations] > [Prometheus Monitoring] を選択して、Prometheusのマネージドサービスを有効にしてアクセスすることもできます。 詳細については、「Prometheusのマネージドサービスを使用したACKクラスターのモニタリング」をご参照ください。

    説明

    Managed Service for Prometheusを使用する場合は、クラスターに作成されたIngressにhostフィールドを追加します。 それ以外の場合、一部のIngressメトリックはデフォルトで表示されません。 問題を解決するために、NGINX Ingressコントローラーのデプロイのコントローラーの起動パラメーターに -- metrics-per-host=falseを追加することもできます。

NGINX Ingressコントローラの高度な機能

複数のNGINX Ingressコントローラを使用する

複数のNGINX Ingressコントローラーをクラスターにデプロイして、内部ネットワークをインターネットから分離することができます。 詳細については、「クラスターへの複数のIngressコントローラーのデプロイ」をご参照ください。

クラスタ内からNGINX Ingressコントローラにアクセスする

ほとんどの場合、ACKクラスター内のLoadBalancerサービスのパブリックIPアドレスへのリクエストは、iptablesとIP仮想サーバー (IPVS) によってブロックされます。 LoadBalancerサービスのパブリックIPアドレスは、NGINX IngressコントローラーのパブリックIPアドレスと同じです。 サービスのexternalTrafficPolicyLocalに設定され、NGINX Ingressコントローラポッドがクラスターノードにスケジュールされていない場合、接続の問題が発生します。 デフォルトでは、ACKクラスターのNGINX IngressコントローラーはローカルモードでLoadBalancerサービスを使用します。 したがって、クラスター内からNGINX Ingressコントローラーに関連付けられているClassic Load Balancer (CLB) インスタンスのIPアドレスにアクセスすると、接続の問題が発生する可能性があります。

パブリックIPアドレスまたはパブリックIPアドレスにマッピングされたドメイン名を使用して、クラスター内からNGINX Ingressコントローラーにアクセスする場合は、LoadBalancer ServiceのクラスターIPアドレスまたは内部ドメイン名nginx-ingress-lb.kubeシステムを使用することを推奨します。 クラスター内からNGINX Ingressコントローラーにアクセスすると、ヘアピンの問題が原因で接続の問題が発生する可能性があります。 問題を解決する方法の詳細については、 LoadBalancerサービスによって公開されているSLBインスタンスのIPアドレスにクラスターがアクセスできない場合はどうすればよいですか

WAFまたは透明WAFを使用する

悪意のあるリクエストをブロックするには、Web Application Firewall (WAF) コンソールまたはApplication Load Balancer (ALB) コンソールにログインし、NGINX Ingressコントローラーで使用されるCLBインスタンスに対してWAFまたは透過的なWAFを有効にします。 HTTPSポートでWAFまたは透過的WAFを有効にするには、コンソールで必要な証明書を設定する必要があります。 証明書を設定すると、次の問題が発生する可能性があります。

  • トランスポート層セキュリティ (TLS) 要求は、WAFまたは透過的WAFによってブロックされます。 したがって、クラスターのシークレットで構成されている証明書はインターネットに公開されません。

  • CLBインスタンスのIPアドレスまたはLoadBalancerサービスのクラスターIPアドレスを使用してクラスター内からポート443にアクセスすると、トラフィックがWAFまたは透過的なWAFを通過できない場合があります。 その結果、システムが証明書を返すときにエラーが発生します。

  • WAFまたは透過WAFが有効になっている場合、NGINX IngressコントローラーはデフォルトでクライアントIPアドレスを保持できません。 NGINX IngressコントローラーのConfigMapに次の内容を追加してNGINXのリアリップモジュールを有効にし、X-Forwarded-Forヘッダーを使用してクライアントIPアドレスを保持することができます。 [アドオン] ページからNGINX Ingressコントローラーをインストールする場合、ConfigMapはnginx-configurationという名前で、デフォルトでkube-system名前空間に属します。

    use-forwarded-headers: "true"# NGINX Ingressコントローラーのバージョンが0.30.0以前の場合は、このオプションを使用します。 
    enable-real-ip: "true"# NGINX Ingressコントローラのバージョンが0.44.0以降の場合は、このオプションを使用します。 
    proxy-real-ip-cidr: <WAFから取得したback-to-origin CIDRブロック> 

NGINX Ingressコントローラーを使用したブルーグリーン展開とカナリアリリースの実行

NGINX Ingressコントローラーが提供するカナリアリリース機能をACKコンソールで使用するか、注釈を追加します。 詳細については、「NGINX Ingressコントローラーを使用したカナリアリリースと青緑色の展開の実装」をご参照ください。

重要

カナリアリリースを実行するサービスの旧バージョンと新バージョンがカナリアIngressにのみ関連付けられていることを確認します。 そうしないと、カナリア解放ルールで競合が発生し、トラフィックが他のIngressに配信される可能性があります。

NGINX Ingressコントローラーをプロキシとして使用して、HTTP以外の要求を分散する

デフォルトでは、NGINX IngressコントローラーはHTTP経由でバックエンドサービスに接続します。 NGINX Ingressコントローラーは、バックエンドサービスに接続するための次のプロトコルをサポートしています: WebSocket、HTTPS、およびgRPC。 NGINX Ingressコントローラーでサポートされているプロトコルの詳細については、「バックエンドプロトコル」をご参照ください。

  • WebSocket: NGINX IngressコントローラはデフォルトでWebSocketをサポートしています。 WebSocketリクエストを配信するようにNGINX Ingressコントローラーを設定する必要はありません。 WebSocket接続を存続させたい場合は、注釈を使用してバックエンドサービスへの接続のタイムアウト期間を調整できます。 これにより、接続タイムアウトによるサービスの中断が防止されます。 詳細については、「カスタムタイムアウト」をご参照ください。

  • HTTPS: nginx ingressコントローラーを介してHTTPSサービスにアクセスする場合は、Ingressに注釈NGINX. Ingress. kubernetes.io/backend-protocol:"HTTPS" を追加できます。

  • gRPC: gRPCサービスにはTLSポートからのみアクセスできます。 NGINX Ingressコントローラーを介してgRPCサービスにアクセスする場合は、TLS暗号化接続が使用されていることを確認してください。 gRPCの設定方法の詳細については、「NGINX IngressコントローラーのバックエンドにgRPCサービスをデプロイする」をご参照ください。