在高負載情境下,預設配置的Nginx Ingress Controller可能會成為效能瓶頸,出現響應延遲增高、錯誤率上升,甚至在流量高峰期出現停用情況。通過規劃獨佔基礎設施、調整部署與調度策略、深度調優核心績效參數等一系列操作,確保 Nginx Ingress在高負載情境中保持高效能與高穩定性。
由於Ingress NGINX開源專案於2026年3月後停止維護更新,Container Service for Kubernetes將停止Nginx Ingress Controller組件維護,請充分瞭解使用風險。更多詳細內容,請參見【產品公告】關於停止維護Nginx Ingress Controller組件的公告。
下列配置僅提供參考思路,是否使用某個配置和各項參數與規格的選擇,請實際結合Nginx Ingress Controller負載進行選擇。
保證組件資源充足
採用獨佔節點池部署
使用獨佔節點池部署,可使Nginx Ingress Controller的工作負載與叢集中其他應用完全隔離,不受資源搶佔影響。
為Nginx Ingress Controller Pod設定resources.limits可能因記憶體限制觸發OOM,或因CPU限流導致流量中斷或效能抖動,請勿配置資源限制。如業務情境必須配置,建議CPU不低於1核,記憶體不低於2 GiB。
建立專屬節點池
為Nginx Ingress Controller Pod建立專屬節點池。請注意下列事項:
節點規格選擇:Pod的網路效能受所在節點執行個體規格限制。例如,節點PPS為30萬時,單Pod的PPS上限即為30萬。建議選擇網路增強型執行個體,並選擇CPU為32核或更多的規格。
節點數量:Nginx Ingress Controller預設部署兩個Pod,且採用了反親和性配置,節點池中至少需要兩個節點。
汙點與標籤配置:節點池需要配置汙點和標籤,以避免其他Pod調度到該節點。例如,可在汙點和標籤中添加
system-addon: nginx-ingress索引值對,並將汙點Effect設定為NoSchedule。Pod規格選擇:由於Nginx的基礎開銷,在資源總量相同的情況下,單個高規格Pod(例如32核)的效能優於多個低規格Pod(例如兩個16核)。在保證高可用的前提下,建議使用少量高規格Pod。
配置組件
登入Container Service管理主控台,在組件管理頁面找到Nginx Ingress Controller卡片,單擊配置。
在NodeSelector中添加專屬節點池標籤。
請勿刪除已有的NodeSelector標籤
在Tolerations中添加專屬節點池標籤,並將Effect設定為NoSchedule。
單擊確認,然後通過控制台確認Pod是否已調度到專屬節點池。
調整Server Load Balancer執行個體規格
Server Load Balancer執行個體規格決定了Nginx Ingress的最大串連數和QPS上限,建議使用高規格執行個體。
執行以下命令編輯Service,通過service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec註解指定Server Load Balancer執行個體規格:
kubectl edit service -n kube-system nginx-ingress-lbapiVersion: v1
kind: Service
metadata:
annotations:
...
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s3.large" # 指定Server Load Balancer執行個體規格
name: nginx-ingress-lb
namespace: kube-system
...
spec:
...僅2025年06月前建立的按規格計費CLB執行個體支援此操作。CLB執行個體規格詳情請參見執行個體效能。
使用HPA進行自動擴容
採用獨佔節點池部署的Pod通常已具備應對業務突發流量的能力。如仍無法滿足要求,可配置HPA(Horizontal Pod Autoscaler)對Nginx Ingress Controller進行自動擴容。
Pod縮容可能導致部分Business Connectivity中斷,請謹慎配置縮容策略。
建立並儲存以下內容為nginx-hpa.yaml,然後執行kubectl apply -f nginx-hpa.yaml建立HPA:
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保證後端應用平滑下線
後端Pod進行變換時,Nginx Ingress Controller停止將新的請求轉寄到正在終止的Pod,但仍保持還在處理請求的串連。如果Pod此時立即終止,可能會導致正在處理的請求發生錯誤。
通過配置preStop Hook,Pod會在收到SIGTERM訊號後繼續工作一段時間,保證現有的請求處理完成:
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: app
lifecycle:
# 配置preStop Hook,等待30秒後退出。
# 需要容器中存在sleep命令。
preStop:
exec:
command:
- sleep
- 30
...preStop的等待時間應根據業務最大請求處理時間確定,一般建議設定為最大回應時間的1.5~2倍。需要確認容器鏡像中存在sleep命令。
通過監控與日誌確認組件狀態
SLS日誌
在Container Service管理主控台頁面的Nginx Ingress 概覽中,可以查看日誌大盤,確認用戶端訪問資料;也可以在中選擇nginx-ingress,查看具體日誌條目。
如果日誌大盤中多項資料顯示null,或日誌庫中nginx-ingress的日誌為空白,說明在建立叢集時未開啟日誌相關選項,請參見採集與分析 Nginx Ingress 訪問日誌手動設定。
Prometheus監控
登入Container Service管理主控台,在中可以查看監控大盤。
如果頁面顯示還未安裝組件,請根據提示完成相關組件的安裝和監控大盤的檢查。
選擇叢集Ingress流量監控頁簽,然後在Controller Class中選擇k8s.io/ingress-nginx,即可查看Nginx Ingress監控。如果未顯示k8s.io/ingress-nginx選項,表明還未安裝Nginx Ingress Controller組件。
請為Ingress資源添加host欄位。在預設配置下,沒有host欄位的Ingress資源不會被監控採集。如果無需區分Host進行監控,也可以在Nginx Ingress Controller的Deployment中修改controller啟動參數,加入--metrics-per-host=false來解決該問題。
最佳化Nginx配置
配置日誌自動輪轉
Nginx Ingress Controller Pod將日誌同時記錄到/dev/stdout和容器內/var/log/nginx/目錄。隨著記錄檔逐漸增大,記錄新日誌將耗費更多資源。通過日誌輪轉,定期將一個時間段中的日誌儲存到獨立檔案中,並清除原有日誌記錄,可降低記錄日誌的資源消耗。
登入部署Nginx Ingress Controller 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檔案結尾添加以下內容:以下Cron運算式表明每15分鐘對日誌輪轉一次,可根據實際需求進行調整。
*/15 * * * * root /root/nginx-log-rotate.sh
關閉指標採集
Nginx Ingress Controller預設開啟指標採集,會消耗一定的CPU資源。如無需擷取指標,建議關閉採集。
執行kubectl edit deploy nginx-ingress-controller -n kube-system,編輯Controller所屬的Deployment。在容器配置部分添加--enable-metrics=false配置,即可關閉所有指標採集。
v1.9.3或以下版本
spec:
containers:
- args:
- ...
- --enable-metrics=falsev1.9.3以上版本
v1.9.3以上版本的Nginx Ingress Controller支援單獨關閉部分指標採集。例如添加--exclude-socket-metrics則可以停止Socket相關指標採集。更多資訊,請參見cli-arguments。
spec:
containers:
- args:
- ...
- --enable-metrics=true
- --exclude-socket-metrics # 僅在--enable-metrics=true時有效啟用Brotli壓縮
Brotli壓縮演算法相較於Nginx Ingress Controller預設的gzip壓縮演算法,在文本類資料(如網頁資源)上的壓縮率通常高約15%~30%。
具體提升取決於情境的詳細情況。
執行kubectl edit cm -n kube-system nginx-configuration編輯Nginx Ingress 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"enable-brotli:是否啟用Brotli壓縮演算法,取值為true或false。brotli-level:壓縮層級,範圍[1~11],預設為4。層級越高,CPU效能消耗越大。brotli-types:指定使用Brotli即時壓縮的MIME類型。
調整逾時策略
通過減少FIN_WAIT2與TIME_WAIT狀態的逾時時間,Nginx Ingress Controller可更快地關閉已完成資料發送的串連,降低資源佔用。
FIN_WAIT2與TIME_WAIT等 TCP 協議棧參數直接影響 Nginx Ingress Controller 的串連回收機制。不當的配置可能導致串連池耗盡、連接埠資源枯竭或瞬間的高並發擁塞。在執行調整前,請確保已經瞭解TCP串連相關原理,並在修改後持續觀察串連狀態和資源使用方式,確保調整的影響在可控範圍內。
執行kubectl edit deploy nginx-ingress-controller -n kube-system,編輯 Nginx Ingress Controller所屬的Deployment。
在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 Ingress Controller的HTTPS效能。它們儲存在ConfigMap nginx-configuration中。
kubectl edit cm -n kube-system nginx-configurationSSL會話緩衝與逾時
設定SSL 共用工作階段緩衝的大小以及逾時時間,可以減少SSL握手的開銷。
data: ssl-session-cache-size: "10m" ssl-session-timeout: "10m"啟用OCSP Stapling,減少用戶端認證驗證的時間。
data: enable-ocsp: "true"啟用TLS 1.3的0-RTT功能,允許用戶端在握手完成之前就發送資料,從而減少串連建立的延遲。
data: ssl-early-data: "true" ssl-protocols: "TLSv1.3"調整Cipher優先順序(無需手動調優)
通過調整加密套件的優先順序,可以有效降低延遲。Nginx Ingress Controller的預設配置已進行了最佳化。
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; # 優先使用伺服器端的Cipher配置。
配置其他效能相關選項
下列配置項也會影響Nginx Ingress Controller的效能,它們儲存在ConfigMap nginx-configuration中。執行kubectl edit cm -n kube-system nginx-configuration編輯ConfigMap。
配置項 | 配置參數 | 描述 |
下遊 |
| 下遊 |
| 下遊 | |
上遊 |
| 最大上遊 |
| 允許的最大上遊 | |
| 上遊 | |
| 上遊 | |
單個Worker最大串連 |
| 單個Worker支援的最大串連數。 |
逾時配置 可根據實際業務情境調整,按需配置。 |
| 建立TCP串連的逾時時間。 |
| 讀取資料的逾時時間。 | |
| 發送資料的逾時時間。 | |
最佳化重試機制 當後端服務異常情況下,多級重試的過多請求可能加重後端服務的負載引發雪崩問題。更多詳情請參見Ingress-nginx官方文檔。 |
| 失敗後的重試次數,預設為3次,包括1次初始請求和2次重試。 |
| 指定重試條件,設定為off則關閉重試功能。 | |
| 指定請求重試的逾時時間,根據實際應用情境進行調整。 |
相關文檔
叢集的容器網路外掛程式(CNI Plugin)選擇會影響叢集內網路通訊效能,進而影響Nginx Ingress Controller的效能表現,推薦使用Terway網路外掛程式。