Higress 全局配置控制面原理分析
Jun
发布时间 2023-07-23
Higress 有个全局配置 ConfigMap 对象 higress-config,参考配置如下:
具体配置说明请参考 Higress 全局配置说明文档,
本文介绍以 Tracing 为例,详细说明 Tracing 全局配置是如何转成 EnvoyFilter 和如何同时实现实时下发到 Higress Gateway过程。
本文涉及整体架构流程、初始化过程和启动、higress-config 变更和处理流程、通知 XDSUpdater、构建 EnvoyFilter 和下发以及如何扩展全局配置等内容。
整体架构流程
1. 整体架构
2. 核心组件
IngressConfig 是 Higress 一个核心结构体, 负责监控 Ingress, McpBridge, Http2Rpc, WasmPlugin 等 k8s 资源, 同时集成 ConfigStore Interface,通过 List 接口下发 VirtualService, DestinationRule, EnvoyFilter, ServiceEntry, WasmPlugin 等 CR 资源。
ConfigmapMgr 结构体负责整个核心流程,包括通过 Informer List/Watch 机制监控 higress-config 的变更,同时遍历 ItemControllers 下发变更通知,提供构建 EnvoyFilter 列表等功能。
TracingController 结构体负责具体的 Tracing 数据校验,构建 Tracing EnvoyFilter, 以及通过 ItemEventHandler 下发变更通知等。
HigressConfig 是 higress-config Configmap 所对应数据的结构体。
3. 核心流程
- 用 Informer List/Watch 机制监控 higress-config 变更,校验变更,同时保存变更后数据。
- 用变更数据构建 EnvoyFilter。
- 通知 XDSUpdater,EnvoyFilter 有变更,重新拉取新的 EnvoyFilter 列表。
初始化过程
1. 初始化入口
初始化过程入口在 NewIngressConfig, 初始化 IngressConfig 时同时构建 HigressConfigController 和 ConfigmapMgr。
2. HigressConfigController 初始化
通过 Higress 提供 NewCommonController 初始化 HigressConfigController 用于监听 higress-system 命名空间下 Configmap 的变化。
3. ConfigmapMgr 初始化
ConfigmapMgr 初始化具体步骤如下:
- 构建 ConfigmapMgr
- 设置 HigressConfigController configmap 新增或者更新回调函数为 configmapMgr.AddOrUpdateHigressConfig
- 设置 HigressConfig 结构体默认值
- 初始化 TracingController
- 把 tracingController 添加到 configmapMgr itemControllers 数组里
- 初始化 ItemEventHandler, 同时遍历 itemControllers,设置 ItemEventHandler
启动
在 IngressConfig 添加 HigressConfigController Run() 和 HasSynced() 控制流程。
higress-config 变更和处理流程
1. configmapMgr 变更处理
ConfigmapMgr 通过收到 HigressConfigController 通知来处理变更请求。
具体变更流程如下:
- 判断是否 higress-system 命名空间下 name 为 higress-config Configmap 发生了变化,如果不是就返回。
- 获取 higress-config 内容。
- 遍历 ItemControllers, 校验 higress-config 配置是否合法,如果有一个返回不合法,就返回。
- 和上次保存在本地 higressConfig 比对, 检查这次数据是否有变化,如果没有变化就返回。
- 如果数据有变化,就遍历 ItemControllers 通知每个 itemController 数据有变化,同时保存这次变化到本地 higressConfig。
2. TracingController 变更处理
TracingController 变更处理就比较简单:
- 检查 Tracing 这部分数据是否有变更。
- 如果有变更,DeepCopy 一份 Tracing 数据保存到本地,同时通过 eventHandler 下发变更通知。
通知 XDSUpdater
在 ConfigmapMgr 初始化时候调用 configmapMgr.initEventHandlers(), 这个 func 会创建 ItemEventHandler, 同时遍历 ItemControllers 设置 ItemEventHandler。
这里 XDSUpdater 是从 IngressConfig 初始化传入, XDSUpdater.ConfigUpdate() 用于更新通知下发。
进一步跟踪可以发现在 Higress controller server 启动时执行 s.initXdsServer 函数创建 s.xdsServer,具体逻辑不在本文讨论范围, 有兴趣可以进一步阅读源码。
构建和下发 EnvoyFilters
1. IngressConfig List 下发 EnvoyFilters 列表
IngressConfig List 用于 VirtualService, DestinationRule, EnvoyFilter, ServiceEntry, WasmPlugin 等 CR 资源下发, 这里主要关注 EnvoyFilter CR 资源下发。
调用 ConfigmapMgr ConstructEnvoyFilters 获取需要下发 EnvoyFilter 列表, 同时和 m.cachedEnvoyFilters 列表聚合一下再下发。
这里 m.cachedEnvoyFilters 是在构建 VirtualService 时生成,有兴趣可以进一步阅读 IngressConfig 源码。
2. ConfigmapMgr 构建 EnvoyFilter 列表
这里比较简单,遍历一下 ItemControllers,聚合每个 itemController 返回的 EnvoyFilters.
3. TracingController 构建 EnvoyFilters
这里就比较简单,根据保存的 Tracing 数据构建对应的 EnvoyFilter
如何扩展全局配置
1. HigressConfig 结构体添加对应的扩展配置
2. 增加扩展配置默认值
3. 实现 ItemController interface
4. 初始化扩展配置,同时添加到 ItemControllers
参与社区贡献
Higress 开源贡献小组正在火热招募贡献者。早期参与开源更容易成为项目 Committer,并有更多机会成为 Higress PMC(Project Management Committee) 的一员,参与主导 Higress 社区的前进方向。
欢迎加入 Higress 社区群: