Envoy動態更新配置方案設計

1. 背景

目前集成了SideCar鏡像部署的應用,無法實現Envoy配置動態更新。

2. 目標

在線修改指定產品的Envoy配置文件,在不重啓SideCar容器的情況下動態更新到指定容器的Envoy配置並且Envoy功能正常。

3. XDS介紹

3.1. 客戶端配置

在Envoy中主要是兩個方面的配置,一個是Listeners資源,一個是Clusters資源。這兩個資源怎麼連接ADS服務,那就需要通過xDS協議進行
客戶端與管理服務器的通信。

3.2. XDS協議

下面是閱讀 xds_protocol 做的摘要,如有衝突已原文爲準。

每個xDS流都開始於DiscoveryRequest,請求指定訂閱的資源列表,資源對應類型URL,節點標識ID和版本信息。

Envoy動態更新配置時序圖如下圖:

API MarketManagement ServerEnvoy Clientupdate envoy config(V=, R={foo}, N=, T=EDS)(V=X, R={foo:...}, N=A, T=EDS)(V=X, R={foo}, N=A, T=EDS)API MarketManagement ServerEnvoy Client

1. API集市發送一個更新配置請求到Management Server

2. Envoy客戶端發送一個EDS請求,示例如下:

version_info:
node: { id: envoy }
resource_names:
  - foo
  - bar
type_url: type.googleapis.com/envoy.api.v2.ClusterLoadAssignment
response_nonce:

3. 管理服務器響應請求使用DiscoveryResponse,示例如下:

version_info: X
resources:
- foo ClusterLoadAssignment proto encoding
- bar ClusterLoadAssignment proto encoding
type_url: type.googleapis.com/envoy.api.v2.ClusterLoadAssignment
nonce: A

4. 客戶端處理完DiscoveryResponse請求後,將向管理服務器再發送一個最新版本應用成功的請求

4. 實現方案

4.1. xDS Management Server

1. Management Server是一個SpringBoot Web服務,提供更新Envoy配置的Rest接口
目前在Server端Envoy配置是存放在HashMap中,需要驗證存在多個Server時是否能一致性更新,如果不能就需要將Envoy配置信息從HashMap轉移到Redis中.

2. Management Server是一個gRPC服務,提供xDS協議實現的服務
Envoy客戶端通過Node Id標識, 即爲產品ID,使其產品與產品之間的配置隔離。

4.2. Envoy配置管理

1. 配置文件解析
Envoy Yaml配置文件主要分以下4部分:

  • 集羣信息(Clusters)
  • 節點信息(Endpoints)
  • 監聽器信息(Listeners)
  • 路由信息(Routes)

其中Routes是配置在Listeners中,Endpoints配置在Clusters中,而Listeners需要引用Clusters。

將Envoy Yaml解析處理完在序列化之後調用Management Server更新Envoy配置接口,讓Management Server專注於本身,不做過多的業務邏輯處理。

2. Envoy配置管理表設計

字段 類型 描述
id bigint(20) 主鍵ID
product_id varchar(32) 產品ID
envoy_config mediumtext Envoy配置
md5 varchar(32) Envoy配置md5值,標識是否有做變動
version int(5) 版本號
created_by varchar(50) 創建人
created_at timestamp 創建時間

envoy_config: Envoy配置,是經過解析處理後,讓Management Server直接可以識別的數據。
md5: envoy_config字段內容進行md5計算之後的值。
version: md5值與當前最高版本相等時不做處理,不相同時新增一條記錄並且版本號加1。

當出現版本後有變更時就調用Management Server更新配置服務,從而完成不重啓容器在線更新Envoy配置。

驗證Management Server

  1. Management Server能更新指定的客戶端的 ClustersListeners信息並且功能正常
  2. Management Server的version必須大於client的version時纔會更新Envoy配置。
  3. Envoy配置連接多個Management Server時Envoy Client只會連接一個Server節點,當一個節點掛掉時Envoy會自動切換連接到健康的Server節點。
  4. 動態配置的 AccessLog日誌地址能生成請求日誌
  5. 限流功能可以動態配置,與非限流配置可以任意切換
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章