日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Nginx Ingress FAQ

更新時(shí)間:

本文主要為您介紹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

說(shuō)明

Nginx Ingress Controller 1.7.0及以后版本,如要啟用TLS v1.0與TLS v1.1,需要將@SECLEVEL=0添加到ssl-ciphers中。

image.png

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

后端服務(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嗎?

當(dāng)客戶端不希望支持自動(dòng)轉(zhuǎn)到HTTPS訪問服務(wù)端時(shí),您可以關(guān)閉nginx-ingress-controller組件的HSTS。具體操作,請(qǐng)參見HSTS

說(shuō)明

在瀏覽器端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-snippet2

在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)聽由四層改為七層。

說(shuō)明

修改監(jiān)聽時(shí)服務(wù)會(huì)有短暫中斷,建議在業(yè)務(wù)低谷期進(jìn)行修改監(jiān)聽操作。

  1. 創(chuàng)建證書,并記錄cert-id。具體操作,請(qǐng)參見選擇阿里云簽發(fā)證書

  2. 通過(guò)Annotation將Ingress所用負(fù)載均衡的監(jiān)聽由四層改為七層。

    1. 登錄容器服務(wù)管理控制臺(tái),在左側(cè)導(dǎo)航欄選擇集群

    2. 集群列表頁(yè)面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇網(wǎng)絡(luò) > 服務(wù)

    3. 服務(wù)頁(yè)面頂部設(shè)置命名空間為kube-system,單擊ingress-nginx-lb右側(cè)操作列下的YAML 編輯

    4. 查看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}"
  3. 結(jié)果驗(yàn)證。

    1. 服務(wù)頁(yè)面,單擊ingress-nginx-lb服務(wù)類型列的image

    2. 單擊監(jiān)聽頁(yè)簽,可以看到監(jiān)聽的前端協(xié)議/端口顯示HTTP:80和HTTPS:443,說(shuō)明通過(guò)Annotation將負(fù)載均衡的監(jiān)聽由四層改為七層成功。

應(yīng)用市場(chǎng)部署的ack-ingress-nginx如何使用已有SLB?

  1. 登錄容器服務(wù)管理控制臺(tái),在左側(cè)導(dǎo)航欄選擇市場(chǎng) > 應(yīng)用市場(chǎng)

  2. 應(yīng)用目錄頁(yè)面搜索ack-ingress-nginxack-ingress-nginx-v1

    • 1.20以下集群選中ack-ingress-nginx

    • 1.20以上集群選中ack-ingress-nginx-v1

  3. 部署Ingress Controller。詳細(xì)信息,請(qǐng)參見部署多個(gè)Ingress Controller

    在部署過(guò)程中的參數(shù)頁(yè)面,刪除舊注解,添加新注解。

    1. 刪除controller.service.annotations下的所有注解。

      image..png

    2. 添加新的注解。

      # 指定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"

      image..png

  4. 單擊確定,繼續(xù)部署。

  5. 部署成功后,配置對(duì)應(yīng)的IngressClass,使用Ingress Controller。詳細(xì)信息,請(qǐng)參見部署多個(gè)Ingress Controller

如何獲取多個(gè)Ingress Controller對(duì)應(yīng)的訪問日志?

前提條件

操作步驟:

  1. 登錄容器服務(wù)管理控制臺(tái),在左側(cè)導(dǎo)航欄選擇集群

  2. 集群列表頁(yè)面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇集群信息

  3. 在集群信息頁(yè)面,單擊集群資源。然后在集群資源的列表中單擊日志服務(wù)Project的右側(cè)ID。

    image

  4. 跳轉(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">取消。

  5. 日志庫(kù)左側(cè)列表欄,單擊nginx-ingress > Logtail配置,然后在Logtail配置列表下,單擊k8s-nginx-ingress進(jìn)入配置頁(yè)面。

  6. Logtail配置頁(yè)面,單擊復(fù)制。然后在Logtail復(fù)制頁(yè)面,單擊下拉框,選擇新創(chuàng)建的Logstore名稱,在容器過(guò)濾中,單擊容器Label白名單列的添加,并以鍵值對(duì)的方式添加Ingress Controller組件容器Label。在Logtail復(fù)制頁(yè)面,單擊提交

    image

  7. 日志庫(kù)左側(cè)列表欄,單擊新創(chuàng)建的Logstore名稱。在右側(cè)欄頂部,單擊開啟索引,然后在查詢分析頁(yè)面,單擊確定。即可完成對(duì)Logstore的配置。

  8. 日志庫(kù)左側(cè)列表欄,選擇新創(chuàng)建Logstore名稱 > Logtail配置。在Logtail配置頁(yè)面中,單擊右側(cè)操作列下的管理Logtail配置。在配置詳情頁(yè)面,單擊處理插件名稱列下的提前字段(正則模式),查看日志處理字段。

    8184e5bd055d3c2d8add99ce8a285eb0

  9. 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ù)。

操作步驟如下:

  1. tcp-echo服務(wù)模板部署Service、Deployment服務(wù)。

  2. 部署以下模板ConfigMap。

    1. 編輯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" 
    2. 使用如下命令部署ConfigMap。

      kubectl apply -f tcp-services-cm.yaml
  3. 新增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
  4. 測(cè)試配置生效。

    1. 執(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   
    2. 使用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)終止即可。

13d0a48be89519dece72ce8a2b8a3032

操作步驟

完成修改后,組件升級(jí)將自動(dòng)繼續(xù),替換舊版本Pod以完成灰度升級(jí)。不過(guò),在控制臺(tái)的組件管理界面中將依然會(huì)顯示升級(jí)中的狀態(tài),該狀態(tài)將在大約兩周后消失恢復(fù)正常。

  1. 執(zhí)行以下命令,編輯nginx-ingress-controller的Deployment。

    kubectl edit deploy -n kube-system  nginx-ingress-controller
  2. 將以下參數(shù)修正回指定值。

    • spec.minReadySeconds: 0

    • spec.progressDeadlineSeconds: 600

    • spec.strategy.rollingUpdate.maxSurge: 25%

    • spec.strategy.rollingUpdate.maxUnavailable: 25%

    image

  3. 編輯完成后保存退出。

從控制器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 RangeWhitelist 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)行通信。