前言
最近有部分同窗諮詢關於使用Ingress-nginx
碰到的一系列問題,其實有部分問題,我也沒有碰到過,都是在官網上找到的答案,驗證後,進行了一個簡單問題列表整理,但願可以幫助到須要的人。前端
問題列表
-
Ingress
就是谷歌的標新立異,其實用處不大,使用NodePort
就能夠輕易替代,不知道你們爲啥還要用這個?
所謂的
Ingress
,能夠把它理解爲Service
中的"Service"
,這個Ingress
的Service
是用於代理後端不一樣服務的負載均衡服務。從本質上來講是對反向代理的一種抽象,說到抽象,K8S
中有不少抽象,常見有數據存儲卷,經過存儲卷,你能夠聲明各類不一樣類型的存儲,知足不一樣使用場景。固然Ingress
也不例外,你能夠經過Ingress Controller
選擇不一樣後端代理服務,好比你的服務對中斷很是敏感,你能夠選擇Traefik
。這些都是K8S
插件化思想一個體現。固然你能夠選擇使用NodePort+nginx Pod
實現服務的訪問,可是後面就會出現一系列的端口管理問題、安全等問題。使用見:Kubernetes Ingress工做原理介紹java
-
Ingress
資源對象中包含TCP/UDP
端口,應該如何暴露?
Ingress
自己是7
層代理,不支持TCP
和UDP
端口訪問,所以Ingress
使用--tcp-services-configmap
和udp-services-configmap
這些標識指向現有的配置映射,對外公開端口。其中data
字段部分:鍵是要使用的外部端口,而且該值使用如下格式指示要公開的服務,若是存在命名空間,則把default
修改成相應命名空間。具體使用示例以下所示:nginx
apiVersion: v1kind: ConfigMapmetadata: name: tcp-services namespace: ingress-nginxdata: 9000: "default/test:80"
-
不一樣命名空間下的 Service
,如何使用Ingress
進行訪問?
上面已經說了
Ingress
就是一種Service
,因此Ingress
也有命名空間的概念,若是Service
和Ingress
不在同一個命名空間下面,天然沒法訪問的,解決辦法很是簡單,只須要給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
訪問打印日誌時間不對?
直接把本地時間
mount
到Pod
中便可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
?
很簡單,不配置便可,有同窗嘗試配置
IP
,apply
以後就提示不合法。具體以下所示:api
.....spec: tls: - hosts: secretName: ssl-cert rules: - http:.....
-
Ingress
不支持TLS1.0、TLS1.1
如何處理?
默認不支持
1.0
和1.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 nginx
從0.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/
。若有問題,關注公衆號、加我好友,拉你進羣討論。另外祝你們七夕快樂,單身的今日脫單,有情人的永遠浪漫!
推薦
原創不易,隨手關注或者」三連「,誠摯感謝!
本文分享自微信公衆號 - 雲原生技術愛好者社區(programmer_java)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。