Kubernetes APF(API 优先级和公平调度)简介

在 Kubernetes 集群中,kube-apiserver 是一个至关重要的组件,它不仅要对外响应客户端的 HTTPS 请求,还要对内与 controller-managerschedulerkubelet ...... 等等其它组件交互。

为了保障 kube-apiserver 的稳定性,其提供了以下配置用于限流:

  • --max-requests-inflight:查询类请求的最大并发数,默认 400。
  • --max-mutating-requests-inflight:变更类请求的最大并发数,默认 200。

虽然上述两项配置保障了总体的并发限制,但缺乏对请求的优先级划分,在某些情况下,集群管理员可能失去对 kube-apiserver 的掌控,比如某些失控的应用频繁请求 kube-apiserver 导致其过载而无法正常响应其它请求(2024 年 12 月 11 号 OpenAI 的 kubernetes 集群故障就是这种情况)。

APF(API Priority and Fairness)机制则可以避免这种问题。

APF

APF(API 优先级和公平调度)机制引入了以下两个新的对象:

  • FlowSchema:用于对请求进行分类,关联一个 PriorityLevelConfiguration 优先级。
  • PriorityLevelConfiguration:定义具体的优先级、该级别的并发数、队列行为。

请求通过 APF 的处理流程如下图所示:

请求首先匹配一个 FlowSchema,然后被分流到关联的 PriorityLevelConfiguration,进入该优先级配置的队列中,最后被从队列中取出处理。

FlowSchemaPriorityLevelConfiguration 的配置示例如下图所示:

FlowSchema.spec 配置有四个部分:

  • distinguisherMethod:可以设置 type 为 ByUser 或者 ByNamespace 将请求进一步分流,也可以不设置此配置。
  • matchingPrecedence:设置匹配的顺序,每个请求都先从 matchingPrecedence 数值最低的 FlowSchema 开始匹配,建议确保每个 FlowSchemamatchingPrecedence 不相同。
  • priorityLevelConfiguration:关联的优先级,每个 FlowSchema 只能关联一个优先级设置。
  • rules:匹配的规则,如果某个请求匹配其中一条规则,则该请求会被这个 FlowSchema 分流到关联的优先级。

PriorityLevelConfiguration.spec 配置有三个部分:

  • type:可以是 Exempt 或者 LimitedExempt 表示豁免请求,即该请求不会进入队列排队,而是被立即处理。
  • exempt:当 typeExempt 时可以配置豁免的更多细节。
  • limited:优先级队列相关配置,包括以下子属性:
    • borrowingLimitPercent:此优先级可以借入的额度。
    • lendablePercent:此优先级可以借出的额度。
    • nominalConcurrencyShares:名义并发额度。借入和借出额度设置提供了更多的弹性。
    • limitResponse:当 typeReject 时,多余请求被立即响应 429;当 typeQueue 时可以进一步设置队列的细节。

APF 需要设置 kube-apiserver--enable-priority-and-fairness 为 true 开启(新版本默认开启),此时 --max-requests-inflight--max-mutating-requests-inflight 相加的值决定了 kube-apiserver 的总并发数,总并发数和优先级的配额决定了每个优先级的并发能力。开启 APF 后,不再区分查询类请求和变更类请求,只根据 FlowSchema 进行分流。

内置的 FlowSchema 和 PriorityLevelConfiguration

为了降低用户的操作成本,kubernetes 内置了多种 FlowSchemaPriorityLevelConfiguration,这些对象被划分为强制和建议两类。对于强制的配置对象,k8s 会确保该对象存在,且不受用户控制;对于建议的配置对象,同样会确保该对象存在,但是用户可以控制。

具体内置了哪些 FlowSchemaPriorityLevelConfiguration 如下图所示:

从这些 FlowSchemaPriorityLevelConfiguration 的名字就能看出来它们分流和优先级的意图,集群内部组件的请求,如:节点的监控状态更新、kubelet 其它请求、内置控制器选主、内置控制器的其它请求 ... 等等都已经被囊括其中,另外还有 catch-allglobal-default 进行兜底,确保所有请求都被分流到具体的优先级队列。

当然用户也可以定义自己的 FlowSchemaPriorityLevelConfiguration

总结

APF 在 v1.29 版本成为稳定的特性,为 kube-apiserver 的流量控制提供了更细粒度的处理机制。


(我是凌虚,关注我,无广告,专注技术,欢迎交流或为我推荐工作)


参考资料:

相关推荐
向前看-25 分钟前
验证码机制
前端·后端
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭2 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
超爱吃士力架2 小时前
邀请逻辑
java·linux·后端
AskHarries4 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
魏 无羡5 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
isolusion5 小时前
Springboot的创建方式
java·spring boot·后端
Karoku0665 小时前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
zjw_rp5 小时前
Spring-AOP
java·后端·spring·spring-aop
TodoCoder6 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
少年姜太公6 小时前
从零开始详解js中的this(下)
前端·javascript·程序员