帶你玩轉Istio-第1篇---原理篇

 Kubernetes我們學了一個大概,現在學習Istio加深一下我們對Kubernetes的認識。

 

自本篇起,Istio 的學習之旅就正式開始了。本篇主要介紹 Istio 的功能特性及工作原理,呈現Istio豐富的流量治理、策略與遙測、訪問安全等功能,以及Sidecar機制和多集羣服務治理方面的內容。結合後面的實踐內容,讀者可以掌握 Istio 的使用方法,例如怎樣使用 Istio 的流量規則、怎樣配置安全策略、怎樣使用 Istio 的 Adapter 來做策略控制和收集服務運行的遙測數據等。

您好,Istio

本章簡要介紹Istio的一些背景知識,包括Istio是什麼、能幹什麼,以及Istio項目的誕生及發展歷史,並嘗試梳理Istio與微服務、服務網格、Kubernetes這幾個雲原生領域炙手可熱的技術概念的關係。希望讀者能通過本章對 Istio 有一個初步的認識,並帶着問題與思考進入後續的學習中。

Istio是什麼?

Istio是什麼?我們試着用迭代方式來說明。
◎ Istio是一個用於服務治理的開放平臺。
◎ Istio是一個Service Mesh形態的用於服務治理的開放平臺。
◎ Istio是一個與Kubernetes緊密結合的適用於雲原生場景的Service Mesh形態的用於服務治理的開放平臺。

這裏的關鍵字“治理”不侷限於“微服務治理”的範疇,任何服務,只要服務間有訪問,如果需要對服務間的訪問進行管理,就可以使用 Istio。根據 Istio 官方的介紹,服務治理涉及連接(Connect)、安全(Secure)、策略執行(Control)和可觀察性(Observe),如圖1-1所示。

◎ 連接:Istio 通過集中配置的流量規則控制服務間的流量和調用,實現負載均衡、熔斷、故障注入、重試、重定向等服務治理功能。
◎ 安全:Istio 提供透明的認證機制、通道加密、服務訪問授權等安全能力,可增強服務訪問的安全性。
◎ 策略執行:Istio 通過可動態插拔、可擴展的策略實現訪問控制、速率限制、配額管理、服務計費等能力。
◎ 可觀察性:動態獲取服務運行數據和輸出,提供強大的調用鏈、監控和調用日誌收集輸出的能力。配合可視化工具,可方便運維人員瞭解服務的運行狀況,發現並解決問題。

在 Istio 0.1 發佈時,Istio 官方的第 1 篇聲明(https://istio.io/blog/2017/0.1-announcement/)強調了Istio提供的重要能力。

◎ 服務運行可觀察性:監控應用及網絡相關數據,將相關指標與日誌記錄發送至任意收集、聚合與查詢系統中以實現功能擴展,追蹤分析性能熱點並對分佈式故障模式進行診斷。
◎ 彈性與效率:提供了統一的方法配置重試、負載均衡、流量控制和斷路器等來解決網絡可靠性低所造成的各類常見故障,更輕鬆地運維高彈性服務網格。
◎ 研發人員生產力:確保研發人員專注於基於已選擇的編程語言構建業務功能,不用在代碼中處理分佈式系統的問題,從而極大地提升生產能力。
◎ 策略驅動型運營:解耦開發和運維團隊的工作,在無須更改代碼的前提下提升安全性、監控能力、擴展性與服務拓撲水平。運營人員能夠不依賴開發提供的能力精確控制生產流量。
◎ 默認安全:允許運營人員配置TLS雙向認證並保護各服務之間的所有通信,並且開發人員和運維人員不用維護證書,以應對分佈式計算中經常存在的大量網絡安全問題。
◎ 增量適用:考慮到在網絡內運行的各服務的透明性,允許團隊按照自己的節奏和需求逐步使用各項功能,例如先觀察服務運行情況再進行服務治理等。

通過示例看看Istio能做什麼

首先看看 Istio 在服務訪問的過程中都做了什麼,簡單起見,這裏以一個天氣預報應用中forecast服務對recommendation服務的訪問爲例,如圖1-2所示。本書後面的大部分功能都會基於該應用來介紹。

                                                    圖1-2 Istio服務訪問示例

這個示例對兩個服務的業務代碼沒有任何要求,可以用任何語言開發。在這個示例中,forecast服務是用Node.js開發的,recommendation服務是用Java開發的。在forecast服務的代碼中通過域名訪問recommendation服務,在兩個服務中都不用包含任何服務訪問管理的邏輯。

我們看看Istio在其中都做了什麼:
◎ 自動通過服務發現獲取recommendation服務實例列表,並根據負載均衡策略選擇一個服務實例;
◎ 對服務雙方啓用雙向認證和通道加密;
◎ 如果某個服務實例連續訪問出錯,則可以將該實例隔離一段時間,以提高訪問質量;
◎ 設置最大連接數、最大請求數、訪問超時等對服務進行保護;

◎ 限流;
◎ 對請求進行重試;
◎ 修改請求中的內容;
◎ 將一定特徵的服務重定向;
◎ 灰度發佈;
◎ 自動記錄服務訪問信息;
◎ 記錄調用鏈,進行分佈式追蹤;
◎ 根據訪問數據形成完整的應用訪問拓撲;
◎……

所有這些功能,都不需要用戶修改代碼,用戶只需在 Istio 的控制面做些配置即可,並且動態生效。以灰度發現爲例,在 Istio 中是通過簡單配置實現灰度發佈的,其核心工作是實現兩個版本同時在線,並通過一定的流量策略將部分流量引到灰度版本上。我們無須修改代碼,只要簡單寫一個配置就可以對任意一個服務進行灰度發佈了:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: recommendation
spec:
  hosts:
  - recommendation
  http:
  - match:
    - headers:
        cookie:
          exact: "group=dev"
    route:
    - destination:
        name: v2
  - route:
    - destination:
        name: v1

Istio採用了與Kubernetes類似的語法風格,即使不瞭解語法細節,也很容易明白其功能大意:將 group是 dev的流量轉發到 recommendation服務的 v2版本,其他用戶還是訪問 recommendation服務的 v1版本,從而達到從 v1版本中切分少部分流量到灰度版本 v2的效果。對Istio提供的功能都進行類似配置即可,無須修改代碼,無須額外的組件支持,也無須其他前置和後置操作。

Istio與服務治理

Istio是一個服務治理平臺,治理的是服務間的訪問,只要有訪問就可以治理,不在乎這個服務是不是所謂的微服務,也不要求跑在其上的代碼是微服務化的。單體應用不滿足微服務的若干哲學,用Istio治理也是完全可以的。提起“服務治理”,大家最先想到的一定是“微服務的服務治理”,就讓我們從微服務的服務治理說起。

關於微服務

Martin Fowler對微服務的描述是“微服務是以一組小型服務來開發單個應用程序的方法,每個服務都運行在自己的進程中,服務間採用輕量級通信機制(通常用 HTTP 資源API)。這些服務圍繞業務能力構建並可通過全自動部署機制獨立部署,還共用一個最小型的集中式管理,可用不同的語言開發,並使用不同的數據存儲技術”,參見 https://martinfowler.com/articles/microservices.html。

可以看出,微服務在本質上還是分而治之、化繁爲簡的哲學智慧在計算機領域的一個體現。

如圖1-3所示,微服務將複雜的單體應用分解成若干小的服務,服務間使用輕量級的協議進行通信。

這種方式帶給我們很多好處:
◎ 從開發視角來看,每個微服務的功能更內聚,可以在微服務內設計和擴展功能,並且採用不同的開發語言及開發工具;
◎ 從運維視角來看,在微服務化後,每個微服務都在獨立的進程裏,可以自運維;更重要的是,微服務化是單一變更的基礎,迭代速度更快,上線風險更小;
◎ 從組織管理視角來看,將團隊按照微服務切分爲小組代替服務大組也有利於敏捷開發。

                                                                 圖1-3 微服務化

但是,微服務化也給開發和運維帶來很大的挑戰,因爲微服務化僅僅是一種分而治之的方法,業務本身的規模和複雜度並沒有變少,反而變多。如圖1-4所示,在分佈式系統中,網絡可靠性、通信安全、網絡時延、網絡拓撲變化等都成了我們要關注的內容。另外,微服務機制帶來了大量的工作,比如服務如何請求目標服務,需要引入服務發現和負載均衡等,以及對跨進程的分佈式調用棧進行分佈式調用鏈追蹤,等等。總之,簡單的事情突然變得複雜了。

                                                 圖1-4 微服務化帶來的分佈式問題

這就需要一些工具集來做一些通用的工作,包括服務註冊、服務發現、負載均衡等。在原來未微服務化的時候,單體應用的多模塊之間根本不需要進程間通信,也不需要服務發現。所以,我們將這些工具集理解爲用於解決微服務化帶來的新問題似乎更合理一些,但是這些工具集本身並沒有帶來更多的業務收益。

服務治理的三種形態

服務治理的演變至少經過一下三種形態。

第1中形態:在應用程序中包含治理邏輯
       在微服務化的過程中,將服務拆分後會發現一堆麻煩事兒,連基本的業務連通都成了問題。如圖1-5所示,在處理一些治理邏輯,比如怎麼找到對端的服務實例,怎麼選擇一個對端實例發出請求等時,都需要自己寫代碼來實現。這種方式簡單,對外部依賴少,但會導致存在大量的重複代碼。所以,微服務越多,重複的代碼越多,維護越難;而且,業務代碼和治理邏輯耦合,不管是對治理邏輯的全局升級,還是對業務的升級,都要改同一段代碼。

                              圖1-5 第1種形態:在應用程序中包含治理邏輯

第2中形態:治理邏輯獨立代碼

在解決第1種形態的問題時,我們很容易想到把治理的公共邏輯抽象成一個公共庫,讓所有微服務都使用這個公共庫。在將這些治理能力包含在開發框架中後,只要是用這種開發框架開發的代碼,就包含這種能力,這就是如圖 1-6 所示的 SDK 模式,非常典型的這種服務治理框架就是Spring Cloud。這種形態的治理工具集在過去一段時間裏得到了非常廣泛的應用。

                                            圖1-6 第2種形態:治理邏輯獨立的代碼

此外,SDK對開發人員來說有較高的學習門檻,雖然各種SDK都會講如何開箱即用,但如果只是因爲需要治理邏輯,就讓開發人員放棄自己熟悉的內容去學習一套新的語言和開發框架,可能代價有點大。

第3中形態:治理邏輯獨立的進程

SDK模式仍舊侵入了用戶的代碼,那就再解耦一層,把治理邏輯徹底從用戶的業務代碼中剝離出來,這就是如圖1-7所示的Sidecar模式。

                                                             圖1-7 第3種形態:治理邏輯獨立的進程

顯然,在這種形態下,用戶的業務代碼和治理邏輯都以獨立的進程存在,兩者的代碼和運行都無耦合,這樣可以做到與開發語言無關,升級也相互獨立。在對已存在的系統進行微服務治理時,只需搭配 Sidecar 即可,對原服務無須做任何修改,並且可以對老系統漸進式升級改造,先對部分服務進行微服務化。

比較以上三種服務治理形態,我們可以看到服務治理組件的位置在持續下沉,對應用的侵入逐漸減少,如表1-1所示。

                                                  表1-1 三種服務治理形態的比較

Istio不只解決了微服務問題

微服務作爲一種架構風格,更是一種敏捷的軟件工程實踐,說到底是一套方法論;與之對應的 Istio 等服務網格則是一種完整的實踐,Istio 更是一款設計良好的具有較好集成及可擴展能力的可落地的服務治理工具和平臺。

所以,微服務是一套理論,Istio是一種實踐。但是,Istio是用來解決問題的,並不是微服務理論的一種落地,在實際項目中拿着微服務的細節列表來硬套 Istio 的功能,比如要求Istio治理的服務必須實現微服務的服務註冊的一些細節,就明顯不太適當。

從場景來看,Istio管理的對象大部分是微服務化過的,但這不是必需的要求。對於一個或多個大的單體應用,只要存在服務間的訪問要進行治理,Istio也適用。實際上,傳統行業的用戶業務需要在容器化後進行服務治理,Istio是用戶非常喜歡的形態,因爲不用因爲服務治理而修改代碼,只需將業務搬到 Istio 上即可,如果需要將業務微服務化,則可以漸進式進行。

從能力來看,Istio對服務的治理不只包含在微服務中強調的負載均衡、熔斷、限流這些一般治理能力,還包含諸多其他能力,例如後續章節重點講到的提供可插拔的服務安全、可擴展的控制策略、服務運行可觀察性等更廣泛的治理能力。在 Istio 中提供的是用戶管理運維服務需要的能力,而不是在微服務教科書中定義的能力。

所以,過多地談論Istio和微服務的關係,倒不如多關注Istio和Kubernetes的結合關係。Kubernetes和雲原生實際上已經改變或者重新定義了軟件開發的很多方面,再想一想微服務世界正在發生的事情,我們也許會慢慢地習慣微服務迴歸本源,即用更加通用和鬆散的理論在新的形態下指導我們的工作。

小結:

           本節內容到此結束。

 

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