更新时间:2024-12-18 GMT+08:00

集群过载保护最佳实践

随着业务不断扩展,Kubernetes集群规模不断增大,导致集群控制平面负载压力增大。当集群规模超过Kubernetes控制平面的承载能力时,可能会出现集群因过载而无法提供服务的情况。本文帮助您了解集群过载的现象、影响范围和影响因素,并详细介绍CCE集群的过载保护能力,同时梳理了集群过载保护的建议措施。

什么是集群过载

集群过载时,会出现Kubernetes API响应延迟增加、控制节点资源水位升高的现象。在过载状况极端的情况下,可能会出现 Kubernetes API 无法响应,控制节点无法使用,甚至整个集群无法正常工作的情况。

集群过载会对集群控制平面及依赖该平面的业务产生影响。以下列举了一些可能受到影响的场景:

  • Kubernetes资源管理:在进行创建、删除、更新或查询 Kubernetes 资源的操作时,可能会出现失败的情况。
  • Kubernetes分布式选主:在基于Kubernetes Lease选主的分布式应用中,可能会因Lease续期请求超时而导致主实例重启。

    例如npd插件的controller组件,Lease续期失败后进行主备切换,即主实例重启备实例接管工作,业务无感知。

  • 集群管理:集群严重过载时,可能会处于不可用状态,此时无法进行集群管理操作,例如创建或删除节点等。

常见的导致集群过载的原因:

  • 集群资源数据量过大

    etcd和kube-apiserver是集群控制平面的两个核心组件,etcd是后台数据库,负责存储所有集群数据,而kube-apiserver则是控制平面的入口,负责处理请求。为了减轻etcd的负担,kube-apiserver缓存了集群数据。此外,集群中的其他核心组件也会缓存集群中的各种资源,并监听这些资源的变化。

    因此,集群资源数据量过大,会导致控制平面持续处于资源高水位状态,超过承载能力时就会出现集群过载现象。

  • 客户端查询数据量过大:如发起大量LIST请求,或单个LIST请求查询大量数据。

    假设客户端通过Field Selectors指定查询集群中的部分pod数据,并且需要查询etcd(客户端也可以指定从kube-apiserver缓存查询)。由于etcd无法按Field过滤数据,因此kube-apiserver需要从etcd查询全量Pod数据。然后,kube-apiserver会对结构化的Pod数据进行过滤、复制、序列化等操作。最后,响应客户端请求。

    由此可见,客户端LIST请求可能需要由多个控制平面组件来处理,并且处理的数据量更多、数据类型更复杂。因此,客户端查询大量数据,会导致etcd和apiserver持续处于资源高水位状态,超过承载能力时就会出现集群过载现象。

CCE集群过载保护能力

  • 过载控制:CCE集群从v1.23版本开始支持集群过载控制,在集群控制平面的资源压力较大时,通过减少处理系统外LIST请求来缓解压力。该功能需要开启集群的过载控制开关,详情请参见集群过载控制
  • LIST请求处理优化:CCE集群从v1.23.8-r0、v1.25.3-r0版本开始对LIST请求处理进行了优化,即使客户端未指定resourceVersion查询参数, kube-apiserver也会基于其缓存响应请求,避免额外查询etcd,并能确保响应数据最新。此外,通过对kube-apiserver缓存增加Namespace索引,当客户端查询指定Namespace的指定资源时,无需再基于全量数据过滤属于此Namespace的资源,可以有效降低响应延迟时间和控制平面内存开销。
  • 服务端精细化限流策略:通过API 优先级和公平性(APF)对请求并发限制进行精细化控制,详情请参见API优先级和公平性(APF)

集群防过载建议

以下将给出几种过载防护措施与建议:

总结

实际业务运行过程中,Kubernetes集群的性能和可用性受多种因素的影响,例如集群规模、集群资源数量和大小、集群资源访问量等。CCE服务基于长期云原生实践,持续对集群性能和可用性进行优化,并总结梳理了上述集群过载保护措施,您可根据实际业务情况进行应用,以保障业务长期稳定可靠运行。