主機(jī) nginx
一般 nginx 做主機(jī)反向代理(網(wǎng)關(guān))有以下配置
upstream order{
其中 192.168.1.10:5001,192.168.1.10:5001 我們把他們稱為 Endpoint,就是所謂的具體的服務(wù),比如 order 訂單服務(wù)。
pod nginx-ingress
nginx-ingress也是一種代理,是一個(gè)pod,外部的數(shù)據(jù)統(tǒng)一經(jīng)過(必經(jīng))這個(gè)pod,然后通過該pod內(nèi)部的nginx方向代理到各各服務(wù)(Endpoint)。nginx-ingress是ingress控制器插件的一種,這些插件有很多,比如istio-ingressgateway。
1、Pod
nginx-ingress pod有兩個(gè)功能,controller 和 nginx:
controller:和kubernetes api通訊實(shí)時(shí)更新nginx配置(就是ingress yaml資源了)
與主機(jī)nginx的區(qū)別是,該pod nginx-ingress是運(yùn)行在pod里。主機(jī)在定義反向代理配置文件時(shí),需要監(jiān)聽一個(gè)對(duì)外開放的端口,比如上邊的80端口。那么pod中的nginx端口是如何配置的呢?
我們?cè)趃ithub上找到了nginx-ingress的deployment.yaml
https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
其中一段
apiVersion: apps/v1
我們看到
- name: http
默認(rèn)對(duì)外監(jiān)聽了兩個(gè)端口80和443,也就是說,有這兩個(gè)端口對(duì)外就可以web服務(wù)了。
2、ingress 資源
ingress 資源通過yaml進(jìn)行管理的,比如以下:
apiVersion: extensions/v1beta1
以上我們定義了一個(gè)單一規(guī)則的ingress,該pod(nginx-ingress)接收到外部所有的請(qǐng)求,將被發(fā)送到內(nèi)部order服務(wù)的80端口上。接下來我們看pod(nginx-ingress)如何把ingress資源轉(zhuǎn)化為該pod中的nginx反向代理配置文件
upstream order{
當(dāng)然ingress如果包含https,那么會(huì)轉(zhuǎn)化nginx對(duì)應(yīng)的443端口及證書的配置文件內(nèi)容,這里就不寫了。
那么,單一個(gè)規(guī)則的ingress資源代理多個(gè)服務(wù)(比如order服務(wù),product服務(wù))或者多個(gè)ingress資源文件如何轉(zhuǎn)化為nginx配置? 猜測(cè),其實(shí)就是轉(zhuǎn)化成了多個(gè)。
upstream order{
當(dāng)然,被轉(zhuǎn)化的nginx配置文件要比這些復(fù)雜的多,據(jù)說還是用lua腳本寫的,靈活如openresty。
3、nginx-ingress對(duì)外提供服務(wù)
一般來講,pod直接對(duì)外提供服務(wù)就只有兩種方式:
- create一個(gè)service,該service暴漏nodePort
- forward 映射
我們一般采用第一種。nginx-ingress也是一個(gè)pod,所以,為了能使外部通過該pod代理訪問,還需要nginx-ingress對(duì)外提供一個(gè)nodePort的service。這個(gè)service這里也不再寫了。
4、nginx-ingress工作流程
我們可以看到,因?yàn)?nginx-ingress 這個(gè)pod做了所有service的代理,在高并發(fā)情況下將承受巨大壓力,我們可以增加多個(gè)pod實(shí)例。
作者:dakesolo
鏈接:https://juejin.cn/post/6844903957479817230