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