Envoy Proxy(二)

Chung-chun Lo
Skyler Record
Published in
5 min readOct 23, 2022

經過上次的文章我們可以知道 Envoy 可以透過靜態檔案的方式去設定相關的 Config,但如果我們要將 Envoy 作為一個企業級的應用,每次變動或是 API 上架服務發現等等的,都需要透過檔案的方式重新設定可能會照成以下問題。

  • 修改設定繁瑣,每次都需要透過檔案替換的方式,這樣在操作上是相當不便利的。
  • 異動紀錄無法被有效保存,當每次異動的時候都是透過檔案時會發生權限無法有效地被控制,異動項目無法有效地被保存以及如異動後有問題,很難有效且快速的 Rollback。

為了解決以上問題,我們可以透過 Envoy 所提供的 xDS api 來建立 Control plane 與 Envoy 進行溝通。

xDS API 簡單來說就是 Envoy 提供多種相關服務的 API 如:Listener Discovery Service(LDS)、Route Discovery Service(RDS)、Cluster Discovery Service(CDS)、Endpoint Discovery Service(EDS)、Aggregated Discovery Service(ADS)、Health Discovery Service(HDS)、Secret Discovery Service(SDS)、Metric Service(MS)、Rate Limit Service(RLS)。

Control plane 則是透過 xDS API 與 Envoy 溝通的控制平台,在下面我們會以 Envoy 的官方範例為例。

啟動 envoy 與 control plane

$ docker-compose pull
$ docker-compose up --build -d proxy
$ docker-compose up --build -d go-control-plane
$ docker-compose ps

這時候我們可以看到透過 localhost:10000 得到的是 service1

$ curl http://localhost:10000Request served by service1HTTP/1.1 GET /Host: localhost:10000
Accept: */*
User-Agent: curl/7.79.1
X-Envoy-Expected-Rq-Timeout-Ms: 15000
X-Forwarded-Proto: http
X-Request-Id: 12aba39b-feca-4675-a694-2d3d2d1d8672

再來我們把範例內的 resource.go 其內容修改如下

將 UpstreamHost 從 service1 改成 service2

const (
ClusterName = "example_proxy_cluster"
RouteName = "local_route"
ListenerName = "listener_0"
ListenerPort = 10000
UpstreamHost = "service1"
UpstreamPort = 8080
)

將 Snapshot 的版本從 1 改成 2

func GenerateSnapshot() cache.Snapshot {   return cache.NewSnapshot(     "1",     []types.Resource{}, // endpoints     []types.Resource{makeCluster(ClusterName)},     []types.Resource{makeRoute(RouteName, ClusterName)},     []types.Resource{makeHTTPListener(ListenerName, RouteName)},     []types.Resource{}, // runtimes     []types.Resource{}, // secrets     []types.Resource{}, // extensions configs  )}

這時候我們在重新啟動 go-control-plane

docker-compose up --build -d go-control-plane

重新呼叫 localhost:10000 這時會發現從 service1 變成了 service2

$ curl http://localhost:10000Request served by service2HTTP/1.1 GET /Host: localhost:10000
Accept: */*
User-Agent: curl/7.79.1
X-Envoy-Expected-Rq-Timeout-Ms: 15000
X-Forwarded-Proto: http
X-Request-Id: a9c84178-d9c7-439f-a6b5-00c14c1c0979

從這個範例我們可以看到,只要透過了 xDS API 我們也可以寫出符合自己需求的 Control plane 了!!!

參考資料:

https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/dynamic-configuration-control-plane

--

--