您可以通過配置Nginx Ingress的ConfigMap資源或使用Nginx Ingress注釋來進行配置。本文列出了Nginx Ingress常用的注釋和ConfigMap欄位的具體說明與使用方法。
索引
資源 | 配置項 |
ConfigMap | |
Annotation | |
ConfigMap預設配置說明
您可以通過kubectl edit cm -n kube-system nginx-configuration命令,對ConfigMap進行編輯。以下是ConfigMap預設配置和說明。更多配置資訊請參見官方文檔。
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configuration
namespace: <Namespace> # 預設為kube-system
labels:
app: ingress-nginx
data:
log-format-upstream: '$remote_addr - [$remote_addr] - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length $request_time [$proxy_upstream_name] $upstream_addr $upstream_response_length $upstream_response_time $upstream_status $req_id $host [$proxy_alternative_upstream_name]'
proxy-body-size: 20m
proxy-connect-timeout: "10"
max-worker-connections: "65536"
enable-underscores-in-headers: "true"
reuse-port: "true"
worker-cpu-affinity: "auto"
server-tokens: "false"
ssl-redirect: "false"
allow-backend-server-header: "true"
ignore-invalid-headers: "true"
generate-request-id: "true"
upstream-keepalive-timeout: "900"以下是配置項說明。
配置項 | 描述 |
log-format-upstream | 配置日誌格式,修改後需同步修改 |
proxy-body-size | 設定用戶端請求本文允許的最大大小。詳情請參見Nginx的client_max_body_size。 |
proxy-connect-timeout | 設定與Proxy 伺服器建立串連的逾時,同時設定gRPC串連的grpc_connect_timeout。不能超過75秒,配置值僅為數值,無單位。 |
max-worker-connections | 每個背景工作處理序可開啟的最大同時串連數。設定為0則使用 |
enable-underscores-in-headers | 是否支援包含底線的Header。 |
reuse-port | 為每個背景工作處理序建立一個單獨的監聽通訊端,允許在背景工作處理序之間分配傳入串連。使用 |
worker-cpu-affinity | 自動將背景工作處理序綁定到可用的CPU,進行效能調優。適用於高效能情境。 |
server-tokens | 在響應中發送Nginx伺服器標題,在錯誤頁面中顯示Nginx版本。設定為 |
ssl-redirect | 如果伺服器具有TLS認證,則全域配置將強制使用HTTPS,並進行301重新導向。 |
allow-backend-server-header | 允許從後端返回標題Server,而不是通用的Nginx字串。 |
ignore-invalid-headers | 是否忽略包含無效名稱的Header欄位。 |
generate-request-id | 如果請求中不存在 |
upstream-keepalive-timeout | 設定與上遊伺服器的空閑保持活動串連的逾時時間。對應Nginx的 |
Ingress支援Annotation
在使用Nginx Ingress Controller時,可以根據應用的具體需求來調整其配置。您可以通過添加註釋(Annotations)來改變 Nginx的行為。以下是常用的注釋配置。如需瞭解更多注釋請參見Nginx Ingress Annotation。
負載平衡演算法
Nginx Ingress提供多種負載平衡演算法來最佳化後端服務的流量分發。根據應用程式的特點和需求,您可以選擇不同的負載平衡策略。
注釋 | 描述 |
nginx.ingress.kubernetes.io/load-balance | 用於設定後端服務的普遍負載平衡演算法。
|
nginx.ingress.kubernetes.io/upstream-hash-by | 一致性Hash是一種特殊的Hash演算法,通過構建環狀雜湊空間,替代普通的線性Hash空間。在增刪節點時,只需根據順時針原則遷移部分路由,其他路由保持不變,從而有效減少重新路由,實現負載平衡。 |
以下是一致性Hash負載平衡配置YAML樣本。
1.22及以上版本叢集
一致性Hash支援多種使用方式,例如:
"$request_uri":根據請求的URI進行hash。"$request_uri$host":根據請求的URI和網域名稱進行hash。"${request_uri}-text-value":根據請求的URI和一個自訂文本值進行hash。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-test
namespace: default
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$request_uri" # 根據請求的URI進行hash。
spec:
rules:
- host: ''
http:
paths:
- path: '/'
backend:
service:
name: <YOUR_SERVICE_NAME> #替換為您的目標服務名稱
port:
number: <YOUR_SERVICE_PORT> #替換為您的目標服務連接埠
property:
ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
pathType: ImplementationSpecific
ingressClassName: nginx1.22以下版本叢集
一致性Hash支援多種使用方式,例如:
"$request_uri":根據請求的URI進行hash。"$request_uri$host":根據請求的URI和網域名稱進行hash。"${request_uri}-text-value":根據請求的URI和一個自訂文本值進行hash。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-test
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/upstream-hash-by: "$request_uri" # 根據請求的URI進行hash。
spec:
rules:
- host: ''
http:
paths:
- path: '/'
backend:
serviceName: <YOUR_SERVICE_NAME> #替換為您的目標服務名稱
servicePort: <YOUR_SERVICE_PORT> #替換為您的目標服務連接埠Cookie親和性
以下是基於Cookie的會話親和性的注釋和說明。
註解 | 描述 |
nginx.ingress.kubernetes.io/affinity | 指定親和性類型。預設值為 |
nginx.ingress.kubernetes.io/affinity-mode | 定義親和性模式,可選值如下:
預設值: |
nginx.ingress.kubernetes.io/session-cookie-name | 指定Cookie的值作為Hash Key。 |
nginx.ingress.kubernetes.io/session-cookie-path | 定義將在Cookie上設定的路徑,預設為 |
nginx.ingress.kubernetes.io/session-cookie-max-age | 設定產生的Cookie的有效期間,單位為秒。 |
nginx.ingress.kubernetes.io/session-cookie-expires | 定義Cookie的到期時間,值為從建立到到期所經過的秒數。 |
以下是配置Cookie親和性注釋YAML樣本。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-test
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
spec:
ingressClassName: nginx
rules:
- host: stickyingress.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: http-svc
port:
number: 80重新導向
以下是Nginx Ingress重新導向注釋。
註解 | 描述 |
nginx.ingress.kubernetes.io/ssl-redirect | 將HTTP請求重新導向為HTTPS。配置樣本請參見配置HTTP重新導向至HTTPS。 |
nginx.ingress.kubernetes.io/force-ssl-redirect | 將HTTP請求重新導向為HTTPS。
預設值: |
nginx.ingress.kubernetes.io/permanent-redirect | 永久重新導向的目標URL,必須包含Scheme(HTTP或HTTPS)。 |
nginx.ingress.kubernetes.io/permanent-redirect-code | 永久重新導向的HTTP狀態代碼,預設值為301。 |
nginx.ingress.kubernetes.io/temporal-redirect | 臨時重新導向的目標URL,必須包含Scheme(HTTP或者HTTPS)。 |
nginx.ingress.kubernetes.io/app-root | 修改應用根路徑,對於訪問 |
以下是永久重新導向的目標URL配置樣本,展示如何通過Ingress規則將訪問foo.com的請求重新導向至bar.com。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/permanent-redirect: "https://bar.com"
spec:
ingressClassName: nginx
rules:
- host: foo.com
http:
paths:
- path: "/"
pathType: ImplementationSpecific
backend:
service:
name: httpbin
port:
number: 8000Rewrite重寫
以下是Nginx Ingress重寫Rewrite注釋。
註解 | 描述 |
nginx.ingress.kubernetes.io/rewrite-target | 重寫Path,支援擷取的群組(Capture Group)。配置樣本請參見配置URL重新導向的路由服務。 |
nginx.ingress.kubernetes.io/upstream-vhost | 重寫Host。 |
以下是Rewrite重寫Host配置樣本,將請求example.com/test在轉寄至後端服務之前,重寫為test.com/test。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
name: demo
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /test
pathType: ImplementationSpecific限流
為了確保服務的穩定性,可以通過配置限流策略來控制每個用戶端IP的請求頻率和並發串連數。以下是相關的註解及其說明:
註解 | 描述 |
nginx.ingress.kubernetes.io/limit-connections | 單個IP地址允許的最大並發串連數。超過此限制的請求會返回503錯誤。 |
nginx.ingress.kubernetes.io/limit-rate | 每秒允許發送到單個串連的最大KB數。設定為零禁用速率限制。需要啟用代理緩衝才能使用此功能。 |
nginx.ingress.kubernetes.io/limit-whitelist | 從速率限制中排除的用戶端IP位址範圍,格式為逗號分隔的CIDR列表。 |
nginx.ingress.kubernetes.io/limit-rpm | 每分鐘從單個IP地址接收的最大請求數。突發限制設定為此限制乘以突發乘數(預設乘數為5)。超出限值後將返回limit-req-status-code(預設值為503)。 |
nginx.ingress.kubernetes.io/limit-rps | 每秒從單個IP地址接收的最大請求數。突發限制設定為此限制乘以突發乘數(預設乘數為5)。超出限值後返回limit-req-status-code(預設值為503)。 |
nginx.ingress.kubernetes.io/limit-burst-multiplier | 指定突發請求數量的乘數。預設突發乘數為5,該註解用於覆蓋預設乘數。 |
以下是限流配置樣本。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/limit-rate: "100K"
nginx.ingress.kubernetes.io/limit-whitelist: "10.1.10.100"
nginx.ingress.kubernetes.io/limit-rps: "1"
nginx.ingress.kubernetes.io/limit-rpm: "30"
spec:
rules:
- host: iphone.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: iphone-backend-svc
port:
number: 80容災
為了確保服務的高可用性和穩定性,Nginx Ingress提供了容災(Fallback)機制,以處理服務節點不可用或特定錯誤響應的情況。以下是關於相關註解的說明:
註解 | 描述 |
nginx.ingress.kubernetes.io/default-backend | 容災服務。當Ingress定義的服務沒有可用節點時,請求會自動轉寄到該容災服務。 您可以通過組件管理的Nginx Ingress的組件中進行全域配置。 |
nginx.ingress.kubernetes.io/custom-http-errors | 該註解和 重要 轉寄至容災服務時,請求的Path會被重寫為/,該行為與Ingress-nginx保持一致 與ConfigMap中的custom-http-errors配置相同,此註解將設定Nginx 不同的Ingress可以為其各自的服務指定不同的錯誤碼集合。如果同時在全域和註解中指定 |
灰階發布
灰階發布和藍綠髮布是廣泛採用的策略,以確保應用的平滑升級和高可用性。通過以下注釋配置可以實現靈活的流量管理,從而滿足不同發布需求。更多詳情請參見通過Nginx Ingress實現灰階發布和藍綠髮布。
註解 | 描述 |
nginx.ingress.kubernetes.io/canary | 開啟或關閉灰階發布。 |
nginx.ingress.kubernetes.io/canary-by-header | 基於Request Header Key 流量切分。 |
nginx.ingress.kubernetes.io/canary-by-header-value | 基於Request Header Value 流量切分,Value為精確匹配。 |
nginx.ingress.kubernetes.io/canary-by-header-pattern | 基於Request Header Value 流量切分,Value為正則匹配。 |
nginx.ingress.kubernetes.io/canary-by-cookie | 基於Request Cookie Key 流量切分。 |
nginx.ingress.kubernetes.io/canary-weight | 基於權重流量切分。 |
nginx.ingress.kubernetes.io/canary-weight-total | 權重總和。 |
逾時相關配置
以下是Ingress Nginx的逾時配置選項,包括全域逾時配置和特定資源的自訂逾時設定。使用合適的配置可以最佳化串連效能和可靠性。
全域逾時配置
通過
kubectl edit cm -n kube-system nginx-configuration命令,編輯以下配置項配置全域逾時。配置項
描述
取實值型別
預設值
nginx.ingress.kubernetes.io/proxy-connect-timeout設定與Proxy 伺服器建立串連的逾時時間,單位為秒(s)。
int
nginx.ingress.kubernetes.io/proxy-connect-timeout: "5"建議不超過75
nginx.ingress.kubernetes.io/proxy-read-timeout設定從Proxy 伺服器讀取響應的逾時。該逾時僅在兩個連續的讀取操作之間設定,而不是為整個響應的傳輸設定,單位為秒(s)。
int
nginx.ingress.kubernetes.io/proxy-read-timeout: "60"nginx.ingress.kubernetes.io/proxy-send-timeout設定向Proxy 伺服器傳輸請求的逾時。該逾時只在兩個連續的寫操作之間設定,而不是為整個請求的傳輸設定,單位為秒(s)。
int
nginx.ingress.kubernetes.io/proxy-send-timeout: "60"nginx.ingress.kubernetes.io/proxy-stream-next-upstream-timeout限制允許將串連傳遞到下一個伺服器的時間,設定為
0s則關閉此限制。string
nginx.ingress.kubernetes.io/proxy-stream-next-upstream-timeout: "600s"nginx.ingress.kubernetes.io/proxy-stream-timeout設定用戶端或Proxy 伺服器串連上兩個連續的讀或寫操作之間的逾時時間。如果在這個時間內沒有資料轉送,串連就會關閉。
string
nginx.ingress.kubernetes.io/proxy-stream-timeout: "600s"nginx.ingress.kubernetes.io/upstream-keepalive-timeout設定一個逾時時間,在這個時間內,與上遊伺服器的空閑串連將保持開放,單位為秒(s)。
int
nginx.ingress.kubernetes.io/upstream-keepalive-timeout: "900"nginx.ingress.kubernetes.io/worker-shutdown-timeout設定優雅停機的逾時時間。
string
nginx.ingress.kubernetes.io/worker-shutdown-timeout: "240s"nginx.ingress.kubernetes.io/proxy-protocol-header-timeout設定接收代理協議標頭檔的逾時值。預設的5秒可以防止TLS直通處理常式無限期地等待一個中斷的串連。
string
nginx.ingress.kubernetes.io/proxy-protocol-header-timeout: "5s"nginx.ingress.kubernetes.io/ssl-session-timeout設定 SSL 會話緩衝中的會話參數的有效時間。會話到期時間是相對於建立時間而言的。每個會話緩衝會佔用大約0.25MB的空間。
string
nginx.ingress.kubernetes.io/ssl-session-timeout: "10m"nginx.ingress.kubernetes.io/client-body-timeout定義讀取用戶端請求本文的逾時,單位為秒(s)。
int
nginx.ingress.kubernetes.io/client-body-timeout: "60"nginx.ingress.kubernetes.io/client-header-timeout定義讀取用戶端要求標頭的逾時,單位為秒(s)。
int
nginx.ingress.kubernetes.io/client-header-timeout: "60"特定資源自訂逾時配置
以下是特定資源自訂逾時配置注釋,以及相關的參數配置。
配置項
描述
nginx.ingress.kubernetes.io/proxy-connect-timeout設定代理連線逾時時間。
nginx.ingress.kubernetes.io/proxy-send-timeout設定代理髮送逾時時間。
nginx.ingress.kubernetes.io/proxy-read-timeout設定代理讀取逾時時間。
nginx.ingress.kubernetes.io/proxy-request-buffering是否啟用請求緩衝功能。
on啟用請求緩衝。如果啟用了請求緩衝功能,則會在接收到完整的請求資料之後才將其轉寄到後端工作負載,否則可能會在接收到部分請求資料時就開始轉寄請求。HTTP/1.1 Chunked編碼的請求不受此參數限制,始終會進行緩衝。off則禁用請求緩衝。如果禁用,發送過程中出現發送錯誤,就不會選擇下一個工作負載進行重試。
跨域
在Nginx Ingress 控制器中設定跨域資源共用(CORS)可以協助你控制何種資源可以被跨域訪問。更多詳情請參見Nginx Ingress跨網域設定
註解 | 描述 |
nginx.ingress.kubernetes.io/enable-cors | 開啟或關閉跨域。 |
nginx.ingress.kubernetes.io/cors-allow-origin | 允許的第三方網站。 |
nginx.ingress.kubernetes.io/cors-allow-methods | 允許的要求方法,如GET、POST、PUT等。 |
nginx.ingress.kubernetes.io/cors-allow-headers | 允許的請求Header。 |
nginx.ingress.kubernetes.io/cors-expose-headers | 允許的暴露給瀏覽器的響應Header。 |
nginx.ingress.kubernetes.io/cors-allow-credentials | 是否允許攜帶憑證資訊。 |
nginx.ingress.kubernetes.io/cors-max-age | 預檢結果的最大緩衝時間。 |
重試邏輯
以下用於配置請求重試邏輯的註解。配置這些註解可以協助提升服務的高可用性和容錯能力。
註解 | 描述 |
nginx.ingress.kubernetes.io/proxy-next-upstream-tries | 如果滿足重試條件,則可用重試次數,預設值為3。 |
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout | 請求重試的逾時時間,單位秒。預設未配置逾時時間。 |
nginx.ingress.kubernetes.io/proxy-next-upstream | 配置重試策略或者重試條件,可以使用多個組合用空格分隔,例如設定為
|
IP存取控制
通過以下註解配置Nginx Ingress中的IP黑白名單。
註解 | 描述 |
nginx.ingress.kubernetes.io/whitelist-source-range | IP白名單,支援IP地址或CIDR地址塊,以英文半形逗號(,)分隔。 |
nginx.ingress.kubernetes.io/denylist-source-range | IP黑名單,支援IP地址或CIDR地址塊,以英文半形逗號(,)分隔。 |
以下是配置IP白名單注釋樣本。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/whitelist-source-range: "10.1.10.2"
spec:
rules:
- host: iphone.exmaple.com
http:
paths:
- path: /
pathType: Prefix
backend:backend:
service:
name: iphone-example-svc
port:
number: 80 您還可以使用命令kubectl edit cm -n kube-system nginx-configuration通過編輯配置中的whitelist-source-range 來進行全域設定。
流量鏡像
通過配置以下注釋,您可以實現對應用的流量複製。可以在不影響生產環境的情況下協助您識別潛在的問題,提高應用的穩定性。配置詳情參見通過Nginx Ingress實現應用流量複製。
註解 | 描述 |
nginx.ingress.kubernetes.io/mirror-target | 指定流量目標地址。 支援Service或外部地址,例如,您可以設定為 |
nginx.ingress.kubernetes.io/mirror-request-body | 是否鏡像請求流量的Body。 |
nginx.ingress.kubernetes.io/mirror-host | 指定用於轉寄請求Host資訊。 |
安全防護
為了在用戶端與網關之間的通訊中提供更高的安全性,以下註解可以加強通訊加密。更多詳情請參見Nginx Ingress Controller安全加密。
用戶端與網關之間的通訊加密
通過以下註解來加強用戶端與網關之間的通訊安全性。
註解
範圍
描述
nginx.ingress.kubernetes.io/ssl-cipher
網域名稱
指定TLS的加密套件,可以指定多個(TLS的加密套件之間使用英文冒號分隔),僅當TLS握手時採用TLSv1.0-1.2生效。預設加密套件如下:
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES128-SHA
ECDHE-RSA-AES128-SHA
AES128-GCM-SHA256
AES128-SHA
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-SHA
ECDHE-RSA-AES256-SHA
AES256-GCM-SHA384
AES256-SHA
nginx.ingress.kubernetes.io/auth-tls-secret
網域名稱
網關使用的CA認證,用於驗證mTLS握手期間,用戶端提供的認證。該註解主要應用於網關需要驗證用戶端身份的情境。
對應的Secret中必須包含一個名為
ca.crt的檔案。ca.crt檔案應包含完整的憑證授權單位鏈。網關與後端服務之間通訊加密
通過以下註解來加強網關與後端服務之間的通訊安全性。
註解
範圍
描述
nginx.ingress.kubernetes.io/proxy-ssl-secret
服務
網關使用的用戶端認證,用於後端服務對網關進行身份認證。
該配置必須使用PEM格式的認證。
Secret中必須包含以下檔案:
tls.crt: 用戶端認證。tls.key: 用戶端認證的密鑰。ca.crt: 信任的CA認證,用於驗證代理HTTPS伺服器的認證。
注釋的取值格式必須為
"namespace/secretName"。
nginx.ingress.kubernetes.io/proxy-ssl-name
服務
TLS握手期間使用的SNI。
nginx.ingress.kubernetes.io/proxy-ssl-server-name
服務
開啟或關閉在TLS握手期間使用SNI。
安全認證
以下是有關Basic認證的注釋,確保只有授權使用者才能訪問應用程式介面。
註解 | 範圍 | 描述 |
nginx.ingress.kubernetes.io/auth-type | Ingress | 認證類型,支援 |
nginx.ingress.kubernetes.io/auth-secret | Ingress | Secret名字,格式支援namespace/secretName,包含被授予能夠訪問該Ingress上定義的路由的存取權限的使用者名稱和密碼。 |
nginx.ingress.kubernetes.io/auth-secret-type | Ingress | Secret內容格式。
|
nginx.ingress.kubernetes.io/auth-realm | Ingress | 保護域。相同的保護域共用使用者名稱和密碼。 |
配置樣本:
使用
htpasswd命令列工具產生密碼檔案。htpasswd -c auth joker查看產生的密碼檔案。
cat auth # 輸出樣本: joker:$apr1$R.G4krs/$hh0mX8xe4A3lYKMjvlVs1/將產生的密碼檔案建立為Secret:
kubectl create secret generic basic-auth --from-file=auth在Ingress資源中應用Basic認證,配置樣本如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-nginx annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: basic-auth spec: rules: - host: iphone.exmaple.com http: paths: - path: / pathType: Prefix backend:backend: service: name: iphone-backend-svc port: number: 80