Istio是啥?一文帶你徹底了解!
如果你比較關(guān)注新興技術(shù)的話,那么很可能在不同的地方聽說過 Istio,并且知道它和 Service Mesh 有著牽扯。
這篇文章可以作為了解 Istio 的入門介紹,了解什么是 Istio,Istio 為什么最近這么火,以及 Istio 能給我們帶來(lái)什么好處。
什么是 Istio?
官方對(duì) Istio 的介紹濃縮成了一句話:
An open platform to connect, secure, control and observe services.
翻譯過來(lái),就是”連接、安全加固、控制和觀察服務(wù)的開放平臺(tái)“。開放平臺(tái)就是指它本身是開源的,服務(wù)對(duì)應(yīng)的是微服務(wù),也可以粗略地理解為單個(gè)應(yīng)用。
中間的四個(gè)動(dòng)詞就是 Istio 的主要功能,官方也各有一句話的說明。這里再闡釋一下:
- 連接(Connect):智能控制服務(wù)之間的調(diào)用流量,能夠?qū)崿F(xiàn)灰度升級(jí)、AB 測(cè)試和紅黑部署等功能
- 安全加固(Secure):自動(dòng)為服務(wù)之間的調(diào)用提供認(rèn)證、授權(quán)和加密。
- 控制(Control):應(yīng)用用戶定義的 policy,保證資源在消費(fèi)者中公平分配。
- 觀察(Observe):查看服務(wù)運(yùn)行期間的各種數(shù)據(jù),比如日志、監(jiān)控和 tracing,了解服務(wù)的運(yùn)行情況。
雖然聽起來(lái)非常高級(jí),功能非常強(qiáng)大,但是一股腦出現(xiàn)這么多名詞,還都是非常虛的概念,說了跟沒說一樣。要想理解上面這幾句話的含義,我們還是從頭說起,先聊聊 Service Mesh。
NOTE:其實(shí) Istio 的源頭是微服務(wù),但這又是一個(gè)比較大的話題,目前可以參考網(wǎng)絡(luò)上各種文章。如果有機(jī)會(huì),我們?cè)賮?lái)聊聊微服務(wù)。
什么是 Service Mesh
一般介紹 Service Mesh 的文章都會(huì)從網(wǎng)絡(luò)層的又一個(gè)抽象說起,把 Service Mesh 看做建立在 TCP 層之上的微服務(wù)層。我這次換個(gè)思路,從 Service Mesh 的技術(shù)根基——網(wǎng)絡(luò)代理來(lái)分析。
說起網(wǎng)絡(luò)代理,我們會(huì)想到翻墻,如果對(duì)軟件架構(gòu)比較熟悉的會(huì)想到 Nginx 等反向代理軟件。
其實(shí)網(wǎng)絡(luò)代理的范圍比較廣,可以肯定的說,有網(wǎng)絡(luò)訪問的地方就會(huì)有代理的存在。
Wikipedia 對(duì)代理的定義如下:
- In computer networks, a proxy server is a server (a computer system or an application) that acts as an intermediary for requests from clients seeking resources from other servers.
NOTE:代理可以是嵌套的,也就是說通信雙方 A、B 中間可以多多層代理,而這些代理的存在有可能對(duì) A、B 是透明的。
簡(jiǎn)單來(lái)說,網(wǎng)絡(luò)代理可以簡(jiǎn)單類比成現(xiàn)實(shí)生活中的中介,本來(lái)需要通信的雙方因?yàn)楦鞣N原因在中間再加上一道關(guān)卡。本來(lái)雙方就能完成的通信,為何非要多此一舉呢?
那是因?yàn)榇砜梢詾檎麄€(gè)通信帶來(lái)更多的功能,比如:
- 攔截:代理可以選擇性攔截傳輸?shù)木W(wǎng)絡(luò)流量,比如一些公司限制員工在上班的時(shí)候不能訪問某些游戲或者電商網(wǎng)站,再比如把我們和世界隔離開來(lái)的 GFW,還有在數(shù)據(jù)中心中拒絕惡意訪問的網(wǎng)關(guān)。
- 統(tǒng)計(jì):既然所有的流量都經(jīng)過代理,那么代理也可以用來(lái)統(tǒng)計(jì)網(wǎng)絡(luò)中的數(shù)據(jù)信息,比如了解哪些人在訪問哪些網(wǎng)站,通信的應(yīng)答延遲等。
- 緩存:如果通信雙方比較”遠(yuǎn)“,訪問比較慢,那么代理可以把最近訪問的數(shù)據(jù)緩存在本地,后面的訪問不用訪問后端來(lái)做到加速。CDN 就是這個(gè)功能的典型場(chǎng)景。
- 分發(fā):如果某個(gè)通信方有多個(gè)服務(wù)器后端,代理可以根據(jù)某些規(guī)則來(lái)選擇如何把流量發(fā)送給多個(gè)服務(wù)器,也就是我們常說的負(fù)載均衡功能,比如著名的 Nginx 軟件。
- 跳板:如果 A、B 雙方因?yàn)槟承┰虿荒苤苯釉L問,而代理可以和雙方通信,那么通過代理,雙方可以繞過原來(lái)的限制進(jìn)行通信。這應(yīng)該是廣大中國(guó)網(wǎng)民比較熟悉的場(chǎng)景。
- 注入:既然代理可以看到流量,那么它也可以修改網(wǎng)絡(luò)流量,可以自動(dòng)在收到的流量中添加一些數(shù)據(jù),比如有些寬帶提供商的彈窗廣告。
- ……
不是要講 Service Mesh 嗎?為什么扯了一堆代理的事情?因?yàn)?Service Mesh 可以看做是傳統(tǒng)代理的升級(jí)版,用來(lái)解決現(xiàn)在微服務(wù)框架中出現(xiàn)的問題,可以把 Service Mesh 看做是分布式的微服務(wù)代理。
在傳統(tǒng)模式下,代理一般是集中式的單獨(dú)的服務(wù)器,所有的請(qǐng)求都要先通過代理,然后再流入轉(zhuǎn)發(fā)到實(shí)際的后端。
而在 Service Mesh 中,代理變成了分布式的,它常駐在了應(yīng)用的身邊(最常見的就是 Kubernetes Sidecar 模式,每一個(gè)應(yīng)用的 Pod 中都運(yùn)行著一個(gè)代理,負(fù)責(zé)流量相關(guān)的事情)。
這樣的話,應(yīng)用所有的流量都被代理接管,那么這個(gè)代理就能做到上面提到的所有可能的事情,從而帶來(lái)無(wú)限的想象力。
此外,原來(lái)的代理都是基于網(wǎng)絡(luò)流量的,一般都是工作在 IP 或者 TCP 層,很少關(guān)心具體的應(yīng)用邏輯。
但是 Service Mesh 中,代理會(huì)知道整個(gè)集群的所有應(yīng)用信息,并且額外添加了熱更新、注入服務(wù)發(fā)現(xiàn)、降級(jí)熔斷、認(rèn)證授權(quán)、超時(shí)重試、日志監(jiān)控等功能,讓這些通用的功能不必每個(gè)應(yīng)用都自己實(shí)現(xiàn),放在代理中即可。
換句話說,Service Mesh 中的代理對(duì)微服務(wù)中的應(yīng)用做了定制化的改進(jìn)!
就這樣,借著微服務(wù)和容器化的東風(fēng),傳統(tǒng)的代理?yè)u身一變,成了如今炙手可熱的 Service Mesh。
應(yīng)用微服務(wù)之后,每個(gè)單獨(dú)的微服務(wù)都會(huì)有很多副本,而且可能會(huì)有多個(gè)版本,這么多微服務(wù)之間的相互調(diào)用和管理非常復(fù)雜,但是有了 Service Mesh,我們可以把這塊內(nèi)容統(tǒng)一在代理層。
有了看起來(lái)四通八達(dá)的分布式代理,我們還需要對(duì)這些代理進(jìn)行統(tǒng)一的管理。
手動(dòng)更新每個(gè)代理的配置,對(duì)代理進(jìn)行升級(jí)或者維護(hù)是個(gè)不可持續(xù)的事情,在前面的基礎(chǔ)上,在加上一個(gè)控制中心,一個(gè)完整的 Service Mesh 就成了。
管理員只需要根據(jù)控制中心的 API 來(lái)配置整個(gè)集群的應(yīng)用流量、安全規(guī)則即可,代理會(huì)自動(dòng)和控制中心打交道根據(jù)用戶的期望改變自己的行為。
NOTE:所以你也可以理解 Service Mesh 中的代理會(huì)搶了 Nginx 的生意,這也是為了 Nginx 也要開始做 NginMesh 的原因。
再來(lái)看 Istio
了解了 Service Mesh 的概念,我們?cè)賮?lái)看 Istio ,也許就會(huì)清楚很多。首先來(lái)看 Istio 官方給出的架構(gòu)圖:
可以看到,Istio 就是我們上述提到的 Service Mesh 架構(gòu)的一種實(shí)現(xiàn),服務(wù)之間的通信(比如這里的 Service A 訪問 Service B)會(huì)通過代理(默認(rèn)是 Envoy)來(lái)進(jìn)行。
而且中間的網(wǎng)絡(luò)協(xié)議支持 HTTP/1.1,HTTP/2,gRPC 或者 TCP,可以說覆蓋了主流的通信協(xié)議。
控制中心做了進(jìn)一步的細(xì)分,分成了 Pilot、Mixer 和 Citadel,它們的各自功能如下:
- Pilot:為 Envoy 提供了服務(wù)發(fā)現(xiàn),流量管理和智能路由(AB 測(cè)試、金絲雀發(fā)布等),以及錯(cuò)誤處理(超時(shí)、重試、熔斷)功能。
用戶通過 Pilot 的 API 管理網(wǎng)絡(luò)相關(guān)的資源對(duì)象,Pilot 會(huì)根據(jù)用戶的配置和服務(wù)的信息把網(wǎng)絡(luò)流量管理變成 Envoy 能識(shí)別的格式分發(fā)到各個(gè) Sidecar 代理中。
- Mixer:為整個(gè)集群執(zhí)行訪問控制(哪些用戶可以訪問哪些服務(wù))和 Policy 管理(Rate Limit,Quota 等),并且收集代理觀察到的服務(wù)之間的流量統(tǒng)計(jì)數(shù)據(jù)。
- Citadel:為服務(wù)之間提供認(rèn)證和證書管理,可以讓服務(wù)自動(dòng)升級(jí)成 TLS 協(xié)議。
代理會(huì)和控制中心通信,一方面可以獲取需要的服務(wù)之間的信息,另一方面也可以匯報(bào)服務(wù)調(diào)用的 Metrics 數(shù)據(jù)。
知道了 Istio 的核心架構(gòu),再來(lái)看看它的功能描述就非常容易理解了:
- 連接:控制中心可以從集群中獲取所有服務(wù)的信息,并分發(fā)給代理,這樣代理就能根據(jù)用戶的期望來(lái)完成服務(wù)之間的通信(自動(dòng)地服務(wù)發(fā)現(xiàn)、負(fù)載均衡、流量控制等)。
- 安全加固:因?yàn)樗械牧髁慷际峭ㄟ^代理的,那么代理接收到不加密的網(wǎng)絡(luò)流量之后,可以自動(dòng)做一次封裝,把它升級(jí)成安全的加密流量。
- 控制:用戶可以配置各種規(guī)則(比如 RBAC 授權(quán)、白名單、Rate Limit 或者 Quota 等),當(dāng)代理發(fā)現(xiàn)服務(wù)之間的訪問不符合這些規(guī)則,就直接拒絕掉。
- 觀察:所有的流量都經(jīng)過代理,因此代理對(duì)整個(gè)集群的訪問情況知道得一清二楚,它把這些數(shù)據(jù)上報(bào)到控制中心,那么管理員就能觀察到整個(gè)集群的流量情況了
Istio 解決什么問題
雖然看起來(lái)非常炫酷,功能也很強(qiáng)大,但是一個(gè)架構(gòu)和產(chǎn)品出來(lái)都是要解決具體的問題。所以這部分我們來(lái)看看微服務(wù)架構(gòu)中的難題以及 Istio 給出的答案。
首先,原來(lái)的單個(gè)應(yīng)用拆分成了許多分散的微服務(wù),它們之間相互調(diào)用才能完成一個(gè)任務(wù),而一旦某個(gè)過程出錯(cuò)(組件越多,出錯(cuò)的概率也就越大),就非常難以排查。
用戶請(qǐng)求出現(xiàn)問題無(wú)外乎兩個(gè)問題:錯(cuò)誤和響應(yīng)慢。如果請(qǐng)求錯(cuò)誤,那么我們需要知道那個(gè)步驟出錯(cuò)了,這么多的微服務(wù)之間的調(diào)用怎么確定哪個(gè)有調(diào)用成功?哪個(gè)沒有調(diào)用成功呢?
如果是請(qǐng)求響應(yīng)太慢,我們就需要知道到底哪些地方比較慢?整個(gè)鏈路的調(diào)用各階段耗時(shí)是多少?哪些調(diào)用是并發(fā)執(zhí)行的,哪些是串行的?這些問題需要我們能非常清楚整個(gè)集群的調(diào)用以及流量情況。
此外,微服務(wù)拆分成這么多組件,如果單個(gè)組件出錯(cuò)的概率不變,那么整體有地方出錯(cuò)的概率就會(huì)增大。服務(wù)調(diào)用的時(shí)候如果沒有錯(cuò)誤處理機(jī)制,那么會(huì)導(dǎo)致非常多的問題。
比如如果應(yīng)用沒有配置超時(shí)參數(shù),或者配置的超時(shí)參數(shù)不對(duì),則會(huì)導(dǎo)致請(qǐng)求的調(diào)用鏈超時(shí)疊加,對(duì)于用戶來(lái)說就是請(qǐng)求卡住了。
如果沒有重試機(jī)制,那么因?yàn)楦鞣N原因?qū)е碌呐及l(fā)故障也會(huì)導(dǎo)致直接返回錯(cuò)誤給用戶,造成不好的用戶體驗(yàn)。
此外,如果某些節(jié)點(diǎn)異常(比如網(wǎng)絡(luò)中斷,或者負(fù)載很高),也會(huì)導(dǎo)致應(yīng)用整體的響應(yīng)時(shí)間變長(zhǎng),集群服務(wù)應(yīng)該能自動(dòng)避開這些節(jié)點(diǎn)上的應(yīng)用。
最后,應(yīng)用也是會(huì)出現(xiàn) Bug 的,各種 Bug 會(huì)導(dǎo)致某些應(yīng)用不可訪問。這些問題需要每個(gè)應(yīng)用能及時(shí)發(fā)現(xiàn)問題,并做好對(duì)應(yīng)的處理措施。
應(yīng)用數(shù)量的增多,對(duì)于日常的應(yīng)用發(fā)布來(lái)說也是個(gè)難題。應(yīng)用的發(fā)布需要非常謹(jǐn)慎,如果應(yīng)用都是一次性升級(jí)的,出現(xiàn)錯(cuò)誤會(huì)導(dǎo)致整個(gè)線上應(yīng)用不可用,影響范圍太大。
而且,很多情況我們需要同時(shí)存在不同的版本,使用 AB 測(cè)試驗(yàn)證哪個(gè)版本更好。
如果版本升級(jí)改動(dòng)了 API,并且互相有依賴,那么我們還希望能自動(dòng)地控制發(fā)布期間不同版本訪問不同的地址。這些問題都需要智能的流量控制機(jī)制。
為了保證整個(gè)系統(tǒng)的安全性,每個(gè)應(yīng)用都需要實(shí)現(xiàn)一套相似的認(rèn)證、授權(quán)、HTTPS、限流等功能。
一方面大多數(shù)的程序員都對(duì)安全相關(guān)的功能并不擅長(zhǎng)或者感興趣,另外這些完全相似的內(nèi)容每次都要實(shí)現(xiàn)一遍是非常冗余的。這個(gè)問題需要一個(gè)能自動(dòng)管理安全相關(guān)內(nèi)容的系統(tǒng)。
上面提到的這些問題是不是非常熟悉?它們就是 Istio 嘗試解決的問題,如果把上面的問題和 Istio 提供的功能做個(gè)映射,你會(huì)發(fā)現(xiàn)它們非常匹配,畢竟 Istio 就是為了解決微服務(wù)的這些問題才出現(xiàn)的。
用什么姿勢(shì)接入 Istio?
雖然 Istio 能解決那么多的問題,但是引入 Istio 并不是沒有代價(jià)的。最大的問題是 Istio 的復(fù)雜性,強(qiáng)大的功能也意味著 Istio 的概念和組件非常多,要想理解和掌握 Istio ,并成功在生產(chǎn)環(huán)境中部署需要非常詳細(xì)的規(guī)劃。
一般情況下,集群管理團(tuán)隊(duì)需要對(duì) Kubernetes 非常熟悉,了解常用的使用模式,然后采用逐步演進(jìn)的方式把 Istio 的功能分批掌控下來(lái)。
第一步,自然是在測(cè)試環(huán)境搭建一套 Istio 的集群,理解所有的核心概念和組件。
了解 Istio 提供的接口和資源,知道它們的用處,思考如何應(yīng)用到自己的場(chǎng)景中,然后是熟悉 Istio 的源代碼,跟進(jìn)社區(qū)的 Issues,了解目前還存在的 Issues 和 Bug,思考如何規(guī)避或者修復(fù)。
這一步是基礎(chǔ),需要積累到 Istio 安裝部署、核心概念、功能和缺陷相關(guān)的知識(shí),為后面做好準(zhǔn)備。
第二步,可以考慮接入 Istio 的觀察性功能,包括 Logging、Tracing、Metrics 數(shù)據(jù)。
應(yīng)用部署到集群中,選擇性地(一般是流量比較小,影響范圍不大的應(yīng)用)為一些應(yīng)用開啟 Istio 自動(dòng)注入功能,接管應(yīng)用的流量,并安裝 Prometheus 和 Zipkin 等監(jiān)控組件,收集系統(tǒng)所有的監(jiān)控?cái)?shù)據(jù)。
這一步可以試探性地了解 Istio 對(duì)應(yīng)用的性能影響,同時(shí)建立服務(wù)的性能測(cè)試基準(zhǔn),發(fā)現(xiàn)服務(wù)的性能瓶頸,幫助快速定位應(yīng)用可能出現(xiàn)的問題。
此時(shí),這些功能可以是對(duì)應(yīng)用開發(fā)者透明的,只需要集群管理員感知,這樣可以減少可能帶來(lái)的風(fēng)險(xiǎn)。
第三步,為應(yīng)用配置 Time Out 超時(shí)參數(shù)、自動(dòng)重試、熔斷和降級(jí)等功能,增加服務(wù)的容錯(cuò)性。
這樣可以避免某些應(yīng)用錯(cuò)誤進(jìn)行這些配置導(dǎo)致問題的出現(xiàn),這一步完成后需要通知所有的應(yīng)用開發(fā)者刪除掉在應(yīng)用代碼中對(duì)應(yīng)的處理邏輯。這一步需要開發(fā)者和集群管理員同時(shí)參與。
第四步,和 Ingress、Helm、應(yīng)用上架等相關(guān)組件和流程對(duì)接,使用 Istio 接管應(yīng)用的升級(jí)發(fā)布流程。
讓開發(fā)者可以配置應(yīng)用灰度發(fā)布升級(jí)的策略,支持應(yīng)用的藍(lán)綠發(fā)布、金絲雀發(fā)布以及 AB 測(cè)試。
第五步,接入安全功能。配置應(yīng)用的 TLS 互信,添加 RBAC 授權(quán),設(shè)置應(yīng)用的流量限制,提升整個(gè)集群的安全性。
因?yàn)榘踩膯栴}配置比較繁瑣,而且優(yōu)先級(jí)一般會(huì)比功能性相關(guān)的特性要低,所以這里放在了最后。
當(dāng)然這個(gè)步驟只是一個(gè)參考,每個(gè)公司需要根據(jù)自己的情況、人力、時(shí)間和節(jié)奏來(lái)調(diào)整,找到適合自己的方案。
總結(jié)
Istio 的架構(gòu)在數(shù)據(jù)中心和集群管理中非常常見,每個(gè) Agent 分布在各個(gè)節(jié)點(diǎn)上(可以是服務(wù)器、虛擬機(jī)、Pod、容器)負(fù)責(zé)接收指令并執(zhí)行,以及匯報(bào)信息。
控制中心負(fù)責(zé)匯聚整個(gè)集群的信息,并提供 API 讓用戶對(duì)集群進(jìn)行管理。
Kubernetes 也是類似的架構(gòu),SDN(Software Defined Network) 也是如此。
相信以后會(huì)有更多類似架構(gòu)的出現(xiàn),這是因?yàn)閿?shù)據(jù)中心要管理的節(jié)點(diǎn)越來(lái)越多,我們需要把任務(wù)執(zhí)行分布到各節(jié)點(diǎn)(Agent 負(fù)責(zé)的功能)。
同時(shí)也需要對(duì)整個(gè)集群進(jìn)行管理和控制(Control Plane 的功能),完全去中心化的架構(gòu)是無(wú)法滿足后面這個(gè)要求的。
Istio 的出現(xiàn)為負(fù)責(zé)的微服務(wù)架構(gòu)減輕了很多的負(fù)擔(dān),開發(fā)者不用關(guān)心服務(wù)調(diào)用的超時(shí)、重試、Rate Limit 的實(shí)現(xiàn),服務(wù)之間的安全、授權(quán)也自動(dòng)得到了保證。
集群管理員也能夠很方便地發(fā)布應(yīng)用(AB 測(cè)試和灰度發(fā)布),并且能清楚看到整個(gè)集群的運(yùn)行情況。
但是這并不表明有了 Istio 就可以高枕無(wú)憂了,Istio 只是把原來(lái)分散在應(yīng)用內(nèi)部的復(fù)雜性統(tǒng)一抽象出來(lái)放到了統(tǒng)一的地方,并沒有讓原來(lái)的復(fù)雜消失不見。
因此我們需要維護(hù) Istio 整個(gè)集群,而 Istio 的架構(gòu)比較復(fù)雜,尤其是它一般還需要架在 Kubernetes 之上,這兩個(gè)系統(tǒng)都比較復(fù)雜,而且它們的穩(wěn)定性和性能會(huì)影響到整個(gè)集群。
因此再采用 Isito 之前,必須做好清楚的規(guī)劃,權(quán)衡它帶來(lái)的好處是否遠(yuǎn)大于額外維護(hù)它的花費(fèi),需要有相關(guān)的人才對(duì)整個(gè)網(wǎng)絡(luò)、Kubernetes 和 Istio 都比較了解才行。
參考資料:
- Istio / What is Istio?:istio 官網(wǎng)上對(duì) istio 進(jìn)行介紹的文檔
- Pattern:Service Mesh:service mesh pattern 詳解的文章