目前集成了SideCar镜像部署的应用,无法实现Envoy配置动态更新。
在线修改指定产品的Envoy配置文件,在不重启SideCar容器的情况下动态更新到指定容器的Envoy配置并且Envoy功能正常。
在Envoy中主要是两个方面的配置,一个是Listeners资源,一个是Clusters资源。这两个资源怎么连接ADS服务,那就需要通过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请求后,将向管理服务器再发送一个最新版本应用成功的请求
1. Management Server是一个SpringBoot Web服务,提供更新Envoy配置的Rest接口
目前在Server端Envoy配置是存放在HashMap
中,需要验证存在多个Server时是否能一致性更新,如果不能就需要将Envoy配置信息从HashMap
转移到Redis
中.
2. Management Server是一个gRPC服务,提供xDS协议实现的服务
Envoy客户端通过Node Id
标识, 即为产品ID,使其产品与产品之间的配置隔离。
1. 配置文件解析
Envoy Yaml配置文件主要分以下4部分:
其中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配置。
Clusters
和 Listeners
信息并且功能正常AccessLog
日志地址能生成请求日志