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 の仕様を指定できます。
ポッドが排他的に占有するノード
NGINX の基本的なオーバーヘッドのため、単一の高仕様ポッド ( 32 vCPU ポッドなど ) は、合計リソースが同じ複数の低仕様ポッド ( 2 つの 16 vCPU ポッドなど ) よりもパフォーマンスが優れています。したがって、高可用性を確保しながら、複数の低仕様ポッドの代わりに少数の高仕様ポッドを使用できます。
たとえば、高仕様でノード数が少ないノードプールを作成し、汚染と許容を構成して、各ノードを NGINX Ingress コントローラーポッドが排他的に占有するようにすることができます。これにより、NGINX Ingress コントローラーはリソース使用率を最大化でき、クラスタ内の他のアプリケーションの影響を受けません。
メトリクスの収集の無効化
NGINX Ingress コントローラーは、デフォルトで他のコンポーネントが使用するためのメトリクスを収集します。ただし、メトリクスの収集は CPU リソースを消費します。メトリクスを取得する必要がない場合は、メトリクスの収集を無効にすることをお勧めします。 NGINX の起動パラメーターに --enable-metrics=false を追加することで、すべてのメトリクスの収集を無効にできます。
v1.9.3 以降の NGINX Ingress コントローラーバージョンには、カスタムメトリクス収集用の追加パラメーターが含まれています。たとえば、--exclude-socket-metrics を追加すると、ソケット関連のメトリクスの収集が停止します。起動パラメーターの詳細については、「cli-arguments」をご参照ください。
タイムアウトポリシーの調整
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 接続の原則を理解していることを確認してください。構成を変更した後、接続ステータスとリソース使用量を継続的に監視して、調整が安全かつ効果的であることを確認してください。
ConfigMap の構成
NGINX Ingress コントローラーのグローバル構成は、ConfigMap に保存されます。次のコマンドを実行して、ConfigMap を変更できます。
kubectl edit cm -n kube-system nginx-configurationパラメーターの説明
次の表に、ConfigMap の主要なパラメーターを示します。
構成項目 | 構成パラメーター | 説明 |
ダウンストリーム |
| ダウンストリーム |
| ダウンストリーム | |
アップストリーム |
| アップストリーム |
| 許可されるアップストリーム | |
| アップストリーム | |
| アップストリーム | |
各作業プロセスの接続上限 |
| ワーカープロセスで開くことができる同時接続の最大数。 |
タイムアウト設定 説明 ビジネス要件に基づいてパラメーター値を変更できます。 |
| 接続を確立するためのタイムアウト期間。単位: 秒。 |
| データを読み取るためのタイムアウト期間。単位: 秒。 | |
| データを送信するためのタイムアウト期間。単位: 秒。 | |
再試行設定 説明 バックエンドサービスでエラーが発生した場合、複数回の再試行によりリクエストが多すぎる可能性があります。これは、バックエンドサービスの負荷を増加させたり、サービスの雪崩を引き起こしたりする可能性があります。詳細については、Ingress-nginx 公式ドキュメントをご参照ください。 |
| リクエストの送信に失敗した後の再試行回数。デフォルト値: 3 。デフォルト値には、元のリクエストと 2 回の再試行が含まれます。 |
| 再試行がトリガーされる条件。再試行を無効にするには、値を off に設定します。 | |
| リクエスト再試行のタイムアウト期間。単位: 秒。ビジネス要件に基づいて値を変更できます。 |
ログの自動ローテーションの構成
デフォルトでは、NGINX Ingress コントローラーポッドは /dev/stdout にログを記録します。ログファイルが大きくなるにつれて、新しいログを記録するためにより多くのリソースが消費されます。ログを定期的にローテーションすることで、ログ記録のリソース消費量を削減できます。この方法では、特定の期間のログを別のファイルに保存し、元のログレコードをクリアします。
SSH を使用して、NGINX Ingress コントローラーポッドがデプロイされている ECS ノードにログオンします。詳細については、「SSH キーペアを使用して Linux インスタンスに接続する」をご参照ください。
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)" 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: 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次のコマンドを実行して、
nginx-log-rotate.shファイルに実行権限を追加します。chmod 755 /root/nginx-log-rotate.sh/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; # サーバー側の暗号構成を優先します。