全部產品
Search
文件中心

Container Service for Kubernetes:配置高負載情境的Nginx Ingress Controller

更新時間:Apr 04, 2026

在高負載情境下,預設配置的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卡片,單擊配置

  1. NodeSelector中添加專屬節點池標籤。

    請勿刪除已有的NodeSelector標籤
  2. Tolerations中添加專屬節點池標籤,並將Effect設定為NoSchedule

  3. 單擊確認,然後通過控制台確認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-lb
apiVersion: 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管理主控台,在營運管理 > Prometheus 監控中可以查看監控大盤。

  • 如果頁面顯示還未安裝組件,請根據提示完成相關組件的安裝和監控大盤的檢查。

  • 選擇叢集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/目錄。隨著記錄檔逐漸增大,記錄新日誌將耗費更多資源。通過日誌輪轉,定期將一個時間段中的日誌儲存到獨立檔案中,並清除原有日誌記錄,可降低記錄日誌的資源消耗。

  1. 登入部署Nginx Ingress Controller Pod的節點。

  2. /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)"
    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檔案結尾添加以下內容:

    以下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=false

v1.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-configuration
  • SSL會話緩衝與逾時

    設定SSL 共用工作階段緩衝的大小以及逾時時間,可以減少SSL握手的開銷。

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

    對應的nginx.conf配置

    對應Nginx側的nginx.conf配置,可以根據實際情境需求調整。

    ssl_session_cache shared:SSL:10m; # 1m儲存約4000個會話
    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。

配置項

配置參數

描述

下遊keepalive

keep-alive: "60s"

下遊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: "150s"

上遊keepalive串連的空閑逾時時間。

單個Worker最大串連

max-worker-connections: "65536"

單個Worker支援的最大串連數。

逾時配置

可根據實際業務情境調整,按需配置。

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 Plugin)選擇會影響叢集內網路通訊效能,進而影響Nginx Ingress Controller的效能表現,推薦使用Terway網路外掛程式