阿里高专王夕宁:Istio网关之南北向流量管理
王夕寧
讀完需要
8
分鐘速讀僅需 3 分鐘
作者簡介:王夕寧 阿里云高級技術(shù)專家,阿里云服務(wù)網(wǎng)格產(chǎn)品ASM及Istio on Kubernetes技術(shù)負(fù)責(zé)人,專注于Kubernetes、云原生、服務(wù)網(wǎng)格等領(lǐng)域。曾在IBM中國開發(fā)中心工作,擔(dān)任過專利技術(shù)評審委員會(huì)主席,作為架構(gòu)師和主要開發(fā)人員負(fù)責(zé)或參與了一系列在SOA中間件、云計(jì)算、IoT等領(lǐng)域的開發(fā)工作,擁有40多項(xiàng)相關(guān)領(lǐng)域的國際技術(shù)專利。著有《Istio服務(wù)網(wǎng)格技術(shù)解析與實(shí)踐》一書;
我們將介紹將集群外部的客戶端連接到集群內(nèi)運(yùn)行的服務(wù),以及如何從集群內(nèi)的服務(wù)訪問集群外部的任何服務(wù),即通常所說的南北向流量管理。其中介紹了 Istio 在南北向流量方面的路由控制能力,引出 Istio 網(wǎng)關(guān)的概念及其工作原理:
Istio 網(wǎng)關(guān)的工作機(jī)制
Istio 網(wǎng)關(guān)的負(fù)載均衡器原理
入口網(wǎng)關(guān)(Ingress Gateway)的服務(wù)與部署的定義
網(wǎng)關(guān)資源、網(wǎng)關(guān)虛擬服務(wù)的定義
通過一個(gè)示例介紹如何調(diào)試入口網(wǎng)關(guān)可能遇到的問題
1
? ?
Istio 網(wǎng)關(guān)
網(wǎng)絡(luò)社區(qū)中有一個(gè)術(shù)語 Ingress,是指入口請求到集群內(nèi)服務(wù)的流量管理。Ingress 指的是源自本地網(wǎng)絡(luò)之外的流量,指向本地集群網(wǎng)絡(luò)中的端點(diǎn)。此流量首先路由到公開的入口點(diǎn),以便通過執(zhí)行一些本地網(wǎng)絡(luò)的規(guī)則和策略來確認(rèn)哪些流量被允許進(jìn)入。如果流量未通過這些入口點(diǎn),則無法與集群內(nèi)的任何服務(wù)連接。如果入口點(diǎn)允許流量進(jìn)入,則將其代理到本地網(wǎng)絡(luò)中的合適節(jié)點(diǎn)。Istio 對入口流量的管理是由 Istio 網(wǎng)關(guān)進(jìn)行的。
2
? ?
Istio 網(wǎng)關(guān)的工作原理
傳統(tǒng)上,Kubernetes 使用 Ingress 控制器來處理從外部進(jìn)入集群的流量。使用 Istio 時(shí),情況不再如此。Istio 網(wǎng)關(guān)用新的 Gateway 資源和 VirtualServices 資源來控制入口流量,它們協(xié)同工作以將流量路由到網(wǎng)格中。在網(wǎng)格內(nèi)部不需要 Gateways,因?yàn)榉?wù)可以通過集群本地服務(wù)名稱相互訪問。
那么 Istio 網(wǎng)關(guān)是怎樣工作的?請求如何到達(dá)它想要的應(yīng)用程序?基本步驟如下:
客戶端在特定端口上發(fā)出請求。
負(fù)載均衡器在這個(gè)端口上進(jìn)行偵聽,并將請求轉(zhuǎn)發(fā)到集群中(在相同或新的端口)。
在集群內(nèi)部,請求被路由到 Istio IngressGateway 服務(wù)所偵聽的負(fù)載均衡器轉(zhuǎn)發(fā)過來的端口上。
Istio IngressGateway 服務(wù)將請求(在相同或新的端口)轉(zhuǎn)發(fā)到對應(yīng)的 pod 上。
在 IngressGateway pod 上會(huì)配置 Gateway 資源和 VirtualService 資源定義。Gateway 會(huì)配置端口、協(xié)議以及相關(guān)安全證書。VirtualService 的路由配置信息用于找到正確的服務(wù)。
Istio IngressGateway pod 會(huì)根據(jù)路由配置信息將請求路由到對應(yīng)的應(yīng)用服務(wù)上。
應(yīng)用服務(wù)將請求路由到對應(yīng)的應(yīng)用 pod 上。
Istio網(wǎng)關(guān)的工作原理
3
? ?
Istio 網(wǎng)關(guān)的負(fù)載均衡作用
典型的服務(wù)網(wǎng)格具有一個(gè)或多個(gè)負(fù)載均衡器,也稱為網(wǎng)關(guān)(Gateway),它們從外部網(wǎng)絡(luò)終止 TLS 并允許流量進(jìn)入網(wǎng)格。然后,流量通過邊車網(wǎng)關(guān)(Sidecar gateway)流經(jīng)內(nèi)部服務(wù)。應(yīng)用程序使用外部服務(wù)的場景也很常見,可以直接調(diào)用外部服務(wù),或者在某些部署中強(qiáng)制通過專用出口網(wǎng)關(guān)(Egress Gateway)離開網(wǎng)格的所有流量。
Istio 具有入口網(wǎng)關(guān)的概念,它扮演網(wǎng)絡(luò)入口點(diǎn)的角色,負(fù)責(zé)保護(hù)和控制來自集群外部的流量對集群的訪問。
網(wǎng)關(guān)在網(wǎng)格中的使用情況
此外,Istio 的網(wǎng)關(guān)還扮演負(fù)載均衡和虛擬主機(jī)路由的角色。如圖所示,可以看到默認(rèn)情況下 Istio 使用 Envoy 代理作為入口代理。Envoy 是一個(gè)功能強(qiáng)大的服務(wù)到服務(wù)代理,但它也有負(fù)載均衡和路由的功能,可代理的流量包括從服務(wù)網(wǎng)格外部到其內(nèi)部運(yùn)行的服務(wù),或者從集群內(nèi)部服務(wù)到外部服務(wù)。在前面章節(jié)中介紹的 Envoy 的所有功能也可以在入口網(wǎng)關(guān)中使用。
Istio 的入口網(wǎng)關(guān)服務(wù)
對于入口流量管理,你可能會(huì)問:為什么不直接使用 Kubernetes Ingress API?
第一個(gè)原因,Kubernetes Ingress 是一個(gè)面向 HTTP 工作負(fù)載的非常簡單的規(guī)范。有 Kubernetes Ingress 的實(shí)現(xiàn)(如 Nginx、Heptio Contour 等),但每個(gè)都適用于 HTTP 流量。實(shí)際上,Ingress 規(guī)范只將端口 80 和端口 443 視為入口點(diǎn)。這嚴(yán)重限制了集群運(yùn)維人員可以允許進(jìn)入服務(wù)網(wǎng)格的流量類型。例如,如果你有 Kafka 工作負(fù)載,則可能希望向這些消息代理公開直接 TCP 連接。
第二個(gè)原因,Kubernetes Ingress API 無法表達(dá) Istio 的路由需求。Ingress 沒有通用的方法來指定復(fù)雜的流量路由規(guī)則,如流量拆分或流量鏡像等。這個(gè)領(lǐng)域缺乏規(guī)范會(huì)導(dǎo)致每個(gè)供應(yīng)商重新設(shè)想如何更好地為每種類型的 Ingress 實(shí)現(xiàn)(如 HAProxy、Nginx 等)做好配置管理。Ingress 試圖在不同的 HTTP 代理之間取一個(gè)公共的交集,因此只能支持最基本的 HTTP 路由。
最后一個(gè)原因,由于事前沒有明確規(guī)定,大多數(shù)供應(yīng)商的選擇是通過部署上的定制注釋來做配置。供應(yīng)商之間的注釋各不相同,并且不可移植,如果 Istio 繼續(xù)延續(xù)這種趨勢,那么就會(huì)有更多的注釋來解釋 Envoy 作為邊緣網(wǎng)關(guān)的所有功能。
Istio 網(wǎng)關(guān)通過將 L4-L6 配置與 L7 配置分離克服了 Ingress 的這些缺點(diǎn)。Istio 網(wǎng)關(guān)只用于配置 L4-L6 功能(例如,對外公開的端口、TLS 配置),所有主流的 L7 代理均以統(tǒng)一的方式實(shí)現(xiàn)了這些功能。然后,通過在 Gateway 上綁定 VirtualService 的方式,可以使用標(biāo)準(zhǔn)的 Istio 規(guī)則來控制進(jìn)入 Gateway 的 HTTP 和 TCP 流量。負(fù)載均衡器可以手動(dòng)配置或通過服務(wù)自動(dòng)配置其類型,例如 type: LoadBalancer。在這種情況下,由于并非所有云都支持自動(dòng)配置,假設(shè)手動(dòng)配置負(fù)載均衡器以將流量轉(zhuǎn)發(fā)到 IngressGateway Service 正在偵聽的端口。例如如下的負(fù)載均衡器正在監(jiān)聽以下端口:
HTTP:端口 80,將流量轉(zhuǎn)發(fā)到端口 30080
HTTPS:端口 443,將流量轉(zhuǎn)發(fā)到端口 30443
MySQL:端口 3306,將流量轉(zhuǎn)發(fā)到端口 30306 確保負(fù)載均衡器配置轉(zhuǎn)發(fā)到所有工作節(jié)點(diǎn)。這將確保即使某些節(jié)點(diǎn)關(guān)閉也會(huì)轉(zhuǎn)發(fā)流量。
4
? ?
入口網(wǎng)關(guān)服務(wù)
IngressGateway 服務(wù)(入口網(wǎng)關(guān)服務(wù))必須監(jiān)聽上節(jié)介紹的所有端口,以便能夠?qū)⒘髁哭D(zhuǎn)發(fā)到 IngressGateway pod 上。Kubernetes 服務(wù)不是“真正的”服務(wù),該請求將由 Kubernetes 提供的 kube-proxy 轉(zhuǎn)發(fā)到具有運(yùn)行對應(yīng) pod 的節(jié)點(diǎn)上。在節(jié)點(diǎn)上,IP table 配置將請求轉(zhuǎn)發(fā)到適當(dāng)?shù)?pod:
ports:-?name:?http2nodePort:?30000port:?80protocol:?TCP-?name:?httpsnodePort:?30443port:?443protocol:?TCP-?name:?mysqlnodePort:?30306port:?3306protocol:?TCP5
? ?
入口網(wǎng)關(guān)部署
IngressGateway 部署是一個(gè)基于 Envoy 代理的封裝,它的配置方式與服務(wù)網(wǎng)格中使用的 Sidecar 配置相同(實(shí)際上是同樣的容器鏡像)。當(dāng)我們創(chuàng)建或更改一個(gè) Gateway 或 VirtualService 時(shí),Istio Pilot 控制器會(huì)檢測到這些變更,并將這些變更信息轉(zhuǎn)換為 Envoy 配置,然后將 Envoy 配置信息發(fā)送給相關(guān) Envoy 代理,包括內(nèi)部的 Envoy 和 IngressGateway 中的 Envoy。
注意:這里不要混淆 IngressGateway 與 Gateway,Gateway 資源是用于配置 IngressGateway 的一種 Kubernetes 的自定義資源。
由于不必在 Kubernetes pod 或部署中聲明容器端口,因此我們不必在 IngressGateway Deployment 中聲明端口。但是,如果查看部署內(nèi)部,可以看到聲明的許多端口。另外,在 IngressGateway 部署中需要關(guān)注 SSL 證書,為了能夠訪問 Gateway 資源內(nèi)的證書,請確保已正確加載這些證書。
6
? ?
網(wǎng)關(guān)資源
網(wǎng)關(guān)資源用來配置 Envoy 的端口,前面的示例中已經(jīng)使用該服務(wù)公開了三個(gè)端口,因此需要在 Envoy 中處理這些端口。此外,可以通過聲明一個(gè)或多個(gè) Gateways 來支持多端口能力。下面的示例中使用單個(gè) Gateway,但可以分為兩個(gè)或三個(gè)分別定義:
apiVersion:?networking.istio.io/v1alpha3 kind:?Gateway metadata:name:?default-gatewaynamespace:?istio-system spec:selector:istio:?ingressgatewayservers:-?hosts:-?'*'port:name:?httpnumber:?80protocol:?HTTP-?hosts:-?'*'port:name:?httpsnumber:?443protocol:?HTTPStls:mode:?SIMPLEprivateKey:?/etc/istio/ingressgateway-certs/tls.keyserverCertificate:?/etc/istio/ingressgateway-certs/tls.crt-?hosts:?#?For?TCP?routing?this?fields?seems?to?be?ignored,?but?it?is?matched-?'*'??#?with?the?VirtualService,?I?use?*?since?it?will?match?anything.port:name:?mysqlnumber:?3306protocol:?TCP7
? ?
網(wǎng)關(guān)虛擬服務(wù)
VirtualService 資源與 Gateway 資源相互配合支持 Envoy 的配置。下面是一個(gè)支持 HTTP 服務(wù)的網(wǎng)關(guān)虛擬服務(wù)的基本配置:
apiVersion:?networking.istio.io/v1alpha3 kind:?VirtualService metadata:name:?counter spec:gateways:-?default-gateway.istio-system.svc.cluster.localhosts:-?counter.lab.example.comhttp:-?match:-?uri:prefix:?/route:-?destination:host:?counterport:number:?80現(xiàn)在,當(dāng)我們添加一個(gè) Gateway 和一個(gè) VirtualService 時(shí),路由已在 Envoy 配置中創(chuàng)建。要查看此內(nèi)容,你可以使用如下命令:
kubectl?port-forward?istio-ingressgateway-xxxx-yyyy-n?istio-system?15000通過訪問地址 http://localhost:15000/config_dump來查看配置。8
? ?
調(diào)試入口網(wǎng)關(guān)
調(diào)試網(wǎng)絡(luò)問題有時(shí)很困難,所以這里總結(jié)一些有用的命令用于調(diào)試。端口轉(zhuǎn)發(fā)到第一個(gè) istio-ingressgateway pod:
kubectl?-n?istio-system?port-forward?$(kubectl?-n?istio-system?get?pods?-listio=ingressgateway?-o=jsonpath="{.items[0].metadata.name}")?15000然后,可以從端口轉(zhuǎn)發(fā)的入口網(wǎng)關(guān) pod 中獲得 http 路由:
Curl?--silent?http://localhost:15000/config_dump?|jq?.configs[3].dynamic_route_configs[].route_config.virtual_hosts[]端口轉(zhuǎn)發(fā)的入口網(wǎng)關(guān)pod
查看上述端口轉(zhuǎn)發(fā)的入口網(wǎng)關(guān) pod 的日志信息:
查看 Pilot pod 的日志信息:
kubectl?-n?istio-system?logs?$(kubectl?-n?istio-system?get?pods?-listio=pilot?-o=jsonpath="{.items[0].metadata.name}")?discovery?--tail=300當(dāng)啟動(dòng)端口轉(zhuǎn)發(fā)到入口網(wǎng)關(guān) istio-ingressgateway 之后,可以執(zhí)行更多操作以獲取更多信息,例如:
要查看 Envoy 偵聽器,請到如下網(wǎng)址瀏覽:http://localhost:15000/listeners ( http://localhost:15000/listeners )。
要打開更詳細(xì)的日志記錄,請到如下網(wǎng)址:http://localhost:15000/logging ( http://localhost:15000/logging )。
可以在根目錄 http://localhost:15000/中找到更多信息。
9
? ?
福利時(shí)間
看過了Istio的原理與功能的介紹,想必大家也有了一定的了解,為了幫助大家更好的學(xué)習(xí)與理解Istio的技術(shù),中生代技術(shù)聯(lián)合機(jī)械工業(yè)華章圖書給大家?guī)砀@?/p>
《Istio服務(wù)網(wǎng)格技術(shù)解析與實(shí)踐》
推薦語:
Gartner認(rèn)為,2020年服務(wù)網(wǎng)格將成為所有領(lǐng)先的容器管理系統(tǒng)的標(biāo)配技術(shù)。本書適合所有對微服務(wù)和云原生感興趣的讀者,推薦大家對本書進(jìn)行深入的閱讀。
送書規(guī)則:2020年4月30日13:30前在留言區(qū),分享你在學(xué)習(xí)Istion技術(shù)的學(xué)習(xí)與踩坑經(jīng)驗(yàn)、或者對新技術(shù)的更新、迭代有何獨(dú)特的個(gè)人見解,精選留言點(diǎn)贊1-5名各送出此書一本。
注:獲得贈(zèng)書資格的讀者須于8小時(shí)內(nèi)聯(lián)系小編發(fā)送詳細(xì)收貨信息,逾期則視為主動(dòng)放棄。
想要加入中生代架構(gòu)群的小伙伴,請?zhí)砑尤汉匣锶?strong>大白的微信
申請備注(姓名+公司+技術(shù)方向)才能通過哦!
? ?END ? ?? #接力技術(shù),鏈接價(jià)值#精彩推薦1.?阿里P9專家右軍:以終為始的架構(gòu)設(shè)計(jì)2.?蘇寧金服技術(shù)大揭秘:支付決策機(jī)器人 3.?手哥架構(gòu)寶典系列:支付系統(tǒng)1.0架構(gòu)演進(jìn) 4.?手哥架構(gòu)寶典系列:支付系統(tǒng)2.0架構(gòu)演進(jìn)漫畫推薦1.?漫畫:程序員和產(chǎn)品經(jīng)理撕得真是太太太太厲害了 2.?漫畫:程序員真的是太太太太太太太太難了!3.?漫畫:普通程序員 vs 優(yōu)秀程序員 4.?漫畫:35歲的IT何去何從? 5.?漫畫:從修燈泡來看各種 IT 崗位,你是哪一種? 6. 漫畫:一批90后已經(jīng)30歲了,更扎心的是…7. 圖解:這才是程序員加班的真正原因!8.?漫畫:中國互聯(lián)網(wǎng)往事(2000-2020)總結(jié)
以上是生活随笔為你收集整理的阿里高专王夕宁:Istio网关之南北向流量管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 追根溯源 - 数据中台概念的起源
- 下一篇: mysql数据库配置文件my.ini