istio架构及概念
文章目錄
- istio功能特性
- 流量管理
- 安全
- 可觀察性
- 擴展性
- istio架構
- 主要組件
- 流量管理相關概念
- 數據面相關概念
- pilot子組件
- xDS
- 引用參考
istio功能特性
流量管理
Istio 簡單的規則配置和流量路由允許您控制服務之間的流量和 API 調用過程。Istio 簡化了服務級屬性(如熔斷器、超時和重試)的配置,并且讓它輕而易舉的執行重要的任務(如 A/B 測試、金絲雀發布和灰度發布)。
安全
istio 的安全特性解放了開發人員,使其只需要專注于應用程序級別的安全。Istio 提供了底層的安全通信通道,并為大規模的服務通信管理認證、授權和加密。有了 Istio,服務通信在默認情況下就是受保護的,可以讓您在跨不同協議和運行時的情況下實施一致的策略——而所有這些都只需要很少甚至不需要修改應用程序。
Istio 是獨立于平臺的,可以與 Kubernetes(或基礎設施)的網絡策略一起使用。但它更強大,能夠在網絡和應用層面保護pod到 pod 或者服務到服務之間的通信。
可觀察性
Istio 健壯的追蹤、監控和日志特性讓您能夠深入的了解服務網格部署。通過 Istio 的監控能力,可以真正的了解到服務的性能是如何影響上游和下游的;而它的定制 Dashboard 提供了對所有服務性能的可視化能力,并讓您看到它如何影響其他進程。
擴展性
WebAssembly 是一種沙盒技術,可以用于擴展 Istio 代理(Envoy)的能力。Proxy-Wasm 沙盒 API 取代了 Mixer 作為 Istio 主要的擴展機制。在 Istio 1.6 中將會為 Proxy-Wasm 插件提供一種統一的配置 API。
istio架構
istio 服務網格從邏輯上分為數據平面和控制平面。
- 數據平面 由一組智能代理(Envoy)組成,被部署為 sidecar。這些代理負責協調和控制微服務之間的所有網絡通信。他們還收集和報告所有網格流量的遙測數據。
- 控制平面 管理并配置代理來進行流量路由。
Istio 中的流量分為數據平面流量和控制平面流量。數據平面流量是指工作負載的業務邏輯發送和接收的消息。控制平面流量是指在 Istio 組件之間發送的配置和控制消息用來編排網格的行為。Istio 中的流量管理特指數據平面流量。
istio只是實現了servicemesh控制面,整合了Envoy作為數據面的sidecar,一起對流量進行控制
主要組件
-
Envoy
Istio 使用 Envoy 代理的擴展版本。Envoy 是用 C++ 開發的高性能代理,用于協調服務網格中所有服務的入站和出站流量。Envoy 代理是唯一與數據平面流量交互的 Istio 組件。
Envoy 代理被部署為服務的 sidecar,在邏輯上為服務增加了 Envoy 的許多內置特性,例如:動態服務發現、負載均衡、TLS 、HTTP/2 與 gRPC 代理、熔斷器、健康檢查、基于百分比流量分割的分階段發布、故障注入、豐富的指標 -
Istiod
從 Istio 1.5 開始,更改了 Istio 的打包方式,將控制平面功能(Pilot,Galley,Citadel 和 sidecar 注入器)合并為一個被稱為 istiod 的二進制文件(原來是微服務架構)。為什么要吃自己的狗糧?參見https://preliminary.istio.io/latest/zh/blog/2020/istiod/ -
Mixer
用于擴展istio的功能,該組件新版本已廢棄,現在可以使用 Wasm 擴展 Envoy,詳見https://preliminary.istio.io/latest/zh/blog/2020/wasm-announce/ -
Pilot
Pilot 為 Envoy sidecar 提供服務發現、用于智能路由的流量管理功能(例如,A/B 測試、金絲雀發布等)以及彈性功能(超時、重試、熔斷器等)。
Pilot 將控制流量行為的高級路由規則轉換為特定于環境的配置,并在運行時將它們傳播到 sidecar。Pilot 將特定于平臺的服務發現機制抽象出來,并將它們合成為任何符合 Envoy API 的 sidecar 都可以使用的標準格式。
-
Citadel
Citadel 通過內置的身份和證書管理,可以支持強大的服務到服務以及最終用戶的身份驗證。您可以使用 Citadel 來升級服務網格中的未加密流量。 -
Galley
Galley 是 Istio 的配置驗證、提取、處理和分發組件。它負責將其余的 Istio 組件與從底層平臺(例如 Kubernetes)獲取用戶配置的細節隔離開來。 它不直接向數據面提供業務能力,而是在控制面上向其他組件提供支持。Galley 作為負責配置管理的組件,驗證配置信息的格式和內容的正確性,并將這些配置信息提供給控制面的Pilot服務使用,這樣其他控制面組件只用和Galley 打交道,從而與底層平臺解耦。 -
Sidecar injector
是負責向動注入的組件,只要開啟了自動注入,在Pod 創建時就會自動調用istio-sidecar-injector 向Pod 中注入Sidecar 容器。
在Kubernetes環境下,根據自動注入配置, Kube-apiserver 在攔截到Pod 創建的請求時,會調用自動注入服務istio-sidecar-injector生成Sidecar 容器的描述并將其插入原Pod的定義中,這樣,在創建的Pod 內除了包括業務容器,還包括Sidecar 容器。這個注入過程對用戶透明,用戶使用原方式創建工作負載。sidecar注入原理參見https://zhaohuabing.com/2018/05/23/istio-auto-injection-with-webhook/
流量管理相關概念
服務發現確保了服務間的可訪問性,但是對于服務網格來說,更重要的是需要能夠對服務間的訪問進行控制,本質上就是需要定義服務間的訪問規則。用戶僅需利用Istio提供的抽象的資源對象定義服務間的訪問關系,而無須關心底層復雜的流量轉發過程,就能輕松實現A/B測試、金絲雀發布、熔斷、故障注入等一系列復雜的流量管理操作。
Istio中與流量管理相關的資源對象(k8s CRD)主要有:
- Virtualservice:用于定義路由規則,如根據來源或 Header 制定規則,或在不同服務版本之間分拆流量。
- DestinationRule:定義目的服務的配置策略以及可路由子集。策略包括斷路器、負載均衡以及 TLS 等。
- ServiceEntry:可以使用ServiceEntry向Istio中加入附加的服務條目,以使網格內可以向istio 服務網格之外的服務發出請求。
- Gateway:為網格配置網關,以允許一個服務可以被網格外部訪問。
- Workload:能夠描述單個非Kubernetes工作負載的屬性,例如VM或裸機服務器,這些工作負載已裝入網格中。WorkloadEntry 必須附帶一個Istio ServiceEntry,該Istio通過適當的標簽選擇工作負載并提供服務的服務定義MESH_INTERNAL(主機名,端口屬性等)。一個 ServiceEntry對象可以根據服務條目中指定的標簽選擇器來選擇多個工作負載條目以及Kubernetes Pod。
- WorkloadGroup:描述工作負載實例的集合。它提供了一個規范,工作負載實例可用于引導其代理,包括元數據和身份。旨在與非k8s工作負載(例如虛擬機)一起使用,并且模仿現有的用于Kubernetes工作負載的Sidecar注入和部署規范模型,以引導Istio代理。
- SideCar:缺省情況下,Pilot將會把和Envoy Sidecar所在namespace的所有services的相關配置,包括inbound和outbound listenter, cluster, route等,都下發給Enovy。使用Sidecar可以對Pilot向Envoy Sidcar下發的配置進行更細粒度的調整,例如只向其下發該Sidecar 所在服務需要訪問的那些外部服務的相關outbound配置。
- EnvoyFilter:EnvoyFilter提供了一種自定義Istio Pilot生成的Envoy配置的機制。
數據面相關概念
- Host:能夠進行網絡通信的實體(如移動設備、服務器上的應用程序)。在此文檔中,主機是邏輯網絡應用程序。一塊物理硬件上可能運行有多個主機,只要它們是可以獨立尋址的。在EDS接口中,也使用“Endpoint”來表示一個應用實例,對應一個IP+Port的組合。
- Downstream:下游主機連接到 Envoy,發送請求并接收響應。
- Upstream:上游主機接收來自 Envoy 的連接和請求,并返回響應。
- Listener:監聽器是命名網地址(例如,端口、unix domain socket等),可以被下游客戶端連接。Envoy 暴露一個或者多個監聽器給下游主機連接。在Envoy中,Listener可以綁定到端口上直接對外服務,也可以不綁定到端口上,而是接收其他listener轉發的請求。
- Cluster:集群是指 Envoy 連接的一組上游主機,集群中的主機是對等的,對外提供相同的服務,組成了一個可以提供負載均衡和高可用的服務集群。Envoy 通過服務發現來發現集群的成員。可以選擇通過主動健康檢查來確定集群成員的健康狀態。Envoy 通過負載均衡策略決定將請求路由到哪個集群成員。可以理解為一個微服務有多個實例組成,這多個實例就是一個Cluster。
pilot子組件
- pilot-discovery
服務發現組件。從Service provider(如kubernetes或者consul)中獲取服務信息,從K8S API Server中獲取流量規則(K8S CRD Resource),將服務信息和流量規則轉化為數據面可以理解的格式,通過標準的數據面API下發到網格中的各個sidecar中。 - pilot-agent
agent組件。根據K8S API Server中的配置信息生成Envoy的配置文件,并負責啟動Envoy進程。注意Envoy的大部分配置信息都是通過xDS接口從Pilot中動態獲取的,因此Agent生成的只是用于初始化Envoy的少量靜態配置。
xDS
Istio數據面API定義了xDS服務接口,Pilot通過該接口向數據面sidecar下發動態配置信息,以對Mesh中的數據流量進行控制。xDS中的DS表示discovery service,即發現服務,表示xDS接口使用動態發現的方式提供數據面所需的配置數據。而x則是一個代詞,表示有多種discover service。Envoy通過xDS API可以動態獲取Listener(監聽器),Route(路由), Cluster(集群), Endpoint(集群成員)以及Secret(證書)配置。
-
LDS(Listener Discovery Service)
LDS是Listener發現服務。Listener監聽器控制Envoy啟動端口監聽(目前只支持TCP協議),并配L3/L4層過濾器,當網絡連接達到后,配置好的網絡過濾器堆棧開始處理后續事件。這種通過監聽器體系結構用于執行大多數不同的代理任務(限流,客戶端認證,HTTP連接管理,TCP代理等)。 -
RDS(Route Discovery Service)
Route發現服務,用于HTTP連接管理過濾器動態獲取路由配置路由配置包含HTTP頭部修改(增加、刪除HTTP頭部鍵值),virtual hosts (虛擬機),以及virtual hosts定義的各個路由條目。 -
CDS(Cluster Discovery Service)
Cluster發現服務,用于動態獲取Cluster信息。Envoy cluster管理器管理著所有的上游cluster。鑒于上游Cluster或者主機可用于任何代理轉發任務,所有上游Cluster一般從Listener或者Route中抽象出來。 -
EDS(Endpoint Discovery Service)
Endpoint發現服務。Endpoint就是ip+port組成。在Envoy 術語中,Cluster成員就叫Endpoint,對于每個CLuster,Envoy通過EDS API動態獲取Endpoint。EDS作為首選服務發現的原因有兩點:
與通過DNS解析的負載均衡器進行路由相比,Envoy能明確的知道每個上游主機的信息,因而可以做出更加智能的負載均策略。
Endpoint配置包含負載均衡權重、可用域等附加主機屬性,這些屬性可用于服務網格負載均衡,統計收集等過程中。 -
SDS(Secret Discovery Service)
Secret發現服務,用于運行時動態獲取TLS證書。若沒有SDS特性,在k8s環境中必須創建包含證書的Secret,代理啟動前Secret必須掛載到sidecar容器中,如果證書過期,則需要重新部署。使用SDS,集中式的SDS服務器將證書分發給所有的Envoy實例,如果證書過期,服務器會將新證書分發,Envoy接收到新的證書后重新加載兒不用重新部署。
引用參考
https://istio.io/latest/zh/docs/ops/deployment/architecture/
https://zhaohuabing.com/post/2018-09-25-istio-traffic-management-impl-intro
總結
以上是生活随笔為你收集整理的istio架构及概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python去除视频马赛克_DeepMo
- 下一篇: 主流分辨率