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动态更新配置时序图如下图:
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
日志地址能生成请求日志 - 限流功能可以动态配置,与非限流配置可以任意切换
PS:之后更新github项目地址
来源:CSDN
作者:yjyzsl
链接:https://blog.csdn.net/yjyzsl/article/details/104582663