服務網格Istio初探-Pilot元件
女主宣言
隨著微服務規模和複雜性的增長,服務網格越來越難以理解和管理。其中Istio提供了服務發現、負載均衡、故障恢復、指標收集和監控等完整的服務網格解決方案,降低了功能模組部署的複雜性,減輕了開發團隊的壓力。本文對Istio網格進行了初步的介紹,希望能激發大家對Istio網格的興趣。
PS:豐富的一線技術、多元化的表現形式,盡在“ 3 60雲端計算 ”,點關注哦!
1
Istio是什麼
服務網格這個術語通常用於描述構成這些應用程式的微服務網路以及應用之間的互動,服務網格是用於處理服務間通訊的專用基礎設施層。它負責通過包含現代雲原生應用程式的複雜服務拓撲來可靠地傳遞請求。實際上,服務網格通常通過一組輕量級網路代理來實現,這些代理與應用程式程式碼一起部署,而不需要感知應用程式本身。
隨著微服務規模和複雜性的增長,服務網格越來越難以理解和管理。它的需求包括服務發現、負載均衡、故障恢復、指標收集和監控以及通常更加複雜的運維需求,例如 A/B 測試、金絲雀釋出、限流、訪問控制和端到端認證等。
Istio提供了一個完整的解決方案,通過為整個服務網格提供行為洞察和操作控制來滿足微服務應用程式的多樣化需求。在較高的層次上,Istio有助於降低這些部署的複雜性,並減輕開發團隊的壓力。它是一個完全開源的服務網格,可以透明地分層到現有的分散式應用程式上。它也是一個平臺,包括整合到任何日誌記錄平臺、遙測或策略系統的API。Istio的多樣化功能集使您能夠成功高效地執行分散式微服務架構,並提供保護、連線和監控微服務的統一方法。
通過兩幅圖來對比一下Istio在服務網格中的作用,未使用Istio的微服務之間的呼叫方式如下:
使用Istio管理的微服務之間的呼叫方式:
使用 Istio 的流量管理模型,本質上是將流量與基礎設施擴容解耦,讓運維人員可以通過 Pilot 指定流量遵循什麼規則,而不是指定哪些 pod/VM 應該接收流量——Pilot 和Envoy代理會幫我們搞定。
2
Istio架構
Istio 服務網格邏輯上分為資料平面和控制平面。
資料平面
資料平面由一組以sidecar方式部署的智慧代理(Envoy)組成。這些代理可以調節和控制微服務及Mixer之間所有的網路通訊。
資料平面的特點:
-
通常是按照無狀態目標設計的,但實際上為了提高流量轉發效能,需要快取一些資料,因此無狀態也是有爭議的。
-
直接處理入站和出站資料包,轉發、路由、健康檢查、負載均衡、認證、鑑權、產生監控資料等。
-
對應用來說透明,即可以做到無感知部署。
控制平面
控制平面負責管理和配置代理來路由流量。此外控制平面配置Mixer以實施策略和收集遙測資料。
控制平面的特點:
-
不直接解析資料包。
-
與資料平面中的代理通訊,下發策略和配置。
-
負責網路行為的視覺化。
-
通常提供API或者命令列工具可用於配置版本化管理,便於持續整合和部署。
Istio的架構如圖:
我們今天重點關注的是Pilot元件的基本實現。
3
Pilot元件
Pilot為Envoy sidecar提供服務發現功能,為智慧路由(例如 A/B 測試、金絲雀部署等)和彈性(超時、重試、熔斷器等)提供流量管理功能。它將控制流量行為的高階路由規則轉換為特定於Envoy的配置,並在執行時將它們傳播到sidecar。
Pilot元件架構如下圖:
Pilot的架構,最下面一層是Envoy的API,提供Discovery Service的API,這個API的規則由Envoy約定,Pilot實現Envoy API Server,Envoy和Pilot之間通過gRPC實現雙向資料同步。Pilot最上面一層稱為Platform Adapter,這一層不是Kubernetes呼叫Pilot,而是Pilot通過呼叫Kubernetes來發現服務之間的關係,Pilot通過在Kubernetes裡面註冊一個Controller來監聽事件,從而獲取Service和Kubernetes的Endpoint以及Pod的關係。Istio通過Kubernets CRD來定義自己的領域模型,使大家可以無縫的從Kubernets的資源定義過度到Pilot的資源定義。
Pilot元件主要包含兩部分,pilot-agent和pilot-discovery,我們基於Istio官方的bookinfo應用,探索一下pilot元件。bookinfo應用的架構如圖所示:
pilot-agent
開啟叢集的Sidecar自動注入,以productpage服務為例,觀察一下Istio對我們的應用容器到底做了了什麼。
Istio對productpage進行定製化之一:嵌入proxy_init作為InitContainer, InitContainer用於設定iptables規則,讓出入流量都轉由Sidecar進行處理, Istio-init只用來設定iptables規則。
Istio對productpage進行定製化之二:嵌入proxy容器作為Sidecar,基於Envoy實現。
istio-proxy容器的執行的程序包括pilot-agent和envoy:
pilot-agent的啟動流程:
總結一下pilot-agent的作用:
-
生成 Envoy的啟動配置。
-
啟動envoy。
-
監控並管理envoy的執行狀況,比如envoy出錯時pilot-agent負責重啟envoy,或者envoy配置變更後reload envoy。
pilot-discovery
pilot-discovery負責從k8s apiserver list/watch service、endpoint、pod、node等獲取資源資訊,監聽istio控制平面配置資訊(如VirtualService、DestinationRule等), 並將其翻譯為Envoy可以直接理解的配置格式。
pilot的架構下圖所示:
pilot-discovery的啟動流程:
bootstrap.NerServer:
initConfigController:
initServiceControllers:
initDiscoveryService:
在initDiscoveryService階段,註冊了Service(k8s services)和ServiceInstance(k8s endpoints)的兩個eventHandler,在k8s資源發生變化時會觸發更新envoy配置的操作,這裡的實現留待後續詳細分析。
通過以上的簡單分析,我們對pilot元件有了一個初步認識,後續我們會進一步深入程式碼探討具體的執行流程,並發現在大規模部署的生產環境中可能存在效能瓶頸。
4
TODO
-
pilot如何轉換k8s的資料模型和envoy的資料模型
-
pilot的gRPC推送時機
-
...
剛開始學習Istio相關元件,理解難免有偏頗,非常歡迎大家指正。
相關文章
-
Istio學習之Pilot-agent
-
Istio學習之Pilot-discovery
-
Pilot Discovery原始碼
-
深入解讀Service Mesh背後的技術細節
-
VirtualServices in Practice
-
理解 K8S 的設計精髓之 list-watch
-
Istio原始碼系列3:pilot-discovery 原始碼分析
-
kubernetes CRD下篇--編寫自定義控制器
360雲端計算
由360雲平臺團隊打造的技術分享公眾號,內容涉及 資料庫、大資料、微服務、容器、AIOps、IoT 等眾多技術領域,通過夯實的技術積累和豐富的一線實戰經驗,為你帶來最有料的技術分享