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動態更新配置時序圖如下圖:
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
- Management Server能更新指定的客戶端的
Clusters
和Listeners
信息並且功能正常 - Management Server的version必須大於client的version時纔會更新Envoy配置。
- Envoy配置連接多個Management Server時Envoy Client只會連接一個Server節點,當一個節點掛掉時Envoy會自動切換連接到健康的Server節點。
- 動態配置的
AccessLog
日誌地址能生成請求日誌 - 限流功能可以動態配置,與非限流配置可以任意切換