Envoy代理轉發與xDS映射關系
引言
Envoy作為Istio默認數據面代理,它的工作流程是怎么樣的?本文通過示例運行,走查其運行流程,以及xDS協議映射。
一、xDS
xDS 協議是“X Discovery Service”的簡寫,這里的“X”表示它不是指具體的某個協議,是一組基于不同數據源的服務發現協議的總稱,包括 CDS、LDS、EDS、RDS等。在Istio架構中,基于xDS協議提供了標準的控制面規范,并以此向數據面傳遞服務信息和治理規則。在Envoy中,xDS被稱為數據平面 API,并且擔任控制平面Pilot和數據平面Envoy的通信協議。
CDS 是 Cluster Discovery Service的縮寫,Envoy使用它在進行路由的時候發現上游Cluster。Envoy通常會優雅地添加、更新和刪除 Cluster。有了 CDS 協議,Envoy在初次啟動的時候不一定要感知拓撲里所有的上游Cluster。在做路由 HTTP 請求的時候通過在 HTTP 請求頭里添加 Cluster信息實現請求轉發。
EDS 即Endpoint Discovery Service 的縮寫。在Envoy術語中,Endpoint即Cluster的成員。Envoy 通過 EDS API可以更加智能地動態獲取上游Endpoint。
LDS 即Listener Discovery Service的縮寫。基于此,Envoy 可以在運行時發現所有的Listener,包括 L3 和 L4 filter 等所有的 filter 棧,并由此執行各種代理工作,如認證、TCP 代理和 HTTP 代理等。添加 LDS 使得 Envoy 的任何配置都可以動態執行。
RDS 即 Router Discovery Service 的縮寫,用于 Envoy 在運行時為 HTTP 連接管理 filter 獲取完整的路由配置,比如 HTTP 頭部修改等。并且路由配置會被優雅地寫入而無需影響已有的請求。當 RDS 和 EDS、CDS 共同使用時,可以幫助構建一個復雜的路由拓撲藍綠發布等。
ADS EDS,CDS 等每個獨立的服務都對應了不同的 gRPC 服務名稱。對于需要控制不同類型資源抵達 Envoy 順序的需求,可以使用聚合發現服務,即 Aggregated xDS,它可以通過單一的 gRPC 服務流支持所有的資源類型,借助于有序的配置分發,從而解決資源更新順序的問題。
備注:上述概念摘自 https://www.servicemesher.com/istio-handbook/ecosystem/xds.html
二、Envoy代理示例
安裝部署
以mac版本為例,安裝看看
- brew update
- brew install envoy
版本檢查
- envoy --version
- envoy version: a2a1e3eed4214a38608ec223859fcfa8fb679b14/1.19.1/Modified/RELEASE/BoringSSL
下載示例yaml文件
- https://www.envoyproxy.io/docs/envoy/latest/_downloads/92dcb9714fb6bc288d042029b34c0de4/envoy-demo.yaml
示例運行
- envoy -c envoy-demo.yaml
訪問以下地址會路由轉發到Envoy官方地址「www.envoyproxy.io」
- http://localhost:10000/
三、邏輯走查
envoy-demo.yaml文件走查
概念:
LDS(Listener Discovery Service):監聽發現服務
RDS(Route Discovery Service):路由發現服務
CDS(Cluster Discovery Service):集群發現服務
EDS(Endpoint Discovery Service):集群成員發現服務
流程:
1.Listener通過監聽端口(10000)將請求根據Route提供的策略轉發
2.Route可以配置路由規則,示例中轉發到名字為「service_envoyproxy_io」的cluster
3.Cluster中可以配置行為相同的多個EndPoint,多個EndPoint可以配置負載均衡策略
4.EndPoint最終轉發的節點地址
本文轉載自微信公眾號「瓜農老梁」,可以通過以下二維碼關注。轉載本文請聯系瓜農老梁公眾號。