Envoy动态更新配置方案设计

ぃ、小莉子 提交于 2020-03-01 03:12:24

1. 背景

目前集成了技术中台SideCar镜像部署的产品,并且产品在API集市管理,产品提供者通过在API集市中动态修改Envoy配置,无法实现动态更新,目前是重启容器的方式从API集市拉取最新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. 限流功能可以动态配置,与非限流配置可以任意切换

PS:之后更新github项目地址

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!