Kubernetes v1.31: 通过从缓存中进行一致性读取加速集群性能
Kubernetes 以其强大的容器化应用编排能力而闻名,但随着集群规模的增长,控制平面面临的压力可能成为瓶颈。一个关键挑战是确保从 etcd 数据存储进行强一致性读取,这需要资源密集型的多数派读取(quorum reads)。
今天,Kubernetes 社区激动地宣布一项重大改进:从缓存进行一致性读取(consistent reads from cache),该特性在 Kubernetes v1.31 中升级到 Beta。
为什么一致性读取很重要
一致性读取对于确保 Kubernetes 组件准确了解最新的集群状态至关重要。保证一致性读取对于维护 Kubernetes 操作的准确性和可靠性至关重要,使组件能够根据最新信息做出明智决策。在大型集群中,获取和处理这些数据可能成为性能瓶颈,特别是对于涉及结果过滤的请求。虽然 Kubernetes 可以直接在 etcd 内部按 Namespace 过滤数据,但任何其他按标签或字段选择器的过滤都需要从 etcd 中获取整个数据集,然后由 Kubernetes API Server 在内存中进行过滤。这对 kubelet 等组件尤其影响显著,kubelet 只需列出调度到其节点上的 Pod,但以前却需要 API Server 和 etcd 处理集群中的所有 Pod。
突破:自信地使用缓存
Kubernetes 长期以来一直使用 watch cache 来优化读取操作。watch cache 存储集群状态的快照,并通过 etcd watch 接收更新。然而,到目前为止,它还不能直接提供一致性读取,因为无法保证缓存足够新。
从缓存进行一致性读取 功能通过利用 etcd 的 进度通知(progress notifications) 机制解决了这个问题。这些通知会告知 watch cache 其数据相对于 etcd 的新旧程度。当请求一致性读取时,系统首先检查 watch cache 是否最新。如果缓存不是最新的,系统会向 etcd 查询进度通知,直到确认缓存足够新鲜。一旦准备就绪,读取操作就会高效地直接从缓存中提供,这可以显著提高性能,尤其是在需要从 etcd 获取大量数据的情况下。这使得过滤数据的请求可以从缓存中获取,只需从 etcd 读取最少的元数据。
重要提示:要利用此特性,您的 Kubernetes 集群必须运行 etcd 3.4.31+ 或 3.5.13+ 版本。对于较旧的 etcd 版本,Kubernetes 将自动回退到直接从 etcd 提供一致性读取。
您会注意到的性能提升
这个看似简单的变化对 Kubernetes 的性能和可伸缩性产生了深远影响
- 降低 etcd 负载:Kubernetes v1.31 可以将 etcd 的部分工作卸载,从而为其他关键操作释放资源。
- 降低延迟:从缓存中提供读取比从 etcd 获取和处理数据快得多。这意味着组件响应更快,从而提高整个集群的响应速度。
- 提高可伸缩性:包含数千个节点和 Pod 的大型集群将获得最显著的收益,因为 etcd 负载的降低使得控制平面能够处理更多请求而不会牺牲性能。
5K 节点可伸缩性测试结果:在近期对 5000 节点集群进行的可伸缩性测试中,启用从缓存进行一致性读取带来了显著的改进
- kube-apiserver CPU 使用率降低 30%
- etcd CPU 使用率降低 25%
- Pod LIST 请求的 99 百分位延迟降低至多 3 倍(从 5 秒降至 1.5 秒)
下一步是什么?
随着升级到 beta,从缓存进行一致性读取默认启用,为所有运行支持的 etcd 版本的 Kubernetes 用户提供无缝的性能提升。
我们的旅程并未止步于此。Kubernetes 社区正在积极探索 watch cache 中的分页支持,这将在未来带来更多性能优化。
开始使用
升级到 Kubernetes v1.31 并确保您正在使用 etcd 3.4.31+ 或 3.5.13+ 版本是从缓存进行一致性读取的最简单方法。如果您有任何问题或反馈,请随时联系 Kubernetes 社区。
请告诉我们 从缓存进行一致性读取 如何改变您的 Kubernetes 体验!
特别感谢 @ah8ad3 和 @p0lyn0mial 对此特性的贡献!