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

Container Service for Kubernetes:高負荷向けの NGINX Ingress コントローラー設定

最終更新日:Jun 19, 2026

専用ノードをプロビジョニングし、オートスケーリングを設定し、NGINX パラメーターをチューニングして、ピークトラフィックに対応します。

重要
  • オープンソースの Ingress NGINX プロジェクトは 2026 年 3 月以降メンテナンスされなくなるため、Container Service for Kubernetes は NGINX Ingress コントローラーコンポーネントのメンテナンスを中止します。関連するリスクにご注意ください。詳細については、「製品発表:NGINX Ingress コントローラーコンポーネントのメンテナンス中止」をご参照ください。

  • 以下の設定は参考用です。実際の NGINX Ingress コントローラーの負荷に基づいて、パラメーターと仕様を選択してください。

十分なコンポーネントリソースの確保

専用ノードプールへのデプロイ

専用ノードプールは、NGINX Ingress コントローラーを他のワークロードから分離し、リソースの競合を防ぎます。

重要

NGINX Ingress コントローラー Pod に resources.limits を設定すると、メモリ制限による OOM エラーが発生したり、CPU スロットリングによるサービスの中断やジッターが発生したりする可能性があります。リソース制限は設定しないでください。設定する必要がある場合は、CPU を 1 コア以上、メモリを 2 GiB 以上に設定してください。

専用ノードプールの作成

NGINX Ingress コントローラー Pod 用の専用ノードプールを作成します。次の点にご注意ください:

  • インスタンスタイプの選択:Pod のネットワークパフォーマンスは、ホストノードのインスタンスタイプによって制限されます。たとえば、ノードの PPS が 300,000 の場合、Pod あたりの最大 PPS も 300,000 です。32 コア以上の CPU を持つネットワーク最適化インスタンスを選択してください。

  • ノード数:NGINX Ingress コントローラーはデフォルトでアンチアフィニティを持つ 2 つの Pod をデプロイするため、ノードプールには少なくとも 2 つのノードが必要です。

  • Taint とラベルの設定:他の Pod がこれらのノードにスケジューリングされないように、Taint とラベルを追加します。たとえば、Taint とラベルの両方として system-addon: nginx-ingress を追加し、Effect を NoSchedule に設定します。

  • Pod サイズの選択:NGINX のベースオーバーヘッドのため、合計リソースが同じ場合、複数の低スペック Pod (たとえば、16 コアの Pod 2 つ) よりも 1 つの高スペック Pod (たとえば、32 コア) の方がパフォーマンスが優れています。高可用性を維持しながら、より少ない高スペック Pod を優先してください。

コンポーネントの設定

ACK コンソールにログインします。アドオン管理 ページで、NGINX Ingress controller カードを見つけ、設定 をクリックします。

  1. [NodeSelector] に、専用ノードプールのラベルを追加します。

    既存の NodeSelector ラベルは削除しないでください。
  2. [Tolerations]で、専用ノードプールのテイントを追加し、効果 (Effect)[NoSchedule]に設定します。

  3. OK をクリックし、ポッドが専用ノードプールにスケジュールされることを確認します。

CLB インスタンス仕様の調整

CLB インスタンス仕様は、NGINX Ingress コントローラーの最大接続数と QPS を決定します。高仕様のインスタンスを使用してください。

Service を編集して、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec アノテーションで CLB インスタンス仕様を指定します:

kubectl edit service -n kube-system nginx-ingress-lb
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:
  ...
2025 年 6 月より前に作成された従量課金 (仕様ごと) の CLB インスタンスのみがこの操作をサポートします。詳細については、「パフォーマンス仕様」をご参照ください。

オートスケーリングのための HPA の使用

専用ノードプールの Pod がトラフィックの急増に対応できない場合は、HPA を設定して NGINX Ingress コントローラーをオートスケールします。

重要

Pod のスケールインは、一部のアクティブな接続を中断する可能性があります。スケールインポリシーは慎重に設定してください。

以下を nginx-hpa.yaml として保存し、kubectl apply -f nginx-hpa.yaml で適用します:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-ingress-controller-hpa
  namespace: kube-system
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-ingress-controller
  minReplicas: 2
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

バックエンドワークロードのグレースフルシャットダウンの確保

ローリングアップデート中、NGINX Ingress コントローラーは終了中の Pod へのインフライト接続を維持します。Pod がすぐに終了すると、これらのリクエストは失敗します。

preStop フックは、SIGTERM 後も Pod を実行し続け、インフライトリクエストが完了できるようにします:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: app
        lifecycle:
          # preStop フックを設定して、終了前に 30 秒間待機します。
          # sleep コマンドはコンテナ内に存在する必要があります。
          preStop:
            exec:
              command:
              - sleep
              - 30
 ...
preStop の待機時間は、最大応答時間の 1.5~2 倍に設定してください。sleep がコンテナイメージで利用可能であることを確認してください。

メトリクスとログによるコンポーネントステータスの監視

SLS ログ

  • ACK コンソールで、ネットワーク > Ingress ページの Nginx Ingress の概要 タブに移動します。ここで、ログダッシュボードを表示してクライアントのアクセスデータを確認できます。また、操作 > ログセンター > アプリケーションログ > ログストア に移動して nginx-ingress を選択し、特定のログエントリを表示することもできます。

  • ログダッシュボードに null データポイントが表示される場合、または ログストア の nginx-ingress ログが空の場合は、クラスター作成時にログ機能が有効化されていませんでした。 詳細については、「NGINX Ingress のアクセスログを収集および分析する」をご参照ください。

Prometheus モニタリング

ACK コンソールにログインし、操作 > Prometheus 監視の順に選択して、モニタリングダッシュボードを表示します。

  • コンポーネントがインストールされていない場合は、プロンプトに従ってインストールし、ダッシュボードを確認します。

  • Ingress タブを選択します。 [コントローラークラス] のドロップダウンで、k8s.io/ingress-nginx を選択して NGINX Ingress のメトリクスを表示します。 k8s.io/ingress-nginx が表示されない場合、NGINX Ingress コントローラーはインストールされていません。

Ingress リソースに host フィールドを追加してください。host のないリソースは、デフォルトではメトリクスが収集されません。ホストごとのモニタリングをスキップするには、NGINX Ingress Deployment の controller の args に --metrics-per-host=false を追加してください。

NGINX 設定の最適化

自動ログローテーションの設定

NGINX Ingress コントローラー Pod は、/dev/stdout/var/log/nginx/ の両方にログを記録します。ログファイルが大きくなるにつれて、新しいエントリの書き込みはより多くのリソースを消費します。自動ローテーションは、定期的にログをアーカイブおよびクリアすることでこれを軽減します。

  1. ログインして、NGINX Ingress コントローラー Pod が実行されているノードにアクセスします。

  2. /rootnginx-log-rotate.sh を作成します。

    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: failed to get ingress nginx container ids"
     exit 1
    fi
    
    # 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: failed to get ingress nginx container ids"
     exit 1
    fi
    
    # 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 分ごとにログがローテーションされます。必要に応じてスケジュールを調整してください。
    */15 * * * *  root /root/nginx-log-rotate.sh

メトリクス収集の無効化

メトリクス収集はデフォルトで有効になっており、CPU を消費します。メトリクスが不要な場合は無効にしてください。

コントローラーの Deployment (kubectl edit deploy nginx-ingress-controller -n kube-system) を編集します。コンテナの args に --enable-metrics=false を追加してメトリクスを無効にします。

v1.9.3 以前

spec:
  containers:
  - args:
    - ...
    - --enable-metrics=false

v1.9.3 より後のバージョン

v1.9.3 より後のバージョンの NGINX Ingress コントローラーでは、特定のメトリクスを無効にできます。たとえば、--exclude-socket-metrics を追加して、ソケット関連のメトリクスの収集を停止します。詳細については、「cli-arguments」をご参照ください。

spec:
  containers:
  - args:
    - ...
    - --enable-metrics=true
    - --exclude-socket-metrics # --enable-metrics=true の場合にのみ有効

Brotli 圧縮の有効化

Brotli アルゴリズムは、通常、テキストベースの Web リソースに対して gzip よりも 15%~30% 優れた圧縮率を達成します。

実際の改善はシナリオによって異なります。

NGINX Ingress ConfigMap (kubectl edit cm -n kube-system nginx-configuration) を編集して、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"
  • enable-brotli:Brotli を有効にするかどうかを指定します。有効な値:truefalse

  • brotli-level:圧縮レベル。有効な値:1~11。デフォルト:4。値が大きいほど CPU を多く消費します。

  • brotli-types:Brotli で圧縮する MIME タイプ。

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

FIN_WAIT2 と TIME_WAIT のタイムアウトを短縮すると、NGINX Ingress コントローラーが終了した接続をより速くリサイクルし、リソースを解放できます。

重要

FIN_WAIT2 と TIME_WAIT パラメーターは、NGINX Ingress コントローラーの接続リサイクルに直接影響します。不適切な設定は、高並行性下で接続プールの枯渇、ポートの枯渇、または輻輳を引き起こす可能性があります。調整する前に、TCP 接続の原則を理解していることを確認してください。変更後、接続ステータスとリソース使用量を継続的に監視してください。

NGINX Ingress コントローラーの Deployment (kubectl edit deploy nginx-ingress-controller -n kube-system) を編集します。

以下を initContainers に追加します:

  • net.ipv4.tcp_fin_timeout:FIN_WAIT2 のタイムアウト。デフォルト:60 秒。

  • net.netfilter.nf_conntrack_tcp_timeout_time_wait:TIME_WAIT のタイムアウト。デフォルト:60 秒。

dnsPolicy: ...
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
  env:                                                           
    ...                                                     
  image: ...
  imagePullPolicy: IfNotPresent                           
  name: init-sysctl            

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

nginx-configuration ConfigMap で以下のパラメーターを調整します。

kubectl edit cm -n kube-system nginx-configuration
  • SSL セッションキャッシュとタイムアウト

    SSL セッションキャッシュサイズとタイムアウトを設定すると、ハンドシェイクのオーバーヘッドが削減されます。

    data:
      ssl-session-cache-size: "10m"
      ssl-session-timeout: "10m"

    対応する nginx.conf 設定

    シナリオに基づいて、NGINX の nginx.conf ファイルでこの設定を調整できます。

    ssl_session_cache shared:SSL:10m; # 1 MB で約 4,000 セッションを保存可能。
    ssl_session_timeout 10m;
  • OCSP ステープリングを有効にして、証明書の検証時間を短縮します。

    data:
      enable-ocsp: "true"
  • TLS 1.3 0-RTT を有効にすると、クライアントはハンドシェイクが完了する前にデータを送信できるようになり、接続セットアップのレイテンシが短縮されます。

    data:
      ssl-early-data: "true"
      ssl-protocols: "TLSv1.3"
  • 暗号の優先順位の調整 (手動チューニングは不要)

    暗号スイートの優先順位はレイテンシに影響します。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;    # サーバーの暗号設定を優先します。

その他のパフォーマンス関連オプションの設定

以下の nginx-configuration ConfigMap オプションもパフォーマンスに影響します。編集するには、kubectl edit cm -n kube-system nginx-configuration を実行します。

カテゴリ

パラメーター

説明

ダウンストリーム キープアライブ

keep-alive: "60s"

ダウンストリーム キープアライブ接続が開いたままになる最大時間。

keep-alive-requests: "10000"

ダウンストリーム キープアライブリクエストの最大数。

アップストリーム キープアライブ

upstream-keepalive-connections: "1000"

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

upstream-keepalive-requests: "2147483647"

アップストリーム キープアライブリクエストの最大数。

upstream-keepalive-time: "1h"

アップストリーム キープアライブ接続が開いたままになる最大時間。

upstream-keepalive-timeout: "150s"

アップストリーム キープアライブ接続のアイドルタイムアウト。

ワーカーあたりの最大接続数

max-worker-connections: "65536"

単一のワーカーが処理できる最大接続数。

タイムアウト設定

ユースケースに基づいて調整してください。

proxy-connect-timeout: "3s"

TCP 接続を確立するためのタイムアウト。

proxy-read-timeout: "5s"

データの読み取りタイムアウト。

proxy-send-timeout: "5s"

データの送信タイムアウト。

再試行メカニズム

過度の再試行は、サービスが不安定な場合にバックエンドの負荷を増大させ、カスケード障害を引き起こす可能性があります。詳細については、「Ingress-nginx の公式ドキュメント」をご参照ください。

proxy-next-upstream-tries: "3"

失敗後の再試行。デフォルト:3 (初回試行 1 回 + 再試行 2 回) 。

proxy-next-upstream: "off"

再試行の条件。off に設定すると再試行が無効になります。

proxy-next-upstream-timeout: "5s"

リクエスト再試行のタイムアウト。シナリオに基づいて調整してください。

関連ドキュメント

CNI プラグインはクラスターのネットワークパフォーマンスに影響を与え、それが NGINX Ingress コントローラーに影響します。Terway ネットワークプラグインの使用を推奨します