専用ノードをプロビジョニングし、オートスケーリングを設定し、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 カードを見つけ、設定 をクリックします。
-
[NodeSelector] に、専用ノードプールのラベルを追加します。
既存の NodeSelector ラベルは削除しないでください。
-
[Tolerations]で、専用ノードプールのテイントを追加し、効果 (Effect)を[NoSchedule]に設定します。
-
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 コンソールで、 ページの Nginx Ingress の概要 タブに移動します。ここで、ログダッシュボードを表示してクライアントのアクセスデータを確認できます。また、 に移動して nginx-ingress を選択し、特定のログエントリを表示することもできます。
-
ログダッシュボードに null データポイントが表示される場合、または ログストア の nginx-ingress ログが空の場合は、クラスター作成時にログ機能が有効化されていませんでした。 詳細については、「NGINX Ingress のアクセスログを収集および分析する」をご参照ください。
Prometheus モニタリング
ACK コンソールにログインし、の順に選択して、モニタリングダッシュボードを表示します。
-
コンポーネントがインストールされていない場合は、プロンプトに従ってインストールし、ダッシュボードを確認します。
-
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/ の両方にログを記録します。ログファイルが大きくなるにつれて、新しいエントリの書き込みはより多くのリソースを消費します。自動ローテーションは、定期的にログをアーカイブおよびクリアすることでこれを軽減します。
-
ログインして、NGINX Ingress コントローラー Pod が実行されているノードにアクセスします。
-
/rootにnginx-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)" doneDocker ノード
#!/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 -
nginx-log-rotate.shを実行可能にします。chmod 755 /root/nginx-log-rotate.sh -
以下を
/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 を有効にするかどうかを指定します。有効な値:true、false。 -
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" -
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 を実行します。
|
カテゴリ |
パラメーター |
説明 |
|
ダウンストリーム |
|
ダウンストリーム |
|
|
ダウンストリーム |
|
|
アップストリーム |
|
アップストリーム |
|
|
アップストリーム |
|
|
|
アップストリーム |
|
|
|
アップストリーム |
|
|
ワーカーあたりの最大接続数 |
|
単一のワーカーが処理できる最大接続数。 |
|
タイムアウト設定 ユースケースに基づいて調整してください。 |
|
TCP 接続を確立するためのタイムアウト。 |
|
|
データの読み取りタイムアウト。 |
|
|
|
データの送信タイムアウト。 |
|
|
再試行メカニズム 過度の再試行は、サービスが不安定な場合にバックエンドの負荷を増大させ、カスケード障害を引き起こす可能性があります。詳細については、「Ingress-nginx の公式ドキュメント」をご参照ください。 |
|
失敗後の再試行。デフォルト:3 (初回試行 1 回 + 再試行 2 回) 。 |
|
|
再試行の条件。 |
|
|
|
リクエスト再試行のタイムアウト。シナリオに基づいて調整してください。 |
関連ドキュメント
CNI プラグインはクラスターのネットワークパフォーマンスに影響を与え、それが NGINX Ingress コントローラーに影響します。Terway ネットワークプラグインの使用を推奨します。