k8s~ingress產(chǎn)生的原因
ingress產(chǎn)生的原因
ClusterIP的方式只能在集群內(nèi)部訪問
NodePort方式的話,測試環(huán)境使用還行,當(dāng)有幾十上百的服務(wù)在集群中運(yùn)行時(shí),NodePort的端口管理是災(zāi)難。
LoadBalance方式受限于云平臺(tái),且通常在云平臺(tái)部署ELB還需要額外的費(fèi)用。
所幸k8s還提供了一種集群維度暴露服務(wù)的方式,也就是ingress。ingress可以簡單理解為service的service,他通過獨(dú)立的ingress對(duì)象來制定請(qǐng)求轉(zhuǎn)發(fā)的規(guī)則,把請(qǐng)求路由到一個(gè)或多個(gè)service中。這樣就把服務(wù)與請(qǐng)求規(guī)則解耦了,可以從業(yè)務(wù)維度統(tǒng)一考慮業(yè)務(wù)的暴露,而不用為每個(gè)service單獨(dú)考慮,下面是一個(gè)簡單的ingress應(yīng)用圖,實(shí)現(xiàn)了簡單的請(qǐng)求轉(zhuǎn)發(fā)

?ingress和ingress-controller
ingress對(duì)象:
指的是k8s中的一個(gè)api對(duì)象,一般用yaml配置。作用是定義請(qǐng)求如何轉(zhuǎn)發(fā)到service的規(guī)則,可以理解為配置模板。
ingress-controller:
具體實(shí)現(xiàn)反向代理及負(fù)載均衡的程序,對(duì)ingress定義的規(guī)則進(jìn)行解析,根據(jù)配置的規(guī)則來實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)。
簡單來說,ingress-controller才是負(fù)責(zé)具體轉(zhuǎn)發(fā)的組件,通過各種方式將它暴露在集群入口,外部對(duì)集群的請(qǐng)求流量會(huì)先到ingress-controller,而ingress對(duì)象是用來告訴ingress-controller該如何轉(zhuǎn)發(fā)請(qǐng)求,比如哪些域名哪些path要轉(zhuǎn)發(fā)到哪些服務(wù)等等。
ingress-controller并不是k8s自帶的組件,實(shí)際上ingress-controller只是一個(gè)統(tǒng)稱,用戶可以選擇不同的ingress-controller實(shí)現(xiàn),目前,由k8s維護(hù)的ingress-controller只有g(shù)oogle云的GCE與ingress-nginx兩個(gè),其他還有很多第三方維護(hù)的ingress-controller,具體可以參考官方文檔。但是不管哪一種ingress-controller,實(shí)現(xiàn)的機(jī)制都大同小異,只是在具體配置上有差異。一般來說,ingress-controller的形式都是一個(gè)pod,里面跑著daemon程序和反向代理程序。daemon負(fù)責(zé)不斷監(jiān)控集群的變化,根據(jù)ingress對(duì)象生成配置并應(yīng)用新配置到反向代理,比如nginx-ingress就是動(dòng)態(tài)生成nginx配置,動(dòng)態(tài)更新upstream,并在需要的時(shí)候reload程序應(yīng)用新配置。為了方便,后面的例子都以k8s官方維護(hù)的nginx-ingress為例。
為服務(wù)添加ingress的實(shí)現(xiàn)
1 當(dāng)我們?yōu)橹付ǖ捻?xiàng)目添加ingress支持之后,它會(huì)在“負(fù)載均衡”標(biāo)簽頁出現(xiàn),并顯示出你的域名解析到的服務(wù)。

?
2 我們的ingress是支持https的,所以需要為你的域名配置對(duì)應(yīng)的證書,我們?cè)谂渲梦募锾砑?/p>
?

?
3 自動(dòng)為ingress-controller里的配置文件添加nginx配置項(xiàng),然后自動(dòng)reload它,讓它生效

?
當(dāng)有新的ingress服務(wù)注冊(cè)之后,配置文件會(huì)發(fā)生變化

?
?4 你的服務(wù)對(duì)應(yīng)的nginx是在自己服務(wù)的ymal里進(jìn)行配置的,一般來說,微服務(wù)的網(wǎng)關(guān)層都應(yīng)該建立 一個(gè)ingress-nginx來對(duì)外提供服務(wù)!
下面說一下yaml的nginx部分的功能:
注明ingress的名稱
填寫之前建立的密文名稱(ingress https 證書)
填寫你的服務(wù)所在的namespace,不寫默認(rèn)為default
填寫你要轉(zhuǎn)發(fā)的服務(wù)的域名
填寫你服務(wù)的名稱和pod的端口
yaml代碼如下

?# 構(gòu)建反射代理
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
? name: hello-world-ingress
? namespace: saas
? annotations:
??? kubernetes.io/ingress.class: "nginx"
??? nginx.ingress.kubernetes.io/use-regex: "true"
spec:
? tls:
??? - hosts:
??????? - www.abc.com
????? secretName: saas-tls
? rules:
??? - host: www.abc.com
????? http:
??????? paths:
????????? - backend:
????????????? serviceName: hello-world
????????????? servicePort: 9001