微服務網格 Istio

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 測試、金絲雀發佈和按流量百分比劃分的分階段發佈)。有了更好的對流量的可視性和開箱即用的故障恢復特性,這樣就可以在問題產生之前捕獲它們,無論面對什麼情況都可以使調用更可靠,網絡更健壯。詳細內容參考後面流量管理章節。

安全

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

可觀察性

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

平臺支持

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

  1. Kubernetes 上的服務部署

  2. 基於 Consul 的服務註冊

  3. 服務運行在獨立的虛擬機上

整合和定製

Istio 的策略實施組件可以擴展和定製,與現有的 ACL、日誌、監控、配額、審查等解決方案集成。

istio 的架構

istio 服務網格從邏輯上分爲數據平面和控制平面。

  1. 數據平面由一組智能代理 Envoy 組成,被部署成 sidecar。這些代理通過一個通用的策略和遙測中心 Mixer(Mixer 在 istio1.5 已經被廢棄了,默認關閉 Mixer,傳遞和控制微服務之間的所有網絡通信。

  2. 控制平面管理並配置代理來進行流量路由。此外,控制平面配置 Mixer (Mixer 已經在 istio1.5 中被廢棄)來執行策略和收集遙測數據。

  3. istio1.5 + 中使用了一個全新的部署模式,重建了控制平面,將原有的多個組件整合爲一個單體結構 istiod,這個組件是控制平面的核心,負責處理配置、證書分發、sidecar 注入等各種功能。istiod 是新版本中最大的變化,以一個單體組件替代了原有的架構,在降低複雜度和維護難度的同時,也讓易用性得到提升。需要注意的一點是,原有的多組件並不是被完全移除,而是在重構後以模塊的形式整合在一起組成了 istiod。

  4. istio 中的流量分爲數據平面流量和控制平面流量。數據平面流量是指工作負載的業務邏輯發送和接收的消息。控制平面流量是指 istio 組件之間發送的配置和控制消息用來編排網格的行爲。istio 中的流量管理特指數據平面流量。

Istio 組件

Envoy

istio 使用 Envoy 代理的擴展版本。Envoy 是用 C++ 開發的高性能代理,用於協調服務網格中所有服務的入站和出站流量。Envoy 代理是唯一與數據平面流量交互的 istio 組件。

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

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

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

Pilot

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

下圖展示了平臺適配器和 Envoy 代理如何交互。

  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 命令行工具。

[root@kubernetes-master-01 ~]# tar -xf istio-1.10.2-linux-amd64.tar.gz  
[root@kubernetes-master-01 ~]# mv istio-1.10.2/bin/istioctl /usr/local/bin/

部署 istio

[root@kubernetes-master-01 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

卸載

# 安裝時不需要執行
[root@kubernetes-master-01 ~]# istioctl manifest generate --set profile=demo | kubectl delete -f -

查看部署狀態

[root@kubernetes-master-01 ~]# 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 圖形化界面

[root@kubernetes-master-01 istio-1.10.2]# kubectl apply -f samples/addons/kiali.yaml 
[root@kubernetes-master-01 istio-1.10.2]# kubectl apply -f samples/addons/prometheus.yaml
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/EzivcAfT1CI2S7gPRthDoA