Kubernetes v1.35: 基于 Watch 的 CCM 路由协调机制
概述
在 Kubernetes 集群中,云控制器管理器(CCM)负责管理与云提供商交互的各类资源,其中路由控制器(Route Controller)负责为集群节点创建和管理云平台上的网络路由。自 v1.34 及之前版本,路由协调机制采用固定时间间隔轮询的方式,无论路由是否发生变化,都会向云平台 API 发起请求。这种机制在大规模集群中会产生大量不必要的 API 调用,不仅浪费云资源,也可能触及 API 速率限制,影响系统稳定性。Kubernetes v1.35 引入了一个新的特性门控(Feature Gate),允许将路由协调行为切换为基于 Watch 的事件驱动模式,从根本上优化了这一过程。
核心概念
要理解此特性,需先明确以下关键概念:
- 路由控制器(Route Controller):CCM 的一个组件,负责同步 Kubernetes 节点与云提供商(如 AWS、GCP、Azure)上的路由表,确保 Pod 网络能够正确通信。
- 固定间隔协调(Poll-based Reconciliation):旧版(v1.34 及之前)的工作方式。控制器每隔一个固定时间(例如 1 分钟)就主动调用云 API 查询所有路由状态,即使没有任何变更。这在云环境中是典型的“拉取(Pull)”模式,效率低下。
- 基于 Watch 的协调(Watch-based Reconciliation):新特性采用的工作方式。控制器利用 Kubernetes API 的
Watch机制(通过 informer),监听节点对象的变化。仅当节点被添加、删除,或其关键字段(.spec.podCIDRs、.status.addresses)更新时,才触发协调循环。这是更高效的“推送(Push)”模式。 - 特性门控(Feature Gate):
CloudControllerManagerWatchBasedRoutesReconciliation是此新行为的开关。它允许用户或管理员选择启用或禁用此功能,为平滑升级和测试提供了灵活性。
实践
此特性作为 Alpha 功能引入,需要在 CCM 实现中手动启用。启用后,路由控制器的行为将发生如下变化:
-
启用特性门控:在启动 CCM 时,通过命令行参数启用该特性。
# 示例启动参数 --feature-gate=CloudControllerManagerWatchBasedRoutesReconciliation=true具体启用方式取决于您使用的 CCM 发行版(如
cloud-provider-aws,cloud-provider-gcp等)。 -
触发机制:
- 事件驱动触发:当以下任何事件发生时,控制器会立即开始协调循环:
- 新节点加入集群。
- 现有节点从集群中删除。
- 节点的
podCIDRs或addresses字段发生更新。
- 定期兜底协调:为了应对潜在的边缘情况(如事件丢失),控制器还会在启动时随机选择一个 12 至 24 小时 之间的间隔,执行一次额外的协调循环。
- 事件驱动触发:当以下任何事件发生时,控制器会立即开始协调循环:
-
逻辑兼容性:该特性门控仅改变触发协调的机制,而不改变协调循环内部的具体逻辑。这意味着已有的路由创建、更新和删除策略保持不变,对用户的现有路由配置是透明的。
SRE 要点
对于 SRE 团队,此特性的引入直接影响集群的可靠性、性能和可观测性。
与可靠性、可观测性、事件响应的关联
- 可靠性与性能提升:减少对云平台 API 的无意义调用,降低了因达到 API 速率限制而导致控制平面故障的风险。这在拥有数百甚至数千节点的大型集群中尤为重要,直接提升了集群的整体可扩展性和稳定性。
- 可观测性:协调事件的触发变得更具因果性。SRE 可以更清晰地将一次路由同步操作与具体的节点变更事件关联起来,便于故障排查和审计。
- 事件响应:当节点因故障被替换或进行维护时,路由更新能更快地被触发,减少了网络中断的时间窗口。
最佳实践与常见反模式
- 最佳实践:
- 在非生产环境或测试集群中首先启用并验证此特性。
- 监控启用后 CCM 的日志和指标,确认协调仅在预期事件发生时触发。
- 了解兜底协调间隔的随机性,它不应作为主要的健康检查机制。
- 参考 KEP-5237 获取详细的实现设计和未来演进计划。
- 常见反模式:
- 在生产环境未经充分测试的情况下直接启用 Alpha 特性。
- 假设禁用此特性后系统行为会回滚,而忽略了可能已经存在的基于 Watch 的性能依赖。
相关指标(SLI/SLO/SLA)
启用此特性后,可以定义和监控新的 SLI 来衡量其效果:
- SLI 1:协调效率。例如,“每次路由协调的云 API 调用次数”。
- SLI 2:事件响应延迟。例如,“从节点对象变更到路由开始协调的间隔时间”。
- SLO 示例:可设定“在节点变更后 60 秒内开始路由协调”的 SLO,这在事件驱动模式下更容易保障。
相关概念请参阅 kubernetes-reliability 与 cloud-controller-manager。