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