本文最初發表於Rinor Maloku的個人站點,經原作者授權由InfoQ中文站翻譯分享。
Istio是一個開源項目,由來自Google、IBM和Lyft團隊協作開發,它爲一組特定的問題提供瞭解決方案,要理解這個解決方案,我們就要明白這些問題到底是什麼。當從單體架構遷移到基於微服務的應用時,會帶來很多的複雜性,舉例來說:
- 流量管理(Traffic management):超時、重試、負載均衡;
- 安全性(Security):終端用戶的認證和授權;
- 可觀察性(Observability):跟蹤、監控和日誌。
這些問題都可以在應用層解決,但這樣的話,你的服務就無法稱其爲“微”了,實現這些功能所出的努力都會對公司的資源帶來一定的壓力,而這些資源本來是可以用來交付業務價值的。我們舉個例子:
PM:如果增加一個反饋的特性,預計需要多長時間?
Dev:兩個sprint。
PM:什麼?!這只是一個簡單的CURD!
Dev:創建CURD的功能是非常簡單的,但是我們需要對用戶和服務進行認證和授權。而且因爲網絡不可靠,我們需要在客戶端實現重試和斷路器,爲了避免整個系統出現停止響應的情況,我們還需要超時和艙壁模式,除此之外,爲了探測出現的問題,我們還需要監控、跟蹤……
PM:好吧,那就把這個特性放到Product服務中吧!
到這裏,你可能已經發現,針對每個服務,所有的過程和努力必須都要再來一遍,對我們來說,添加一個服務是一項巨大的任務。在本文中,我們將會展示Istio如何幫助我們移除服務中的這些橫切性關注點。
注意:本文假設你已經對Kubernetes有了一定的瞭解,如果事實並非如此的話,建議你閱讀一下我所撰寫的Kubernetes入門介紹,然後繼續閱讀本文。
Istio的理念
在沒有Istio的時候,某個服務會直接發起對另一個服務的訪問,如果出現失敗的話,這個服務需要作出的處理包括重試、超時以及打開斷路器等等。
Istio提供了一個非常巧妙的方案,它能夠從服務中完全分離出來,只攔截所有的網絡通信來發揮作用。通過這種方式,它能夠實現如下功能:
- 容錯:當請求失敗和重試的時候,使用它能夠理解的響應狀態碼;
- 金絲雀發佈:只將特定百分比的請求轉發到服務的新版本上;
- 監控和指標:統計服務響應所耗費的時間;
- 跟蹤和可觀察性:它在每個請求上添加了一個特殊的頭部信息,並在集羣中跟蹤它們;
- 安全性:抽取JWT Token並對用戶進行認證和授權。
上面所提及的功能(僅僅是很少的一部分)只是爲了提起你的興趣,接下來,我們會討論技術細節。
Istio的架構
Istio會攔截所有的網絡流量,並且會在每個pod上以sidecar的形式注入一個智能代理,從而能夠應用一組特定的規則。讓所有特性生效的代理是由數據平面(Data Plane) 組成的,而數據平面是由控制平面(Control Plane)動態配置的。
數據平面
注入的代理能夠讓Istio很容易地滿足我們的需求。舉例來說,我們看一下重試和斷路器功能。
簡單總結一下:
- Envoy發送請求給服務B的第一個實例,不過調用失敗了;
- Envoy Sidecar會進行重試;(1)
- 失敗的請求返回發起調用的代理;
- 開啓斷路器並在隨後的請求中調用下一個服務。(2)
這意味着我們不需要使用額外的重試庫,也不需要使用各種各樣的語言實現斷路器和服務發現功能。這些特性都是由Istio所提供的,我們不需要任何的代碼修改。
我想現在你應該已經想要加入Istio的旅程了,但是依然有一些疑慮,有些問題依然沒有得到解答。你可能會想,它是一個適用於所有場景的解決方案嗎?通常來講,適用所有場景意味着難以非常好地適用任何場景。
你可能會默默地問一句:“它是可配置的嗎?”
朋友們,歡迎加入我們的旅程,接下來我會爲你介紹控制平面。
控制平面
控制平面由三個組件組成:Pilot、Mixer和Citadel,它們組合配置Envoy以便於路由流量、執行策略和收集遙測數據。它們的可視化展現如下圖所示。
Envoy(也就是數據平面)會由Istio規定的Kubernetes自定義資源定義(Kubernetes Custom Resource Definition)來進行配置,這些定義是專門爲了實現該目的的。這就是說,對你而言,它只是具有熟悉語法的Kubernetes資源而已。在創建之後,控制平面會獲取到它,並將其用到Envoy上。
服務與Istio的關係
我們已經描述了Istio與服務之間的關係,但是回過頭來看一下,我們的服務與Istio之間是什麼關係呢?
坦白講,你的服務僅僅需要知道Istio存在就足夠了,就像魚和水一樣,魚可能會問“水到底是什麼呢”?
我們可以選取一個可運行的集羣,在安裝Istio組件之後,集羣中的服務依然能夠繼續運行,我們可以按照相同的方式將組件移除掉,所有的事情都能正常運行,只不多我們失去了Istio所提供的功能而已。
我們已經講了太多的理論,接下來的內容我們將知識轉化爲實踐。