K8S Ingress使用|常見問題列表

前言

最近有部分同窗諮詢關於使用Ingress-nginx碰到的一系列問題,其實有部分問題,我也沒有碰到過,都是在官網上找到的答案,驗證後,進行了一個簡單問題列表整理,但願可以幫助到須要的人。前端

問題列表


  • Ingress就是谷歌的標新立異,其實用處不大,使用 NodePort就能夠輕易替代,不知道你們爲啥還要用這個?

所謂的Ingress,能夠把它理解爲Service中的"Service",這個IngressService是用於代理後端不一樣服務的負載均衡服務。從本質上來講是對反向代理的一種抽象,說到抽象,K8S中有不少抽象,常見有數據存儲卷,經過存儲卷,你能夠聲明各類不一樣類型的存儲,知足不一樣使用場景。固然Ingress也不例外,你能夠經過Ingress Controller選擇不一樣後端代理服務,好比你的服務對中斷很是敏感,你能夠選擇Traefik。這些都是K8S插件化思想一個體現。固然你能夠選擇使用NodePort+nginx Pod實現服務的訪問,可是後面就會出現一系列的端口管理問題、安全等問題。使用見:Kubernetes Ingress工做原理介紹java


  • Ingress資源對象中包含 TCP/UDP端口,應該如何暴露?

Ingress自己是7層代理,不支持TCPUDP端口訪問,所以Ingress使用--tcp-services-configmapudp-services-configmap這些標識指向現有的配置映射,對外公開端口。其中data字段部分:鍵是要使用的外部端口,而且該值使用如下格式指示要公開的服務,若是存在命名空間,則把default修改成相應命名空間。具體使用示例以下所示:nginx

apiVersion: v1kind: ConfigMapmetadata: name: tcp-services namespace: ingress-nginxdata: 9000: "default/test:80"

  • 不一樣命名空間下的 Service,如何使用 Ingress進行訪問?

上面已經說了Ingress就是一種Service,因此Ingress也有命名空間的概念,若是ServiceIngress不在同一個命名空間下面,天然沒法訪問的,解決辦法很是簡單,只須要給Ingress加上命名空間便可,當前這個Ingress命名空間下,分配相應命名空間下Service資源對象; 其它命名空間下,只須要添加多個Ingress編排文件, 填寫相應命名空間便可。git

apiVersion: extensions/v1beta1kind: Ingressmetadata: name: http-test namespace: java=svc annotations:

  • 如何使用 Ingress作動靜分離(個人前端和後臺服務分開的)?

前端靜態頁面建議放到最外層CDN上,一來加快訪問速度、體驗良好。若是沒有使用CDN,也可使用Ingress作動靜分離,只須要把Ingress中匹配前端頁面正則表達式開啓。nginx.ingress.kubernetes.io/use-regex: "true"這樣你就能夠在path中經過配置正則表達式,把靜態請求和後端動態請求分離。github


  • Ingress訪問打印日誌時間不對?

直接把本地時間mountPod中便可web

 volumeMounts: - name: webhook-cert mountPath: /usr/local/certificates/ readOnly: true - name: tz-config mountPath: /etc/localtime resources: requests: cpu: 100m memory: 90Mi serviceAccountName: ingress-nginx terminationGracePeriodSeconds: 300 volumes: - name: webhook-cert secret: secretName: ingress-nginx-admission - name: tz-config hostPath:  path: /usr/share/zoneinfo/Asia/Shanghai

  • Ingress如何使用本機 Ip直接訪問?

在資源對象中聲明使用本地網絡便可,樣例以下所示:正則表達式

spec: selector: matchLabels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/component: controller revisionHistoryLimit: 10 minReadySeconds: 0 template: metadata: labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/component: controller spec: hostNetwork: true dnsPolicy: ClusterFirstWithHostNet

  • Ingress中證書如何配置?配置以後不生效,使用了 K8S默認證書,如何修改?

證書在Ingress資源編排文件中tls字段中配置,有同窗反應配置以後不生效,其實看下日誌就知道,大多由於證書中使用的域名和Ingress中配置域名不一致致使的,這個時候Ingress會選擇使用K8S中的默認證書,對於部分存在證書驗證的客戶端服務,會出現驗證不經過的問題,其實這個解決方法也很簡單,當前Ingress中域名和證書中域一致便可。固然你也能夠修改Ingress中的默認證書,具體配置以下所示:後端

........containers: - name: nginx-ingress-controller image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.31.2 args: - /nginx-ingress-controller - --configmap=$(POD_NAMESPACE)/nginx-configuration - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services - --udp-services-configmap=$(POD_NAMESPACE)/udp-services - --publish-service=$(POD_NAMESPACE)/ingress-nginx - --annotations-prefix=nginx.ingress.kubernetes.io - --default-ssl-certificate=default/https-cert.......

  • Ingress沒有域名如何配置 IP

很簡單,不配置便可,有同窗嘗試配置IPapply以後就提示不合法。具體以下所示:api

.....spec: tls: - hosts: secretName: ssl-cert rules: - http:.....

  • Ingress不支持 TLS1.0、TLS1.1 如何處理?

默認不支持1.01.1,部分客戶端仍然使用老協議,就會出現訪問不經過問題,能夠經過以下方式進行修改:安全

kind: ConfigMapapiVersion: v1metadata: name: nginx-configdata: 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灰度發佈不生效?

首先到更新列表中https://github.com/kubernetes/ingress-nginx/blob/master/Changelog.md查看當前版本是否支持灰度發佈,ingress nginx0.25.0開始支持頭部匹配灰度發佈,以後又出現了模糊匹配等灰度發佈功能。Ingress-nginx的灰度發佈必須使用域名,不然會不生效,提示以下錯誤:https://github.com/kubernetes/ingress-nginx/issues/5847


  • 請求頭部標識包含下劃線, ingress nginx不能正確轉發,如何處理?

默認狀況下nginx也不支持頭部包含下劃線,Ingress nginx也是同樣,能夠經過以下配置解決:

kind: ConfigMapapiVersion: v1data: enable-underscores-in-headers: "true" ......metadata: name: nginx-configuration namespace: ingress-nginx

總結

如上就是使用過程當中碰到的一些細節問題,之因此會出現上述問題,大多由於咱們尚未把K8S搞明白,又來了一個Ingress的概念,其實很簡單,多看文檔便可。具體參考:https://kubernetes.github.io/ingress-nginx/。若有問題,關注公衆號、加我好友,拉你進羣討論。另外祝你們七夕快樂,單身的今日脫單,有情人的永遠浪漫!

推薦


Kubernetes Ingress工做原理介紹

如何使用 Ingress-nginx 進行先後端分離?

Ingress-nginx灰度發佈功能詳解

白話K8S核心組件概念



原創不易,隨手關注或者」三連「,誠摯感謝!

本文分享自微信公衆號 - 雲原生技術愛好者社區(programmer_java)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索