Envoy代理轉(zhuǎn)發(fā)與xDS映射關(guān)系
引言
Envoy作為Istio默認(rèn)數(shù)據(jù)面代理,它的工作流程是怎么樣的?本文通過示例運(yùn)行,走查其運(yùn)行流程,以及xDS協(xié)議映射。
一、xDS
xDS 協(xié)議是“X Discovery Service”的簡寫,這里的“X”表示它不是指具體的某個(gè)協(xié)議,是一組基于不同數(shù)據(jù)源的服務(wù)發(fā)現(xiàn)協(xié)議的總稱,包括 CDS、LDS、EDS、RDS等。在Istio架構(gòu)中,基于xDS協(xié)議提供了標(biāo)準(zhǔn)的控制面規(guī)范,并以此向數(shù)據(jù)面?zhèn)鬟f服務(wù)信息和治理規(guī)則。在Envoy中,xDS被稱為數(shù)據(jù)平面 API,并且擔(dān)任控制平面Pilot和數(shù)據(jù)平面Envoy的通信協(xié)議。
CDS 是 Cluster Discovery Service的縮寫,Envoy使用它在進(jìn)行路由的時(shí)候發(fā)現(xiàn)上游Cluster。Envoy通常會(huì)優(yōu)雅地添加、更新和刪除 Cluster。有了 CDS 協(xié)議,Envoy在初次啟動(dòng)的時(shí)候不一定要感知拓?fù)淅锼械纳嫌蜟luster。在做路由 HTTP 請(qǐng)求的時(shí)候通過在 HTTP 請(qǐng)求頭里添加 Cluster信息實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)。
EDS 即Endpoint Discovery Service 的縮寫。在Envoy術(shù)語中,Endpoint即Cluster的成員。Envoy 通過 EDS API可以更加智能地動(dòng)態(tài)獲取上游Endpoint。
LDS 即Listener Discovery Service的縮寫?;诖耍珽nvoy 可以在運(yùn)行時(shí)發(fā)現(xiàn)所有的Listener,包括 L3 和 L4 filter 等所有的 filter 棧,并由此執(zhí)行各種代理工作,如認(rèn)證、TCP 代理和 HTTP 代理等。添加 LDS 使得 Envoy 的任何配置都可以動(dòng)態(tài)執(zhí)行。
RDS 即 Router Discovery Service 的縮寫,用于 Envoy 在運(yùn)行時(shí)為 HTTP 連接管理 filter 獲取完整的路由配置,比如 HTTP 頭部修改等。并且路由配置會(huì)被優(yōu)雅地寫入而無需影響已有的請(qǐng)求。當(dāng) RDS 和 EDS、CDS 共同使用時(shí),可以幫助構(gòu)建一個(gè)復(fù)雜的路由拓?fù)渌{(lán)綠發(fā)布等。
ADS EDS,CDS 等每個(gè)獨(dú)立的服務(wù)都對(duì)應(yīng)了不同的 gRPC 服務(wù)名稱。對(duì)于需要控制不同類型資源抵達(dá) Envoy 順序的需求,可以使用聚合發(fā)現(xiàn)服務(wù),即 Aggregated xDS,它可以通過單一的 gRPC 服務(wù)流支持所有的資源類型,借助于有序的配置分發(fā),從而解決資源更新順序的問題。
備注:上述概念摘自 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
示例運(yùn)行
- envoy -c envoy-demo.yaml
訪問以下地址會(huì)路由轉(zhuǎn)發(fā)到Envoy官方地址「www.envoyproxy.io」
- http://localhost:10000/
三、邏輯走查
envoy-demo.yaml文件走查
概念:
LDS(Listener Discovery Service):監(jiān)聽發(fā)現(xiàn)服務(wù)
RDS(Route Discovery Service):路由發(fā)現(xiàn)服務(wù)
CDS(Cluster Discovery Service):集群發(fā)現(xiàn)服務(wù)
EDS(Endpoint Discovery Service):集群成員發(fā)現(xiàn)服務(wù)
流程:
1.Listener通過監(jiān)聽端口(10000)將請(qǐng)求根據(jù)Route提供的策略轉(zhuǎn)發(fā)
2.Route可以配置路由規(guī)則,示例中轉(zhuǎn)發(fā)到名字為「service_envoyproxy_io」的cluster
3.Cluster中可以配置行為相同的多個(gè)EndPoint,多個(gè)EndPoint可以配置負(fù)載均衡策略
4.EndPoint最終轉(zhuǎn)發(fā)的節(jié)點(diǎn)地址
本文轉(zhuǎn)載自微信公眾號(hào)「瓜農(nóng)老梁」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系瓜農(nóng)老梁公眾號(hào)。