4. APF 队列机制:排队模型、并发限制、队列深度与超时
APF(API Priority and Fairness)是 Kubernetes 1.20+ 引入的请求排队与并发控制机制,替代了旧的 MaxInFlight 限流器。APF 通过多级队列、公平调度和超时控制,保障高优先级请求(如 kubelet 心跳、etcd 读)不被低优先级批量写请求(如 ListAllPods)阻塞。理解 APF 的排队模型、并发限制、队列深度与超时参数,是容量调优的核心前提。
4.1 排队模型:从 FlowSchema 到队列的映射
APF 的排队模型分为三层:FlowSchema → PriorityLevel → Queue。每个请求先匹配 FlowSchema,再归属到对应的 PriorityLevel,最后被哈希到该级别下的某个队列中等待调度。
关键概念: FlowSchema 通过
spec.matchRules 匹配请求属性(用户、组、资源、动词等);PriorityLevel 定义并发上限与队列配置;Queue 是实际排队单元,每个队列内部按 FIFO 顺序处理请求。
| 组件 | 作用 | 配置示例 |
|---|---|---|
| FlowSchema | 将请求分类并绑定到 PriorityLevel | kubectl get flowschema |
| PriorityLevel | 定义并发数、队列数、队列长度 | kubectl get prioritylevel |
| Queue | 实际排队单元,按哈希分配 | 由 APF 控制器自动管理 |
4.2 并发限制:并发数与排队阈值
每个 PriorityLevel 有两个关键并发参数:assuredConcurrencyShares(保证并发份额)和 limit(硬限制)。APF 调度器按份额比例分配总并发容量(默认 400),超出保证份额的请求进入队列等待。
| 参数 | 含义 | 默认值 | 调优建议 |
|---|---|---|---|
assuredConcurrencyShares |
该级别保证的并发份额 | 5(全局默认) | 高优先级(如 leader-election)可设为 10-20 |
limit |
该级别最大并发数(含排队中) | 无限制 | 建议设置,防止单级别耗尽所有并发 |
queuingConfig.queues |
队列数量 | 64 | 低流量级别可减少到 8-16 |
queuingConfig.queueLengthLimit |
每个队列最大深度 | 50 | 高突发场景可提升到 100-200 |
调优经验: 如果
kube-apiserver 日志中出现 APF queue full 或 request rejected due to queue full,说明队列深度不足或并发份额分配不合理。优先增加 queueLengthLimit,其次调整 assuredConcurrencyShares。
4.3 队列深度与超时:排队等待与请求丢弃
APF 的队列深度由 queueLengthLimit 控制,当队列满时新请求被直接拒绝(HTTP 429 Too Many Requests)。请求在队列中的最大等待时间由 queuingConfig.handSize 和 requestWaitLimit 共同决定,默认超时 60 秒。
- 队列深度(queueLengthLimit): 每个队列最多容纳的请求数。超过后新请求被拒绝,返回 429。
- 排队超时(requestWaitLimit): 请求在队列中等待的最大时间(默认 60s)。超时后请求被移除并返回 429。
- 公平性: APF 使用 轮询调度(Round Robin) 在队列间分配处理机会,避免某个队列饿死。
4.4 关键指标与监控
在 Grafana 面板中,APF 队列的核心监控指标包括:
| 指标名 | 类型 | 含义 | 告警阈值 |
|---|---|---|---|
apiserver_flowcontrol_current_inqueue_requests |
Gauge | 当前队列中等待的请求数 | > 队列总容量 80% |
apiserver_flowcontrol_request_queue_length_after_enqueue |
Histogram | 入队后的队列长度分布 | P99 > queueLengthLimit |
apiserver_flowcontrol_rejected_requests_total |
Counter | 被拒绝的请求总数 | 速率 > 0 持续 5min |
apiserver_flowcontrol_request_wait_duration_seconds |
Histogram | 请求在队列中的等待时间 | P99 > 30s |
注意: 如果
apiserver_flowcontrol_rejected_requests_total 持续增长,说明 APF 配置过紧或后端(etcd)处理能力不足。此时应先检查 etcd 的磁盘 IO 和请求延迟,再调整 APF 队列参数,避免盲目增加队列深度掩盖后端瓶颈。
4.5 实战调优步骤
- 识别瓶颈级别: 通过
apiserver_flowcontrol_current_inqueue_requests找到排队最严重的 PriorityLevel。 - 调整队列深度: 修改对应 PriorityLevel 的
queueLengthLimit,从 50 提升到 100 或 200。 - 调整并发份额: 增加高优先级级别的
assuredConcurrencyShares,减少低优先级级别。 - 设置硬限制: 为每个 PriorityLevel 设置
limit,防止单级别耗尽所有并发。 - 验证效果: 观察拒绝率下降、等待时间缩短、API Server 响应时间改善。
示例: 调整
workload-low 级别的队列深度和并发份额:apiVersion: flowcontrol.apiserver.k8s.io/v1beta3
kind: PriorityLevelConfiguration
metadata:
name: workload-low
spec:
type: Limited
limited:
assuredConcurrencyShares: 10
limit:
type: NonReplenishing
nominalConcurrencyShares: 100
queuingConfig:
queues: 32
handSize: 8
queueLengthLimit: 100
requestWaitLimit: 60s