Nginx Ingress FAQ
本文主要為您介紹Nginx Ingress常見問題的處理方法。
Ingress支持哪些SSL/TLS版本?
Ingress-Nginx默認(rèn)支持TLS V1.2及V1.3版本,對(duì)于部分舊版本的瀏覽器,或者移動(dòng)客戶端TLS版本低于1.2時(shí),會(huì)導(dǎo)致客戶端在與Ingress-Nginx服務(wù)SSL版本協(xié)商時(shí)報(bào)錯(cuò)。
修改kube-system/nginx-configuration configmap
添加以下配置,以啟用Ingress-Nginx對(duì)更多TLS版本的支持。具體操作,請(qǐng)參見TLS/HTTPS。
Nginx Ingress Controller 1.7.0及以后版本,如要啟用TLS v1.0與TLS v1.1,需要將@SECLEVEL=0
添加到ssl-ciphers
中。
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:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA"
ssl-protocols: "TLSv1 TLSv1.1 TLSv1.2 TLSv1.3"
Ingress L7請(qǐng)求頭默認(rèn)是透?jìng)鞯膯幔?/h2>Ingress-Nginx默認(rèn)透?jìng)骺蛻舳说恼?qǐng)求頭,有些不符合HTTP規(guī)則的請(qǐng)求頭(例如Mobile Version),在轉(zhuǎn)發(fā)到后端服務(wù)前會(huì)被過(guò)濾掉。為了不過(guò)濾掉這類請(qǐng)求頭,您可以執(zhí)行kubectl edit cm -n kube-system nginx-configuration
命令在ConfigMap中添加配置。更多信息,請(qǐng)參見ConfigMap。
enable-underscores-in-headers: true
Ingress-Nginx默認(rèn)透?jìng)骺蛻舳说恼?qǐng)求頭,有些不符合HTTP規(guī)則的請(qǐng)求頭(例如Mobile Version),在轉(zhuǎn)發(fā)到后端服務(wù)前會(huì)被過(guò)濾掉。為了不過(guò)濾掉這類請(qǐng)求頭,您可以執(zhí)行kubectl edit cm -n kube-system nginx-configuration
命令在ConfigMap中添加配置。更多信息,請(qǐng)參見ConfigMap。
enable-underscores-in-headers: true
后端服務(wù)為HTTPS服務(wù)訪問時(shí)是否可以通過(guò)Ingress-Nginx轉(zhuǎn)發(fā)?
對(duì)于后端業(yè)務(wù)是HTTPS服務(wù),但同樣希望可以通過(guò)Ingress-Nginx轉(zhuǎn)發(fā)時(shí),執(zhí)行以下命令,在Ingress資源配置中添加以下Annotation。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: xxxx
annotations:
# 注意這里:必須指定后端服務(wù)為HTTPS服務(wù)。
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
Ingress L7透?jìng)骺蛻舳薎P嗎?
Ingress-Nginx默認(rèn)會(huì)通過(guò)X-Forwarded-For和X-Real-IP來(lái)透?jìng)骺蛻舳薎P,但是當(dāng)客戶端主動(dòng)在請(qǐng)求頭里指定了X-Forwarded-For和X-Real-IP時(shí),會(huì)導(dǎo)致服務(wù)端無(wú)法獲取到真實(shí)的客戶端IP。
您可以執(zhí)行kubectl edit cm -n kube-system nginx-configuration
命令在ConfigMap中添加配置,以實(shí)現(xiàn)Ingress,L7透?jìng)骺蛻舳薎P。關(guān)于透出客戶端IP為IPv6場(chǎng)景請(qǐng)參見透?jìng)骺蛻舳薎Pv6的IP地址。
compute-full-forwarded-for: "true"
forwarded-for-header: "X-Forwarded-For"
use-forwarded-headers: "true"
如果在Nginx ingress之前有多層代理,您需要根據(jù)proxy-real-ip-cidr參數(shù)對(duì)配置進(jìn)行調(diào)整,將前置代理的IP地址以CIDR格式添加到proxy-real-ip-cidr
中,多個(gè)CIDR之間用逗號(hào)分隔。詳細(xì)信息請(qǐng)參見使用WAF或透明WAF。
proxy-real-ip-cidr: "0.0.0.0/0,::/0"
在IPv6場(chǎng)景下,如果Nginx Ingress收到的X-Forwarded-For
頭為空,并且前置有CLB可以啟用CLB 的Proxy Protocol來(lái)獲取客戶端IP。關(guān)于Proxy Protocol詳細(xì)信息請(qǐng)參見通過(guò)CLB四層監(jiān)聽獲取客戶端真實(shí)IP。
更多信息,請(qǐng)參見阿里云容器服務(wù)Ingress設(shè)置原IP透?jìng)?/a>。
Nginx Ingress Controller組件支持HSTS嗎?
nginx-ingress-controller組件默認(rèn)是開啟HSTS的,有些瀏覽器第一次基于PLAIN HTTP訪問時(shí),服務(wù)端(開啟HSTS)會(huì)在返回給客戶端的響應(yīng)頭里攜帶Non-Authoritative-Reason: HSTS
字段,說(shuō)明服務(wù)端支持HSTS,當(dāng)客戶端也支持的情況下下次會(huì)直接以HTTPS方式訪問服務(wù)端。服務(wù)端返回的響應(yīng)頭消息體中包含有307 Internal Redirect
狀態(tài)碼,具體如下圖所示。
當(dāng)客戶端不希望支持自動(dòng)轉(zhuǎn)到HTTPS訪問服務(wù)端時(shí),您可以關(guān)閉nginx-ingress-controller組件的HSTS。具體操作,請(qǐng)參見HSTS。
在瀏覽器端HSTS默認(rèn)是有緩存的,當(dāng)關(guān)閉nginx-ingress-controller組件的HSTS后,請(qǐng)您清理緩存。
Ingress-Nginx支持哪些Rewrite配置?
目前Ingress-Nginx支持一些簡(jiǎn)單的Rewrite配置,具體請(qǐng)參見Rewrite。但是,對(duì)于一些高級(jí)的特別的Rewrite需求,您可以通過(guò)下面方式來(lái)配置。
configuration-snippet:請(qǐng)參見Configuration snippet,擴(kuò)展一些配置到Location章節(jié)中。
server-snippet:請(qǐng)參見Server snippet,擴(kuò)展一些配置到Server章節(jié)中。
同時(shí),snippet也支持一些全局配置,具體如下圖所示。更多相關(guān)信息,請(qǐng)參見main-snippet。
在ACK組件管理中升級(jí)Nginx Ingress Controller組件時(shí),系統(tǒng)會(huì)有哪些更新?
Nginx Ingress Controller組件在0.44之前的版本,包含以下資源:
serviceaccount/ingress-nginx
configmap/nginx-configuration
configmap/tcp-services
configmap/udp-services
clusterrole.rbac.authorization.k8s.io/ingress-nginx
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx
role.rbac.authorization.k8s.io/ingress-nginx
rolebinding.rbac.authorization.k8s.io/ingress-nginx
service/nginx-ingress-lb
deployment.apps/nginx-ingress-controller
Nginx Ingress Controller組件在0.44版本及其之后的版本,額外包含以下資源:
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission
service/ingress-nginx-controller-admission
serviceaccount/ingress-nginx-admission
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission
role.rbac.authorization.k8s.io/ingress-nginx-admission
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission
job.batch/ingress-nginx-admission-create
job.batch/ingress-nginx-admission-patch
在ACK的組件管理頁(yè)面對(duì)Nginx Ingress Controller組件進(jìn)行升級(jí)時(shí),系統(tǒng)保留以下資源配置不變更:
configmap/nginx-configuration
configmap/tcp-services
configmap/udp-services
service/nginx-ingress-lb
所有其他資源的配置都會(huì)被覆蓋成默認(rèn)配置。以deployment.apps/nginx-ingress-controller
資源配置為例,其默認(rèn)的replicas參數(shù)為2。如果您升級(jí)Nginx Ingress Controller組件之前的replicas為5,但是通過(guò)組件管理升級(jí)Ingress后,其replicas將會(huì)變?yōu)?,和默認(rèn)配置一致。
如何將Ingress-nginx的監(jiān)聽由四層改為七層(HTTPS/HTTP)?
Ingress Pod的負(fù)載均衡默認(rèn)是TCP 443 和TCP 80,您可以創(chuàng)建一個(gè)HTTPS/HTTP類型的負(fù)載均衡,將Ingress-nginx的監(jiān)聽由四層改為七層。
修改監(jiān)聽時(shí)服務(wù)會(huì)有短暫中斷,建議在業(yè)務(wù)低谷期進(jìn)行修改監(jiān)聽操作。
創(chuàng)建證書,并記錄cert-id。具體操作,請(qǐng)參見選擇阿里云簽發(fā)證書。
通過(guò)Annotation將Ingress所用負(fù)載均衡的監(jiān)聽由四層改為七層。
登錄容器服務(wù)管理控制臺(tái),在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁(yè)面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在服務(wù)頁(yè)面頂部設(shè)置命名空間為kube-system,單擊ingress-nginx-lb右側(cè)操作列下的YAML 編輯。
在查看YAML對(duì)話框中,將
ports
中443端口的targetPort
改為80。- name: https port: 443 protocol: TCP targetPort: 80 # 將443端口的targetPort改為80
在
annotations
參數(shù)下添加以下內(nèi)容,然后單擊更新。service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "http:80,https:443" service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}"
結(jié)果驗(yàn)證。
在服務(wù)頁(yè)面,單擊ingress-nginx-lb服務(wù)類型列的。
單擊監(jiān)聽頁(yè)簽,可以看到監(jiān)聽的前端協(xié)議/端口顯示HTTP:80和HTTPS:443,說(shuō)明通過(guò)Annotation將負(fù)載均衡的監(jiān)聽由四層改為七層成功。
應(yīng)用市場(chǎng)部署的ack-ingress-nginx如何使用已有SLB?
登錄容器服務(wù)管理控制臺(tái),在左側(cè)導(dǎo)航欄選擇 。
在應(yīng)用目錄頁(yè)面搜索ack-ingress-nginx或ack-ingress-nginx-v1。
1.20以下集群選中ack-ingress-nginx。
1.20以上集群選中ack-ingress-nginx-v1。
部署Ingress Controller。詳細(xì)信息,請(qǐng)參見部署多個(gè)Ingress Controller。
在部署過(guò)程中的參數(shù)頁(yè)面,刪除舊注解,添加新注解。
刪除controller.service.annotations下的所有注解。
添加新的注解。
# 指定SLB service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LOADBALANCER_ID}" # 強(qiáng)制覆蓋監(jiān)聽 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"
單擊確定,繼續(xù)部署。
部署成功后,配置對(duì)應(yīng)的IngressClass,使用Ingress Controller。詳細(xì)信息,請(qǐng)參見部署多個(gè)Ingress Controller。
如何獲取多個(gè)Ingress Controller對(duì)應(yīng)的訪問日志?
前提條件
安裝日志組件。集群創(chuàng)建時(shí),默認(rèn)會(huì)安裝日志組件,如未安裝。具體操作,請(qǐng)參見步驟一:安裝Logtail組件進(jìn)行手動(dòng)安裝。
默認(rèn)的Ingress Controller組件已經(jīng)開啟Nginx Ingress日志采集配置。
已獲取其他Ingress Controller組件容器的Label。具體操作,請(qǐng)參見如何獲取容器的Label和環(huán)境變量。
操作步驟:
登錄容器服務(wù)管理控制臺(tái),在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁(yè)面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇集群信息。
在集群信息頁(yè)面,單擊集群資源。然后在集群資源的列表中單擊日志服務(wù)Project的右側(cè)ID。
跳轉(zhuǎn)到目標(biāo)集群的SLS日志服務(wù),在日志庫(kù)頁(yè)面創(chuàng)建Logstore。具體操作,請(qǐng)參見管理Logstore。為確保日志不會(huì)重復(fù)采集,一個(gè)Logstore只采集一個(gè)Ingress Controller組件日志。
Logstore名稱可以參考不同的Ingress Controller的組件名稱。
創(chuàng)建成功后,在彈出的數(shù)據(jù)接入向?qū)Э蛑校瑔螕?b data-tag="uicontrol" id="92776871afpw6" class="uicontrol">取消。
在日志庫(kù)左側(cè)列表欄,單擊
,然后在Logtail配置列表下,單擊k8s-nginx-ingress進(jìn)入配置頁(yè)面。在Logtail配置頁(yè)面,單擊復(fù)制。然后在Logtail復(fù)制頁(yè)面,單擊下拉框,選擇新創(chuàng)建的Logstore名稱,在容器過(guò)濾中,單擊容器Label白名單列的添加,并以鍵值對(duì)的方式添加Ingress Controller組件容器Label。在Logtail復(fù)制頁(yè)面,單擊提交。
在日志庫(kù)左側(cè)列表欄,單擊新創(chuàng)建的Logstore名稱。在右側(cè)欄頂部,單擊開啟索引,然后在查詢分析頁(yè)面,單擊確定。即可完成對(duì)Logstore的配置。
在日志庫(kù)左側(cè)列表欄,選擇
。在Logtail配置頁(yè)面中,單擊右側(cè)操作列下的管理Logtail配置。在配置詳情頁(yè)面,單擊處理插件名稱列下的提前字段(正則模式),查看日志處理字段。在Logtail配置頁(yè)面,單擊切換為編輯器配置。在Logtail配置下,單擊編輯。在插件配置中,配置對(duì)應(yīng)日志字段Keys和Regex。配置完成,單擊保存。
說(shuō)明若不同的Nginx Ingress Controller日志格式定義有所區(qū)別,需要對(duì)應(yīng)地修改Logtail配置下的
processors
部分。
如何開啟nginx-ingress-controller的TCP協(xié)議?
ACK集群中的Ingress資源默認(rèn)僅支持路由外部HTTP和HTTPS流量至服務(wù)內(nèi),通過(guò)修改ingress-nginx組件的配置,可以實(shí)現(xiàn)來(lái)自非HTTP協(xié)議的外部TCP流量通過(guò)在ConfigMap中定義的TCP端口映射,路由至集群內(nèi)的服務(wù)。
操作步驟如下:
按tcp-echo服務(wù)模板部署Service、Deployment服務(wù)。
部署以下模板ConfigMap。
編輯tcp-services-cm.yaml,保存退出。
apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: kube-system data: 9000: "default/tcp-echo:9000" # 表示任何通過(guò)端口9000接收到的外部TCP流量都將被路由到default命名空間下名為tcp-echo的服務(wù)上,該服務(wù)監(jiān)聽的是內(nèi)部端口9000。 9001:"default/tcp-echo:9001"
使用如下命令部署ConfigMap。
kubectl apply -f tcp-services-cm.yaml
新增nginx-ingress-controller組件的Service TCP端口,保存退出。
kubectl edit svc nginx-ingress-lb -n kube-system
apiVersion: v1 kind: Service metadata: labels: app: nginx-ingress-lb name: nginx-ingress-lb namespace: kube-system spec: allocateLoadBalancerNodePorts: true clusterIP: 192.168.xx.xx ipFamilies: - IPv4 ports: - name: http nodePort: 30xxx port: 80 protocol: TCP targetPort: 80 - name: https nodePort: 30xxx port: 443 protocol: TCP targetPort: 443 - name: tcp-echo-9000 # 新增 port: 9000 # 新增 protocol: TCP # 新增 targetPort: 9000 # 新增 - name: tcp-echo-9001 # 新增 port: 9001 # 新增 protocol: TCP # 新增 targetPort: 9001 selector: app: ingress-nginx sessionAffinity: None type: LoadBalancer
測(cè)試配置生效。
執(zhí)行以下命令,查看Ingress服務(wù),獲取Ingress SLB的地址。
kubectl get svc -n kube-system| grep nginx-ingress-lb
預(yù)期輸出。
nginx-ingress-lb LoadBalancer 192.168.xx.xx 172.16.xx.xx 80:31246/TCP,443:30298/TCP,9000:32545/TCP,9001:31069/TCP
使用
nc
命令給Ingress IP的9000端口發(fā)送helloworld
。無(wú)返回?cái)?shù)據(jù)則表示測(cè)試正常。echo "helloworld" | nc <172.16.xx.xx> 9000 echo "helloworld" | nc <172.16.xx.xx> 9001
Nginx Ingress證書匹配邏輯是什么?
當(dāng)在Ingress資源配置中指定TLS證書時(shí),證書的配置位于spec.tls
字段下,但實(shí)際使用的域名則引用spec.rules.host
字段。而在Nginx Ingress Controller中,Controller會(huì)以Lua Table的形式存儲(chǔ)域名到證書的映射關(guān)系。
當(dāng)客戶端向Nginx發(fā)起HTTPS請(qǐng)求時(shí),會(huì)通過(guò)SNI攜帶請(qǐng)求的域名host
信息,Nginx ingress采用certificate.call()
來(lái)查找對(duì)應(yīng)的域名是否存在配置的證書,若不存在則返回fake
證書。
相關(guān)的Nginx配置如下:
## start server _
server {
server_name _ ;
listen 80 default_server reuseport backlog=65535 ;
listen [::]:80 default_server reuseport backlog=65535 ;
listen 443 default_server reuseport backlog=65535 ssl http2 ;
listen [::]:443 default_server reuseport backlog=65535 ssl http2 ;
set $proxy_upstream_name "-";
ssl_reject_handshake off;
ssl_certificate_by_lua_block {
certificate.call()
}
...
}
## start server www.example.com
server {
server_name www.example.com ;
listen 80 ;
listen [::]:80 ;
listen 443 ssl http2 ;
listen [::]:443 ssl http2 ;
set $proxy_upstream_name "-";
ssl_certificate_by_lua_block {
certificate.call()
}
...
}
Ingress Nginx支持OCSP Stapling技術(shù)功能,可以改進(jìn)證書狀態(tài)的驗(yàn)證過(guò)程。基于此功能,客戶端無(wú)需直接向CA站點(diǎn)查詢證書狀態(tài),從而減少證書驗(yàn)證時(shí)間,提升訪問速度。更多信息,請(qǐng)參見配置OCSP Stapling。
Nginx Ingress證書為什么不匹配?
找到您配置的證書Secret下對(duì)應(yīng)的證書內(nèi)容保存為文件(需要BASE64解碼后的內(nèi)容),然后使用openssl
命令進(jìn)行解碼查看。
kubectl get secret <YOUR-SECRET-NAME> -n <SECRET-NAMESPACE> -o jsonpath={.data."tls\.crt"} |base64 -d | openssl x509 -text -noout
查看CN(Common Name)字段中是否包含您請(qǐng)求的域名,如果不符,您需要重新生成證書
流量高負(fù)載情況下健康檢查失敗怎么辦?
健康檢查將通過(guò)訪問Nginx在10246端口上監(jiān)聽的/healthz
路徑,以驗(yàn)證Nginx的狀態(tài)是否健康且服務(wù)正常運(yùn)行。
健康檢查失敗時(shí),預(yù)期如下:
I0412 11:01:52.581960 7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:01:55 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:01:55.895683 7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:02.582247 7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:02:05 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:02:05.896126 7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:12.582687 7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:02:15 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:02:15.895719 7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:22.582516 7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:02:25 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:02:25.896955 7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:28.983016 7 nginx.go:408] "NGINX process has stopped"
I0412 11:02:28.983033 7 sigterm.go:44] Handled quit, delaying controller exit for 10 seconds
I0412 11:02:32.582587 7 healthz.go:261] nginx-ingress-controller check failed: healthz
[-]nginx-ingress-controller failed: the ingress controller is shutting down
2024/04/12 11:02:35 Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
W0412 11:02:35.895853 7 nginx_status.go:171] unexpected error obtaining nginx status info: Get "http://127.0.0.1:10246/nginx_status": dial tcp 127.0.0.1:10246: connect: connection refused
I0412 11:02:38.986048 7 sigterm.go:47] "Exiting" code=0
當(dāng)Nginx工作進(jìn)程負(fù)載過(guò)高時(shí),會(huì)消耗大量CPU資源,有時(shí)甚至導(dǎo)致CPU資源接近100%。這種情況可能引發(fā)健康檢查失敗。建議增加Pod副本數(shù)量,以便分散負(fù)載,確保健康檢查能夠成功執(zhí)行。
cert-manager不符合預(yù)期,導(dǎo)致證書簽發(fā)失敗怎么辦?
如果您使用的證書管理工具Cert-manager未能按預(yù)期工作,導(dǎo)致證書簽發(fā)失敗,原因可能是啟動(dòng)了Web應(yīng)用程序防火墻(WAF)。WAF在開啟狀態(tài)下可能會(huì)干擾HTTP01請(qǐng)求,妨礙證書的簽發(fā)流程。建議關(guān)閉WAF,從而消除對(duì)證書簽發(fā)過(guò)程的影響。關(guān)閉WAF前,需充分評(píng)估其他因素,避免帶來(lái)不必要的影響。
Nginx大壓力流量下為什么占用大量?jī)?nèi)存?
如果發(fā)現(xiàn)Nginx在處理大流量時(shí)內(nèi)存占用異常增高,導(dǎo)致OOM事件,可以進(jìn)入Pod內(nèi)部重點(diǎn)檢查Controller進(jìn)程的內(nèi)存占用較多,應(yīng)該是Metrics相關(guān)性能指標(biāo)導(dǎo)致內(nèi)存泄漏。這個(gè)問題為Nginx Ingress Controller v1.6.4的已知問題,推薦您將Nginx Ingress Controller升級(jí)至最新版本,關(guān)閉Metrics采集,修改啟動(dòng)參數(shù),添加--enable-metrics=false。特別注意那些會(huì)顯著影響內(nèi)存的指標(biāo),比如nginx_ingress_controller_ingress_upstream_latency_seconds
。更多詳情,請(qǐng)參見Ingress Controller高壓測(cè)試和Prometheus Metric內(nèi)存泄漏及相關(guān)的Metrics PR。
修正Nginx Ingress Controller過(guò)期的升級(jí)狀態(tài)
當(dāng)Nginx Ingress Controller灰度升級(jí)過(guò)程中,如果遇到卡在驗(yàn)證階段的情況,無(wú)法繼續(xù)操作(出現(xiàn)提示“Operation is forbidden for task in failed state”),這通常是因?yàn)榻M件升級(jí)任務(wù)由于超出預(yù)定的4天有效期而被系統(tǒng)清除導(dǎo)致的。在這種情況下,您需要手動(dòng)調(diào)整組件的灰度狀態(tài)以糾正問題。
如果組件的升級(jí)進(jìn)度已經(jīng)達(dá)到發(fā)布階段,那么無(wú)需執(zhí)行升級(jí)操作。直到當(dāng)前的任務(wù)因超過(guò)預(yù)設(shè)的過(guò)期時(shí)間(4天)而自動(dòng)終止即可。
操作步驟
完成修改后,組件升級(jí)將自動(dòng)繼續(xù),替換舊版本Pod以完成灰度升級(jí)。不過(guò),在控制臺(tái)的組件管理界面中將依然會(huì)顯示升級(jí)中的狀態(tài),該狀態(tài)將在大約兩周后消失恢復(fù)正常。
執(zhí)行以下命令,編輯nginx-ingress-controller的Deployment。
kubectl edit deploy -n kube-system nginx-ingress-controller
將以下參數(shù)修正回指定值。
spec.minReadySeconds: 0
spec.progressDeadlineSeconds: 600
spec.strategy.rollingUpdate.maxSurge: 25%
spec.strategy.rollingUpdate.maxUnavailable: 25%
編輯完成后保存退出。
從控制器v1.10版本起,為什么分塊傳輸(Transfer-Encoding: chunked)無(wú)法正常工作?
如果您的代碼設(shè)置了HTTP頭部Transfer-Encoding: chunked
,并且控制器的日志中出現(xiàn)關(guān)于重復(fù)頭部的錯(cuò)誤信息,這可能與Nginx的更新有關(guān),關(guān)于更新記錄請(qǐng)參見Nginx的更新日志。v1.10起的Nginx版本強(qiáng)化了對(duì)HTTP響應(yīng)的校驗(yàn),導(dǎo)致后端返回多個(gè)Transfer-Encoding: chunked
頭部時(shí)被視為無(wú)效響應(yīng)。因此,需要確保您的后端服務(wù)僅返回一個(gè)Transfer-Encoding: chunked
頭。更多詳情,請(qǐng)參見GitHub Issue #11162。
Nginx Ingress如何配置IP黑白名單訪問控制
Nginx Ingress支持在ConfigMap中添加鍵值對(duì)或在Ingress路由中添加Annotation的方式配置IP黑白名單訪問控制。ConfigMap為全局生效,Ingress在路由維度生效,Ingress路由維度優(yōu)先級(jí)高于全局維度。如需在Ingress中添加Annotation,請(qǐng)參見下表。更多信息,請(qǐng)參見Denylist Source Range和Whitelist Source Range。
Annotation | 說(shuō)明 |
nginx.ingress.kubernetes.io/denylist-source-range | IP黑名單,支持IP地址或CIDR地址塊,以英文半角逗號(hào)(,)分隔。 |
nginx.ingress.kubernetes.io/whitelist-source-range | IP白名單,支持IP地址或CIDR地址塊,以英文半角逗號(hào)(,)分隔。 |
Nginx Ingress v1.2.1已知問題
在Ingress資源中配置defaultBackend時(shí),可能會(huì)覆蓋默認(rèn)server的defaultBackend設(shè)置。更多詳情請(qǐng)參見GitHub Issue #8823。為了解決這個(gè)問題,建議將Nginx Ingress Controller組件升級(jí)至v1.3或更高版本。關(guān)于如何升級(jí)組件的操作步驟,請(qǐng)參見升級(jí)Nginx Ingress Controller組件。
使用curl命令訪問公網(wǎng)服務(wù)時(shí)出現(xiàn)連接重置
在使用curl
命令通過(guò)HTTP協(xié)議訪問境外公網(wǎng)服務(wù)時(shí),可能會(huì)遇到錯(cuò)誤提示:curl: (56) Recv failure: Connection reset by peer
。通常是由于HTTP明文請(qǐng)求中可能包含敏感詞,這些敏感詞導(dǎo)致請(qǐng)求被阻斷或響應(yīng)被重置。您可以為路由規(guī)則配置HTTPS證書,確保使用加密方式進(jìn)行通信。