暴露一個(gè)http服務(wù)的方式
service 是 k8s 暴露http服務(wù)的默認(rèn)方式山卦, 其中 NodePort 類(lèi)型可以將http 服務(wù)暴露在宿主機(jī)的端口上,以便外部可以訪問(wèn)炸卑。 service模式的結(jié)構(gòu)如下.
service -> label selector -> pods
31217 -> app1 selector -> app1 1234
31218 -> app2 selector -> app2 3456
31218 -> app2 selector -> app2 4567
模式的優(yōu)點(diǎn)
結(jié)構(gòu)簡(jiǎn)單, 容易理解。
模式缺點(diǎn)
- 一個(gè)app 需要占用一個(gè)主機(jī)端口
- 端口缺乏管理
- L4轉(zhuǎn)發(fā)唠亚, 無(wú)法根據(jù)http header 和 path 進(jìn)行路由轉(zhuǎn)發(fā)
Ingress 模式
在service 之前加了一層ingress,結(jié)構(gòu)如下
ingress -> service -> label selector -> pods
www.app1.com -> app1-service -> app1 selector -> app1 1234
80 -> www.app2.com -> app2-service -> app2 selector -> app2 3456
www.app3.com -> app3-service -> app3 selector ->app3 4567
模式的優(yōu)點(diǎn)
- 增加了7層的識(shí)別能力持痰,可以根據(jù) http header, path 進(jìn)行路由轉(zhuǎn)發(fā)
模式缺點(diǎn)
- 復(fù)雜度提升
理解Ingress 實(shí)現(xiàn)
Ingress 的實(shí)現(xiàn)分為兩個(gè)部分 Ingress Controller 和 Ingress .
- Ingress Controller 是流量的入口灶搜,是一個(gè)實(shí)體軟件, 一般是Nginx 和 Haproxy 工窍。
- Ingress 描述具體的路由規(guī)則割卖。
Ingress Controller 會(huì)監(jiān)聽(tīng) api server上的 /ingresses 資源 并實(shí)時(shí)生效。
Ingerss 描述了一個(gè)或者多個(gè) 域名的路由規(guī)則患雏,以 ingress 資源的形式存在鹏溯。
簡(jiǎn)單說(shuō): Ingress 描述路由規(guī)則, Ingress Controller 實(shí)時(shí)實(shí)現(xiàn)規(guī)則淹仑。
設(shè)計(jì)理念
k8s 有一個(gè)貫穿始終的設(shè)計(jì)理念丙挽,即需求和供給的分離肺孵。 Ingress Controller和 Ingress 的實(shí)現(xiàn)也很好的實(shí)踐了這一點(diǎn)。 要理解k8s 颜阐,時(shí)刻記住 需求供給分離的設(shè)計(jì)理念平窘。
Ingress Controller 注意事項(xiàng)
- 一個(gè)集群中可以有多個(gè) Ingress Controller, 在Ingress 中可以指定使用哪一個(gè)Ingress Controller
- 多個(gè)Ingress 規(guī)則可能出現(xiàn)競(jìng)爭(zhēng)
- Ingress Controller 本身需要以hostport 或者 service形式暴露出來(lái)瞬浓。 云端可以使用云供應(yīng)商lb 服務(wù)初婆。
- Ingress 可以為多個(gè)命名空間服務(wù)
Ingress Controller 做哪些設(shè)置
我們以nginx-ingress 為例. 我們可以設(shè)置如下幾個(gè)全局參數(shù)
- 全局timeout時(shí)間
- 全局gzip 壓縮
- https 和 http2
- 全局 請(qǐng)求數(shù)量的 limit
- vts 實(shí)時(shí)nginx 狀態(tài),可以監(jiān)控流量
這里只列出了部分猿棉, 更多請(qǐng)參考文檔 https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/configmap.md
如何設(shè)置 Ingress Controller
兩種方式 configmap 和 custom template磅叛。 custom template 用來(lái)設(shè)置configmap不能設(shè)置的一些高級(jí)選項(xiàng), 通常情況下萨赁,使用configmap 已經(jīng)夠用弊琴。
使用configmap 需要確保Ingress Controller時(shí),啟用了 configmap參數(shù)
Ingress 可以做哪些設(shè)置
我們以nginx-ingress 為例. 我們可以設(shè)置如下幾參數(shù)
- 基于http-header 的路由
- 基于 path 的路由
- 單個(gè)ingress 的 timeout (不影響其他ingress 的 timeout 時(shí)間設(shè)置)
- 登錄驗(yàn)證
- cros
- 請(qǐng)求速率limit
- rewrite 規(guī)則
- ssl
這里只列出了部分杖爽, 更多請(qǐng)參考文檔 https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/annotations.md
如何設(shè)置 Ingress
Ingress只能通過(guò)Annotations 進(jìn)行設(shè)置敲董。并且需要確保 Ingress Controller 啟動(dòng)時(shí)慰安, 啟用了 Annotations 選項(xiàng)
需求和供給分離的優(yōu)點(diǎn)
- Ingress Controller 放在獨(dú)立命名空間中腋寨, 由管理員來(lái)管理。
- Ingress 放在各應(yīng)用的命名空間中化焕, 由應(yīng)用運(yùn)維來(lái)設(shè)置萄窜。
如此可以實(shí)現(xiàn)權(quán)限的隔離, 又可以提供配置能力 撒桨。
總結(jié)
- Ingress Controller 負(fù)責(zé)實(shí)現(xiàn)路由需求查刻, Ingress負(fù)責(zé)描述路由需求
- Ingress Controller 一個(gè)集群可以有多個(gè)
- Ingress Controller 通過(guò)Configmap設(shè)置, Ingress 通過(guò)Annotations設(shè)置
- Ingress Controller 設(shè)置全局規(guī)則凤类, Ingress 設(shè)置局部規(guī)則
- Ingress Controller 可為多個(gè)命名空間服務(wù)穗泵。
- 需求供給分離可以做到權(quán)限隔離,又能提供配置能力谜疤。
文檔
nginx-ingress 文檔 https://github.com/kubernetes/ingress-nginx