通過Istio重新實現微服務 (一):認識 Istio

本文最初發表於Rinor Maloku的個人站點,經原作者授權由InfoQ中文站翻譯分享。

Istio是一個開源項目,由來自Google、IBM和Lyft團隊協作開發,它爲一組特定的問題提供瞭解決方案,要理解這個解決方案,我們就要明白這些問題到底是什麼。當從單體架構遷移到基於微服務的應用時,會帶來很多的複雜性,舉例來說:

  • 流量管理(Traffic management):超時、重試、負載均衡;
  • 安全性(Security):終端用戶的認證和授權;
  • 可觀察性(Observability):跟蹤、監控和日誌。

這些問題都可以在應用層解決,但這樣的話,你的服務就無法稱其爲“微”了,實現這些功能所出的努力都會對公司的資源帶來一定的壓力,而這些資源本來是可以用來交付業務價值的。我們舉個例子:

PM:如果增加一個反饋的特性,預計需要多長時間?

Dev:兩個sprint。

PM:什麼?!這只是一個簡單的CURD!

Dev:創建CURD的功能是非常簡單的,但是我們需要對用戶和服務進行認證和授權。而且因爲網絡不可靠,我們需要在客戶端實現重試和斷路器,爲了避免整個系統出現停止響應的情況,我們還需要超時和艙壁模式,除此之外,爲了探測出現的問題,我們還需要監控、跟蹤……

PM:好吧,那就把這個特性放到Product服務中吧!

到這裏,你可能已經發現,針對每個服務,所有的過程和努力必須都要再來一遍,對我們來說,添加一個服務是一項巨大的任務。在本文中,我們將會展示Istio如何幫助我們移除服務中的這些橫切性關注點。

圖1 構建一個微服務所需的繁瑣過程

注意:本文假設你已經對Kubernetes有了一定的瞭解,如果事實並非如此的話,建議你閱讀一下我所撰寫的Kubernetes入門介紹,然後繼續閱讀本文。

Istio的理念

在沒有Istio的時候,某個服務會直接發起對另一個服務的訪問,如果出現失敗的話,這個服務需要作出的處理包括重試、超時以及打開斷路器等等。

圖2 Kubernetes中的網絡流量

Istio提供了一個非常巧妙的方案,它能夠從服務中完全分離出來,只攔截所有的網絡通信來發揮作用。通過這種方式,它能夠實現如下功能:

  • 容錯:當請求失敗和重試的時候,使用它能夠理解的響應狀態碼;
  • 金絲雀發佈:只將特定百分比的請求轉發到服務的新版本上;
  • 監控和指標:統計服務響應所耗費的時間;
  • 跟蹤和可觀察性:它在每個請求上添加了一個特殊的頭部信息,並在集羣中跟蹤它們;
  • 安全性:抽取JWT Token並對用戶進行認證和授權。

上面所提及的功能(僅僅是很少的一部分)只是爲了提起你的興趣,接下來,我們會討論技術細節。

Istio的架構

Istio會攔截所有的網絡流量,並且會在每個pod上以sidecar的形式注入一個智能代理,從而能夠應用一組特定的規則。讓所有特性生效的代理是由數據平面(Data Plane) 組成的,而數據平面是由控制平面(Control Plane)動態配置的。

數據平面

注入的代理能夠讓Istio很容易地滿足我們的需求。舉例來說,我們看一下重試和斷路器功能。

圖3 Envoy是如何實現重試和斷路器的

簡單總結一下:

  1. Envoy發送請求給服務B的第一個實例,不過調用失敗了;
  2. Envoy Sidecar會進行重試;(1)
  3. 失敗的請求返回發起調用的代理;
  4. 開啓斷路器並在隨後的請求中調用下一個服務。(2)

這意味着我們不需要使用額外的重試庫,也不需要使用各種各樣的語言實現斷路器和服務發現功能。這些特性都是由Istio所提供的,我們不需要任何的代碼修改。

我想現在你應該已經想要加入Istio的旅程了,但是依然有一些疑慮,有些問題依然沒有得到解答。你可能會想,它是一個適用於所有場景的解決方案嗎?通常來講,適用所有場景意味着難以非常好地適用任何場景。

你可能會默默地問一句:“它是可配置的嗎?”

朋友們,歡迎加入我們的旅程,接下來我會爲你介紹控制平面。

控制平面

控制平面由三個組件組成:Pilot、Mixer和Citadel,它們組合配置Envoy以便於路由流量、執行策略和收集遙測數據。它們的可視化展現如下圖所示。

圖4 控制平面與數據平面的關係

Envoy(也就是數據平面)會由Istio規定的Kubernetes自定義資源定義(Kubernetes Custom Resource Definition)來進行配置,這些定義是專門爲了實現該目的的。這就是說,對你而言,它只是具有熟悉語法的Kubernetes資源而已。在創建之後,控制平面會獲取到它,並將其用到Envoy上。

服務與Istio的關係

我們已經描述了Istio與服務之間的關係,但是回過頭來看一下,我們的服務與Istio之間是什麼關係呢?

坦白講,你的服務僅僅需要知道Istio存在就足夠了,就像魚和水一樣,魚可能會問“水到底是什麼呢”?

圖5 水是什麼?本圖由Victoria Dimitrakopoulos繪製

我們可以選取一個可運行的集羣,在安裝Istio組件之後,集羣中的服務依然能夠繼續運行,我們可以按照相同的方式將組件移除掉,所有的事情都能正常運行,只不多我們失去了Istio所提供的功能而已。

我們已經講了太多的理論,接下來的內容我們將知識轉化爲實踐。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章