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

Container Service for Kubernetes:高負荷シナリオでの NGINX Ingress コントローラーのインストール

最終更新日:May 09, 2025

NGINX Ingress コントローラーが高負荷になることがよくある場合は、クラスタネットワークプラグイン、ノードの仕様、コントローラーの構成を調整することでパフォーマンスを向上させることができます。このトピックでは、高パフォーマンスの NGINX Ingress コントローラーを構成する方法について説明します。

重要

このトピックで説明されている構成方法は参考用です。コントローラーの実際の負荷に基づいて、特定の構成とパラメーター値を選択する必要があります。

コンテナーネットワークプラグイン

クラスタのコンテナーネットワークインターフェース ( CNI ) プラグインは、クラスタ内のネットワーク通信のパフォーマンスに影響を与え、ひいては NGINX Ingress コントローラーのパフォーマンスに影響を与えます。コンテナーネットワークプラグインとして Terway を使用することをお勧めします。ネットワークパフォーマンスに対する要件がさらに高い場合は、排他的な Elastic Network Interface ( ENI ) モードで Terway を使用することを検討できます。ただし、このモードでは、ノードにデプロイできるポッドの最大数が減少します。 Terway の詳細については、「Terway を使用する」をご参照ください。

ノード仕様の選択

NGINX Ingress コントローラーポッドのネットワークパフォーマンスは、ノードの仕様によって制限されます。たとえば、ノードの 1 秒あたりのパケット数 ( PPS ) が 300,000 の場合、コントローラーポッドの最大 PPS も 300,000 です。次の高パフォーマンス Elastic Compute Service ( ECS ) インスタンスタイプを選択することをお勧めします。

  • コンピューティング最適化インスタンス: ecs.c6e.8xlarge ( 32 vCPU 、64 GB 、6,000,000 PPS )

  • ネットワーク最適化インスタンス: ecs.g6e.8xlarge ( 32 vCPU 、128 GB 、6,000,000 PPS )

ECS インスタンスタイプの詳細については、「インスタンスファミリの概要」をご参照ください。

Nginx Ingress コントローラーの構成

CLB インスタンスの仕様

NGINX Ingress コントローラーは、Classic Load Balancer ( CLB ) インスタンスを使用して外部リクエストを受信します。 CLB インスタンスの仕様は、コントローラーのパフォーマンスに影響を与えます。 NGINX Ingress コントローラーに関連付けられているサービスでアノテーションを使用して、CLB の仕様を指定できます。

CLB インスタンスの仕様の変更

  1. 次のコマンドを実行して、NGINX Ingress コントローラーに関連付けられているサービスを変更します。

    kubectl edit service -n kube-system nginx-ingress-lb
  2. service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec アノテーションをサービスに追加します。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        ...
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s3.large" # CLB の仕様を指定します
      name: nginx-ingress-lb
      namespace: kube-system
      ...
    spec:
      ...
    
    重要

    CLB 仕様のパフォーマンスと課金については、「仕様」をご参照ください。仕様の高いインスタンスほどコストが高くなります。

ポッドが排他的に占有するノード

NGINX の基本的なオーバーヘッドのため、単一の高仕様ポッド ( 32 vCPU ポッドなど ) は、合計リソースが同じ複数の低仕様ポッド ( 2 つの 16 vCPU ポッドなど ) よりもパフォーマンスが優れています。したがって、高可用性を確保しながら、複数の低仕様ポッドの代わりに少数の高仕様ポッドを使用できます。

たとえば、高仕様でノード数が少ないノードプールを作成し、汚染と許容を構成して、各ノードを NGINX Ingress コントローラーポッドが排他的に占有するようにすることができます。これにより、NGINX Ingress コントローラーはリソース使用率を最大化でき、クラスタ内の他のアプリケーションの影響を受けません。

コントローラーポッドがノードを排他的に占有するように構成する例

  1. クラスタに新しいノードプールを作成し、次のパラメーターを構成します。詳細については、「ノードプールの作成と管理」をご参照ください。

    • [必要なノード数] を 3 に設定します。

    • [オペレーティングシステム][Alibaba Cloud Linux 3] に設定します。

    • [ノードラベル][汚染] を構成します。

      • [テイント] で、ingress-pod を追加し、[値]yes に設定し、[効果][実行なし] に設定します。

      • [ノードラベル] で、ingress-node を追加し、[値]yes に設定します。

    • [CPU ポリシー][静的] に設定します。

  2. 次のコマンドを実行して、コントローラーのデプロイメントを変更します。

    kubectl edit deploy nginx-ingress-controller -n kube-system
  3. デプロイメントに次の変更を加えます。

    1. replicas をノードプールのノード数と同じ 3 に設定します。

      spec:
        replicas: 3
    2. コンテナーの nginx-ingress-controllerrequestslimits を変更します。CPU を 32 vCPU に、メモリを 64 GB に設定します。

      containers:
        - args:
          ...
          resources:
            limits:
              cpu: "32"
              memory: 64Gi
            requests:
              cpu: "32"
              memory: 64Gi
    3. ノードのアフィニティと許容を設定して、ingress-node:yes ラベルが付いたノードにのみポッドがスケジュールされ、ingress-pod:yes の汚染を許容できるようにします。

      nodeSelector:
        kubernetes.io/os: linux
        ingress-node: "yes"
      tolerations:
      - effect: NoExecute
        key: ingress-pod
        operator: Equal
        value: "yes"
    4. デプロイメントに次のアンチアフィニティ構成があることを確認します。これにより、各ノードに最大 1 つの NGINX Ingress コントローラーポッドが配置されます。

      podAntiAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
            - key: app
            operator: In
            values:
            - ingress-nginx
         topologyKey: kubernetes.io/hostname

メトリクスの収集の無効化

NGINX Ingress コントローラーは、デフォルトで他のコンポーネントが使用するためのメトリクスを収集します。ただし、メトリクスの収集は CPU リソースを消費します。メトリクスを取得する必要がない場合は、メトリクスの収集を無効にすることをお勧めします。 NGINX の起動パラメーターに --enable-metrics=false を追加することで、すべてのメトリクスの収集を無効にできます。

v1.9.3 以降の NGINX Ingress コントローラーバージョンには、カスタムメトリクス収集用の追加パラメーターが含まれています。たとえば、--exclude-socket-metrics を追加すると、ソケット関連のメトリクスの収集が停止します。起動パラメーターの詳細については、「cli-arguments」をご参照ください。

メトリクスの収集の無効化

  1. 次のコマンドを実行して、コントローラーのデプロイメントを変更します。

    kubectl edit deploy nginx-ingress-controller -n kube-system
  2. コンテナー構成セクションに --enable-metrics=false を追加して、すべてのメトリクスの収集を無効にします。 --exclude-socket-metrics は、ソケット関連のメトリクスの収集を停止できます。

    containers:
    - args:
      - ...
      - --enable-metrics=false
      - --exclude-socket-metrics # --enable-metrics=true の場合に有効です
    

タイムアウトポリシーの調整

FIN_WAIT2 および TIME_WAIT 状態のタイムアウト期間を短縮して、NGINX Ingress コントローラーがデータ送信を完了した接続をより迅速に閉じることができるようにすることで、リソース使用量を削減できます。

NGINX Ingress コントローラーでは、関連する構成は次のとおりです。

  • net.ipv4.tcp_fin_timeout: FIN_WAIT2 状態のタイムアウト期間。デフォルト値は 60 秒です。

  • net.netfilter.nf_conntrack_tcp_timeout_time_wait: TIME_WAIT 状態での接続キープアライブ時間。デフォルト値は 60 秒です。

重要

FIN_WAIT2 および TIME_WAIT はコンテナーカーネルの構成です。これらの構成を変更すると、NGINX Ingress コントローラーのパフォーマンスに影響します。これらの構成を変更する必要がある場合は、TCP 接続の原則を理解していることを確認してください。構成を変更した後、接続ステータスとリソース使用量を継続的に監視して、調整が安全かつ効果的であることを確認してください。

タイムアウトポリシーの調整

  1. 次のコマンドを実行して、コントローラーのデプロイメントを変更します。

    kubectl edit deploy nginx-ingress-controller -n kube-system
  2. sysctl -w net.ipv4.tcp_fin_timeoutsysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_waitinitContainers に追加します。

    initContainers:
          - command:  
            - /bin/sh
            - -c
            - |
              if [ "$POD_IP" != "$HOST_IP" ]; then
              mount -o remount rw /proc/sys
              sysctl -w net.core.somaxconn=65535
              sysctl -w net.ipv4.ip_local_port_range="1024 65535"
              sysctl -w kernel.core_uses_pid=0
              sysctl -w net.ipv4.tcp_fin_timeout=15 # FIN_WAIT2 状態の上限を 15 秒に設定します
              sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30 # TIME_WAIT 状態の上限を 30 秒に設定します
              fi

ConfigMap の構成

NGINX Ingress コントローラーのグローバル構成は、ConfigMap に保存されます。次のコマンドを実行して、ConfigMap を変更できます。

kubectl edit cm -n kube-system nginx-configuration

パラメーターの説明

次の表に、ConfigMap の主要なパラメーターを示します。

構成項目

構成パラメーター

説明

ダウンストリーム keepalive

keep-alive: "60"

ダウンストリーム keepalive 接続のタイムアウト期間を指定します。単位: 秒。

keep-alive-requests: "10000"

ダウンストリーム keepalive リクエストの最大数を指定します。

アップストリーム keepalive

upstream-keepalive-connections: "1000"

アップストリーム keepalive 接続の最大数。

upstream-keepalive-requests: "2147483647"

許可されるアップストリーム keepalive リクエストの最大数。

upstream-keepalive-time: 1h

アップストリーム keepalive 接続の最大キープアライブ時間。

upstream-keepalive-timeout: "150"

アップストリーム keepalive 接続のアイドルタイムアウト期間を指定します。単位: 秒。

各作業プロセスの接続上限

max-worker-connections: "65536"

ワーカープロセスで開くことができる同時接続の最大数。

タイムアウト設定

説明

ビジネス要件に基づいてパラメーター値を変更できます。

proxy-connect-timeout: "3"

接続を確立するためのタイムアウト期間。単位: 秒。

proxy-read-timeout: "5"

データを読み取るためのタイムアウト期間。単位: 秒。

proxy-send-timeout: "5"

データを送信するためのタイムアウト期間。単位: 秒。

再試行設定

説明

バックエンドサービスでエラーが発生した場合、複数回の再試行によりリクエストが多すぎる可能性があります。これは、バックエンドサービスの負荷を増加させたり、サービスの雪崩を引き起こしたりする可能性があります。詳細については、Ingress-nginx 公式ドキュメントをご参照ください。

proxy-next-upstream-tries:"3"

リクエストの送信に失敗した後の再試行回数。デフォルト値: 3 。デフォルト値には、元のリクエストと 2 回の再試行が含まれます。

proxy-next-upstream:"off"

再試行がトリガーされる条件。再試行を無効にするには、値を off に設定します。

proxy-next-upstream-timeout

リクエスト再試行のタイムアウト期間。単位: 秒。ビジネス要件に基づいて値を変更できます。

ログの自動ローテーションの構成

デフォルトでは、NGINX Ingress コントローラーポッドは /dev/stdout にログを記録します。ログファイルが大きくなるにつれて、新しいログを記録するためにより多くのリソースが消費されます。ログを定期的にローテーションすることで、ログ記録のリソース消費量を削減できます。この方法では、特定の期間のログを別のファイルに保存し、元のログレコードをクリアします。

  1. SSH を使用して、NGINX Ingress コントローラーポッドがデプロイされている ECS ノードにログオンします。詳細については、「SSH キーペアを使用して Linux インスタンスに接続する」をご参照ください。

  2. nginx-log-rotate.sh ファイルを /root ディレクトリに追加します。

    Containerd ノード

    #!/bin/bash
    # 保持されるログファイルの最大数を指定します。必要に応じて数を変更できます。
    keep_log_num=5
    
    # 実行中のすべての ingress-nginx コンテナーの ID を取得します
    ingress_nginx_container_ids=$(crictl ps | grep nginx-ingress-controller | grep -v pause | awk '{print $1}')
    if [[ -z "$ingress_nginx_container_ids" ]]; then
     echo "error: ingress nginx container ids の取得に失敗しました"
     exit 1
    fi
    
    # NGINX Ingress コントローラーポッドを 5 ~ 10 秒のランダムな長さの期間スリープさせます。
    sleep $(( RANDOM % (10 - 5 + 1 ) + 5 ))
    for id in $ingress_nginx_container_ids; do
     crictl exec $id bash -c "cd /var/log/nginx; if [[ \$(ls access.log-* | wc -l) -gt $keep_log_num ]]; then rm -f \$(ls -t access.log-* | tail -1); fi ; mv access.log access.log-\$(date +%F:%T) ; kill -USR1 \$(cat /tmp/nginx/nginx.pid)"
    done	
    

    Docker ノード

    #!/bin/bash
    # 保持されるログファイルの最大数を指定します。必要に応じて数を変更できます。
    keep_log_num=5
    
    # 実行中のすべての ingress-nginx コンテナーの ID を取得します
    ingress_nginx_container_ids=$(docker ps | grep nginx-ingress-controller | grep -v pause | awk '{print $1}')
    if [[ -z "$ingress_nginx_container_ids" ]]; then
     echo "error: ingress nginx container ids の取得に失敗しました"
     exit 1
    fi
    
    # NGINX Ingress コントローラーポッドを 5 ~ 10 秒のランダムな長さの期間スリープさせます。
    sleep $(( RANDOM % (10 - 5 + 1 ) + 5 ))
    for id in $ingress_nginx_container_ids; do
     docker exec $id bash -c "cd /var/log/nginx; if [[ \$(ls access.log-* | wc -l) -gt $keep_log_num ]]; then rm -f \$(ls -t access.log-* | tail -1); fi ; mv access.log access.log-\$(date +%F:%T) ; kill -USR1 \$(cat /tmp/nginx/nginx.pid)"
    done	
    	
  3. 次のコマンドを実行して、nginx-log-rotate.sh ファイルに実行権限を追加します。

    chmod 755 /root/nginx-log-rotate.sh
  4. /etc/crontab ファイルの末尾に次のコンテンツを追加します。

    */15 * * * *  root /root/nginx-log-rotate.sh
    説明

    この例では、Cron 式を使用して 15 分ごとにログをローテーションします。必要に応じて頻度を調整できます。

brotli 圧縮の有効化

データ圧縮は追加の CPU 時間を消費しますが、圧縮されたデータパケットは帯域幅の使用量を削減し、ネットワークスループットを向上させます。 Brotli は、Google によって開発されたオープンソースの圧縮アルゴリズムです。一般的に使用される gzip 圧縮アルゴリズム ( デフォルトで NGINX Ingress コントローラーによって使用されます ) と比較して、Brotli は通常、Web リソースなどのテキストデータで 15 ~ 30% 高い圧縮率を実現します。ただし、具体的な改善はシナリオの詳細によって異なります。 NGINX Ingress コントローラーで Brotli 圧縮を有効にするには、次のパラメーターを構成する必要があります。

  • enable-brotli: Brotli 圧縮アルゴリズムを有効にするかどうかを指定します。有効な値: true および false

  • brotli-level: 圧縮レベル。有効な値: 1 ~ 11 。デフォルト値: 4 。圧縮レベルが高いほど、より多くの CPU リソースが必要になります。

  • brotli-types: Brotli リアルタイム圧縮が使用される Multipurpose Internet Mail Extensions ( MIME ) タイプ。

ConfigMap に次の構成を追加することで、Brotli 圧縮を有効にできます。

data:
  enable-brotli: "true"
  brotli-level: "6"
  brotli-types: "text/xml image/svg+xml application/x-font-ttf image/vnd.microsoft.icon application/x-font-opentype application/json font/eot application/vnd.ms-fontobject application/javascript font/otf application/xml application/xhtml+xml text/javascript application/x-javascript text/plain application/x-font-truetype application/xml+rss image/x-icon font/opentype text/css image/x-win-bitmap"

HTTPS パフォーマンスの最適化

NGINX Ingress コントローラーの HTTPS パフォーマンスを向上させるには、SSL セッションキャッシュ、OCSP ステープリング、TLS 1.3 early data 、暗号スイートの優先順位などのパラメーターを構成できます。

  • SSL セッションキャッシュとタイムアウト

    SSL 共有セッションキャッシュのサイズと、キャッシュに保存されているセッションを再利用する期間を設定することで、SSL ハンドシェイクのオーバーヘッドを削減できます。

    • ConfigMap 構成:

      data:
        ssl-session-cache-size:"10m"
        ssl-session-timeout:"10m"
    • NGINX 側の対応する nginx.conf 構成。ビジネス要件に基づいて構成を調整できます。

      ssl_session_cache shared:SSL:120m;   # 1m に 4,000 セッションを保存できます。
      ssl_session_timeout 1h;              # セッションタイムアウト期間は 1 時間です。
  • OCSP ステープリングの有効化

    OCSP ステープリングは、クライアント証明書の検証に必要な時間を短縮します。

    data:
      enable-ocsp: "true"
  • TLS 1.3 early data ( 0-RTT ) のサポート

    TLS 1.3 early data 機能 ( zero round trip-time ( 0-RTT ) とも呼ばれます ) を使用すると、クライアントはハンドシェイクが完了する前にデータを送信できます。これにより、応答時間が短縮されます。

    data:
      ssl-early-data: "true"
      ssl-protocols: "TLSv1.3"
  • 暗号スイートの優先順位の変更 ( 手動以外 )

    暗号スイートの優先順位を変更して、ネットワーク遅延を減らすことができます。 ACK は、NGINX Ingress コントローラー構成の暗号スイートの優先順位を最適化しています。

    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;    # サーバー側の暗号構成を優先します。