【連載】微服務網格Istio(一)

Alvin, 發表於 2021-07-27
微服務

Istio基礎

服務網格是用於描述構成應用程式的微服務網路以及應用之間的互動,服務網格的功能包括服務發現、負載均衡、故障恢復、指標和監控以及更加複雜的運維工作,例如A/B測試、金絲雀釋出、限流、訪問控制和端到端身份驗證等。

什麼是微服務

微服務是用於構建應用程式的架構風格,一個大的系統可由一個或者多個微服務組成,微服務架構可將應用拆分成多個核心功能,每個功能都被稱為一項服務,可以單獨構建和部署,這意味著各項服務在工作和出現故障的時候不會相互影響,簡單來說,微服務架構是把一個大的系統按照不同的業務單元分解成多個職責單一的小系統,並利用簡單的方法使多個小系統相互協作,組合成一個大系統,各個小的系統是獨立部署的,它們之間是鬆耦合的。

什麼是istio

​ istio是一個用來連線、管理和保護微服務的開源的服務網格, istio解決了開發和運維人員從部署單個應用程式向分散式微服務架構過渡時所面臨的挑戰,istio作為微服務網格中的佼佼者,它提供了洞察和操作控制微服務網格的能力,提供了完整的解決方案來滿足微服務應用程式的各種要求,從較高的層面來說,istio有助於降低這些部署的複雜性,並減輕開發和運維團隊的壓力,istio它也是一個平臺,可以整合任何日誌、遙測和策略系統等API介面,istio多樣化的特性使大家能夠成功且高效地執行分散式微服務架構,並提供保護、連線和監控微服務的統一方法,istio目前僅支援在Kubernetes上部署,未來版本中將支援其他環境。

為什麼使用istio

​ 通過負載均衡、服務間的身份驗證、監控等方法,istio可以輕鬆地建立一個已經部署了服務的網路,而服務的程式碼只需很少更改甚至無需更改,通過在整個環境中部署一個特殊的sidecar代理為服務新增istio的支援,而代理會攔截微服務之間的所有網路通訊,然後使用其控制平面的功能來配置和管理istio,這包括:

  1. 為 HTTP、gRPC、WebSocket和TCP流量自動負載均衡。
  2. 通過豐富的路由規則、重試、故障轉移和故障注入對流量行為進行細粒度控制。
  3. 可插拔的策略層和配置API,支援訪問控制、速率限制和配額。
  4. 叢集內(包括叢集的入口和出口)所有流量的自動化度量、日誌記錄和追蹤。
  5. 在具有強大的基於身份驗證和授權的叢集中實現安全的服務間通訊。

istio的核心特性

Istio以統一的方式提供了許多跨服務網路的關鍵功能,核心功能如下:

流量管理

​ istio簡單的規則配置和流量路由允許你控制服務之間的流量和API呼叫過程。istio簡化了服務級屬性(如熔斷器、超時和重試)的配置,並且讓它輕而易舉的執行重要的任務(如 A/B 測試、金絲雀釋出和按流量百分比劃分的分階段釋出)。有了更好的對流量的可視性和開箱即用的故障恢復特性,這樣就可以在問題產生之前捕獲它們,無論面對什麼情況都可以使呼叫更可靠,網路更健壯。詳細內容參考後面流量管理章節(https://istio.io/latest/zh/docs/concepts/traffic-management/)。

安全

​ istio的安全特性解放了開發人員,使其只需要專注於應用程式級別的安全。istio提供了底層的安全通訊通道,併為大規模的服務通訊管理認證、授權和加密。有了istio,服務通訊在預設情況下就是受保護的,可以讓你在跨不同協議和執行時的情況下實施一致的策略,而所有這些都只需要很少甚至不需要修改應用程式。istio是獨立於平臺的,可以與Kubernetes(或基礎設施)的網路策略一起使用。但它更強大,能夠在網路和應用層面保護pod到pod或者服務到服務之間的通訊。詳細內容參考後面安全章節(https://istio.io/latest/zh/docs/concepts/traffic-management/)。

可觀察性

​ istio健壯的追蹤、監控和日誌特性讓你能夠深入的瞭解服務網格部署。通過istio的監控能力,可以真正的瞭解到服務的效能是如何影響上游和下游的;而它的定製Dashboard 提供了對所有服務效能的視覺化能力,並讓你看到它如何影響其他程式。istio的Mixer(Mixer在istio1.5版本已經廢棄了,功能整合到了istiod中) 元件負責策略控制和遙測資料收集。它提供了後端抽象和中介,將一部分istio與後端的基礎設施實現細節隔離開來,併為運維人員提供了對網格與後端基礎實施之間互動的細粒度控制。所有這些特性都使你能夠更有效地設定、監控和加強服務的SLO。當然,底線是你可以快速有效地檢測到並修復出現的問題。詳細內容參考後面可觀察行章節(https://istio.io/latest/zh/docs/concepts/observability/)。

平臺支援

​ istio獨立於平臺,被設計為可以在各種環境中執行,包括跨雲、內部環境、kubernetes、Mesos等等。你可以在Kubernetes或是裝有Consul的Nomad環境上部署 istio。istio 目前支援:

  1. Kubernetes上的服務部署
  2. 基於Consul的服務註冊
  3. 服務執行在獨立的虛擬機器上

整合和定製

​ Istio的策略實施元件可以擴充套件和定製,與現有的ACL、日誌、監控、配額、審查等解決方案整合。

istio的架構

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-CBUNfeuA-1627395821673)(istio%E5%9F%BA%E7%A1%80.assets/image-20210707191635427.png)]

istio服務網格從邏輯上分為資料平面和控制平面。

  1. 資料平面由一組智慧代理Envoy(Envoy參考https://www.envoyproxy.io/docs/envoy/latest/start/start)組成,被部署成sidecar。這些代理通過一個通用的策略和遙測中心Mixer(Mixer在istio1.5已經被廢棄了,預設關閉Mixer,Mixer參考https://istio.io/zh/docs/reference/config/policy-and-telemetry/)傳遞和控制微服務之間的所有網路通訊。
  2. 控制平面管理並配置代理來進行流量路由。此外,控制平面配置Mixer (Mixer已經在istio1.5中被廢棄)來執行策略和收集遙測資料。
  3. istio1.5+中使用了一個全新的部署模式,重建了控制平面,將原有的多個元件整合為一個單體結構istiod,這個元件是控制平面的核心,負責處理配置、證書分發、sidecar 注入等各種功能。istiod是新版本中最大的變化,以一個單體元件替代了原有的架構,在降低複雜度和維護難度的同時,也讓易用性得到提升。需要注意的一點是,原有的多元件並不是被完全移除,而是在重構後以模組的形式整合在一起組成了istiod。
  4. istio中的流量分為資料平面流量和控制平面流量。資料平面流量是指工作負載的業務邏輯傳送和接收的訊息。控制平面流量是指istio元件之間傳送的配置和控制訊息用來編排網格的行為。istio中的流量管理特指資料平面流量。

Istio元件

Envoy

​ istio使用Envoy代理(Envoy參考https://www.envoyproxy.io/docs/envoy/latest/)的擴充套件版本。Envoy是用 C++ 開發的高效能代理,用於協調服務網格中所有服務的入站和出站流量。Envoy代理是唯一與資料平面流量互動的istio 元件。

Envoy代理被部署為服務的sidecar,在邏輯上為服務增加了Envoy的許多內建特性,例如:

  • 動態服務發現
  • 負載均衡
  • TLS終端
  • HTTP/2與gRPC代理
  • 熔斷器
  • 健康檢查
  • 基於百分比流量分割的分階段釋出
  • 故障注入
  • 豐富的指標

​ 這種sidecar部署允許istio提取大量關於流量行為的訊號作為屬性。反之,istio可以在Mixer(Mixer在istio1.5已經被廢棄,這裡就不介紹了)中使用這些屬性來執行決策,並將它們傳送到監控系統,以提供整個網格的行為資訊。sidecar代理模型還允許向現有的部署新增istio功能,而不需要重新設計架構或重寫程式碼。

由Envoy代理啟用的一些istio的功能和任務包括:

  • 流量控制功能:通過豐富的 HTTP、gRPC、WebSocket 和 TCP 流量路由規則來執行細粒度的流量控制。
  • 網路彈性特性:重試設定、故障轉移、熔斷器和故障注入。
  • 安全性和身份驗證特性:執行安全性策略以及通過配置 API 定義的訪問控制和速率限制。

Pilot

​ Pilot為Envoy sidecar提供服務發現、用於智慧路由的流量管理功能(例如,A/B 測試、金絲雀釋出等)以及彈性功能(超時、重試、熔斷器等)。Pilot將控制流量行為的高階路由規則轉換為特定於環境的配置,並在執行時將它們傳播到sidecar。Pilot將特定於平臺的服務發現機制抽象出來,並將它們合成為任何符合Envoy API的sidecar都可以使用的標準格式。

下圖展示了平臺介面卡和Envoy代理如何互動。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-bGKTckAk-1627395821681)(istio%E5%9F%BA%E7%A1%80.assets/image-20210707192507850-5657109.png)]

  1. 平臺啟動一個服務的新例項,該例項通知其平臺介面卡。
  2. 平臺介面卡使用Pilot抽象模型註冊例項。
  3. Pilot將流量規則和配置派發給Envoy代理,來傳達此次更改。

​ 這種鬆耦合允許istio在Kubernetes、Consul或Nomad等多種環境中執行,同時維護相同的operator介面來進行流量管理。也可以使用istio的流量管理API來指示Pilot優化Envoy配置,以便對服務網格中的流量進行更細粒度地控制。

Galley

Galley是istio的配置驗證、提取、處理和分發元件。它負責將其餘的istio元件與從底層平臺(例如 Kubernetes)獲取使用者配置的細節隔離開來。

istio架構的設計目標

幾個關鍵的設計目標形成istio的架構。這些目標對於使系統能夠大規模和高效能地處理服務是至關重要的。

透明度最大化

​ 為了採用istio,運維人員或開發人員需要做盡可能少的工作,才能從系統中獲得真正的價值。為此,istio可以自動將自己注入到服務之間的所有網路路徑中。istio使用sidecar代理來捕獲流量,並在可能的情況下,在不更改已部署的應用程式程式碼的情況下,自動對網路層進行配置,以實現通過這些代理來路由流量。在 Kubernetes中,代理被注入到pods中,通過編寫‘iptables’規則來捕獲流量。一旦 sidecar代理被注入以及流量路由被程式設計,istio就可以協調所有的流量。這個原則也適用於效能。當將istio應用於部署時,運維人員會看到所提供功能的資源成本增加地最小。元件和API的設計必須考慮到效能和可伸縮性。

可擴充套件性

​ 隨著運維人員和開發人員越來越依賴於istio提供的功能,系統必須隨著他們的需求而增長。當我們繼續新增新特性時,最大的需求是擴充套件策略系統的能力,與其他策略和控制源的整合,以及將關於網格行為的訊號傳播到其他系統進行分析的能力。策略執行時支援用於接入其他服務的標準擴充套件機制。此外,它允許擴充套件其詞彙表,允許根據網格生成的新訊號執行策略。

可移植性

​ 使用istio的生態系統在許多方面都有所不同,istio 必須在任何雲環境或本地環境中通過最小的努力就能執行起來。將基於istio的服務移植到新環境的任務必須是容易實現的。使用istio,你可以操作部署到多個環境中的單個服務。例如,可以在多個雲上部署來實現冗餘。

策略一致性

​ 將策略應用於服務之間的API呼叫提供了對網格行為的大量控制。然而,將策略應用在區別於API層上的資源也同樣重要。例如,在機器學習訓練任務消耗的CPU 數量上應用配額比在發起任務的請求呼叫上應用配額更有用。為此,istio使用自己的 API將策略系統維護為一個獨立的服務,而不是將策略系統整合到sidecar代理中,從而允許服務根據需要直接與之整合。

安裝Istio

在安裝istio之前,需要一個Kubernetes叢集,istio 1.10 已經在 Kubernetes 版本 1.14, 1.15, 1.16 、1.17、1.18、1.19、1.20中測試過。

下載istio

下載 Istio,下載內容將包含:安裝檔案、示例和istioctl命令列工具。

[[email protected] ~]# wget https://github.com/istio/istio/releases/download/1.10.2/istio-1.10.2-linux-amd64.tar.gz
[[email protected] ~]# tar -xf istio-1.10.2-linux-amd64.tar.gz  
[[email protected] ~]# mv istio-1.10.2/bin/istioctl /usr/local/bin/

部署istio

[[email protected] istio-1.10.2]# istioctl manifest apply --set profile=demo
This will install the Istio 1.10.2 demo profile with ["Istio core" "Istiod" "Ingress gateways" "Egress gateways"] components into the cluster. Proceed? (y/N) y
✔ Istio core installed                                                                                                                                                                                        
✔ Istiod installed                                                                                                                                                                                            
✔ Egress gateways installed                                                                                                                                                                                   
✔ Ingress gateways installed                                                                                                                                                                                  
✔ Installation complete                                                                                                                                                                                       Thank you for installing Istio 1.10.  Please take a few minutes to tell us about your install/upgrade experience!  https://forms.gle/KjkrDnMPByq7akrYA

解除安裝

# 安裝時不需要執行
[[email protected] ~]# istioctl manifest generate --set profile=demo | kubectl delete -f -

檢視部署狀態

[[email protected] ~]# kubectl get pods -n istio-system 
NAME                                    READY   STATUS    RESTARTS   AGE
istio-egressgateway-78cb6c4799-nn2zw    1/1     Running   0          9m34s
istio-ingressgateway-59644976b5-z8vmd   1/1     Running   0          9m34s
istiod-664799f4bc-7w8vr                 1/1     Running   0          10m

安裝kiali圖形化介面

[[email protected] istio-1.10.2]# kubectl apply -f samples/addons/kiali.yaml 
[[email protected] istio-1.10.2]# kubectl apply -f samples/addons/prometheus.yaml 

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-RfIvZKi1-1627395821683)(istio%E5%9F%BA%E7%A1%80.assets/image-20210708130300179-5720581.png)]

連載Istio, 請貫注微信公眾號:新猿技術生態圈,及時學習更高階內容。