API 优先级和公平性 (API Priority and Fairness) 控制 Kubernetes API 服务器在过载情况下的行为。您可以在 API 优先级和公平性 文档中找到更多相关信息。
每个启用了优先级和公平性功能的 API 服务器发出的 HTTP 响应都包含两个额外的请求头:X-Kubernetes-PF-FlowSchema-UID 和 X-Kubernetes-PF-PriorityLevel-UID,分别记录了与请求匹配的流模式 (FlowSchema) 和分配到的优先级等级 (PriorityLevel)。这些请求头中不包含 API 对象的名称(以避免在请求用户没有权限查看它们时泄露详细信息)。在调试时,可以使用如下命令:
kubectl get flowschemas -o custom-columns="uid:{metadata.uid},name:{metadata.name}"
kubectl get prioritylevelconfigurations -o custom-columns="uid:{metadata.uid},name:{metadata.name}"
来获取 FlowSchema 和 PriorityLevelConfiguration 的 UID 到名称的映射。
当启用了 APIPriorityAndFairness 功能后,kube-apiserver 会在其 HTTP(S) 端口上提供以下附加路径。
您需要确保拥有访问这些端点的权限。如果您使用的是管理员账户,则无需执行任何操作。如果需要,可以按照 RBAC 文档,通过指定 nonResourceURLs 来授予访问 /debug/api_priority_and_fairness/ 的权限。
/debug/api_priority_and_fairness/dump_priority_levels - 列出所有优先级等级及其当前状态。您可以像这样获取:
kubectl get --raw /debug/api_priority_and_fairness/dump_priority_levels
输出将采用 CSV 格式,类似于:
PriorityLevelName, ActiveQueues, IsIdle, IsQuiescing, WaitingRequests, ExecutingRequests, DispatchedRequests, RejectedRequests, TimedoutRequests, CancelledRequests
catch-all, 0, true, false, 0, 0, 1, 0, 0, 0
exempt, 0, true, false, 0, 0, 0, 0, 0, 0
global-default, 0, true, false, 0, 0, 46, 0, 0, 0
leader-election, 0, true, false, 0, 0, 4, 0, 0, 0
node-high, 0, true, false, 0, 0, 34, 0, 0, 0
system, 0, true, false, 0, 0, 48, 0, 0, 0
workload-high, 0, true, false, 0, 0, 500, 0, 0, 0
workload-low, 0, true, false, 0, 0, 0, 0, 0, 0
所选列名说明
IsQuiescing 表示当该优先级等级的队列被清空后,是否会被移除。/debug/api_priority_and_fairness/dump_queues - 列出所有队列及其当前状态。您可以像这样获取:
kubectl get --raw /debug/api_priority_and_fairness/dump_queues
输出将采用 CSV 格式,类似于:
PriorityLevelName, Index, PendingRequests, ExecutingRequests, SeatsInUse, NextDispatchR, InitialSeatsSum, MaxSeatsSum, TotalWorkSum
workload-low, 14, 27, 0, 0, 77.64342019ss, 270, 270, 0.81000000ss
workload-low, 74, 26, 0, 0, 76.95387841ss, 260, 260, 0.78000000ss
...
leader-election, 0, 0, 0, 0, 5088.87053833ss, 0, 0, 0.00000000ss
leader-election, 1, 0, 0, 0, 0.00000000ss, 0, 0, 0.00000000ss
...
workload-high, 0, 0, 0, 0, 0.00000000ss, 0, 0, 0.00000000ss
workload-high, 1, 0, 0, 0, 1119.44936475ss, 0, 0, 0.00000000ss
所选列名说明
NextDispatchR: R 进度计量的读数(单位:席位-秒),即下一个请求将被分发的进度点。InitialSeatsSum: 给定队列中所有请求关联的初始席位 (InitialSeats) 总和。MaxSeatsSum: 给定队列中所有请求关联的最大席位 (MaxSeats) 总和。TotalWorkSum: 给定队列中所有等待请求的总工作量(单位:席位-秒)。注意:席位-秒 (缩写为 ss) 是 APF 中衡量工作量的单位。
/debug/api_priority_and_fairness/dump_requests - 列出所有请求,包括队列中等待的请求和正在执行的请求。您可以像这样获取:
kubectl get --raw /debug/api_priority_and_fairness/dump_requests
输出将采用 CSV 格式,类似于:
PriorityLevelName, FlowSchemaName, QueueIndex, RequestIndexInQueue, FlowDistingsher, ArriveTime, InitialSeats, FinalSeats, AdditionalLatency, StartTime
exempt, exempt, -1, -1, , 2023-07-15T04:51:25.596404345Z, 1, 0, 0s, 2023-07-15T04:51:25.596404345Z
workload-low, service-accounts, 14, 0, system:serviceaccount:default:loadtest, 2023-07-18T00:12:51.386556253Z, 10, 0, 0s, 0001-01-01T00:00:00Z
workload-low, service-accounts, 14, 1, system:serviceaccount:default:loadtest, 2023-07-18T00:12:51.487092539Z, 10, 0, 0s, 0001-01-01T00:00:00Z
您可以使用如下命令获取更详细的列表:
kubectl get --raw '/debug/api_priority_and_fairness/dump_requests?includeRequestDetails=1'
输出将采用 CSV 格式,类似于:
PriorityLevelName, FlowSchemaName, QueueIndex, RequestIndexInQueue, FlowDistingsher, ArriveTime, InitialSeats, FinalSeats, AdditionalLatency, StartTime, UserName, Verb, APIPath, Namespace, Name, APIVersion, Resource, SubResource
exempt, exempt, -1, -1, , 2023-07-15T04:51:25.596404345Z, 1, 0, 0s, 2023-07-15T04:51:25.596404345Z, system:serviceaccount:system:admin, list, /api/v1/namespaces/kube-stress/configmaps, kube-stress, , v1, configmaps,
workload-low, service-accounts, 14, 0, system:serviceaccount:default:loadtest, 2023-07-18T00:13:08.986534842Z, 10, 0, 0s, 0001-01-01T00:00:00Z, system:serviceaccount:default:loadtest, list, /api/v1/namespaces/kube-stress/configmaps, kube-stress, , v1, configmaps,
workload-low, service-accounts, 14, 1, system:serviceaccount:default:loadtest, 2023-07-18T00:13:09.086476021Z, 10, 0, 0s, 0001-01-01T00:00:00Z, system:serviceaccount:default:loadtest, list, /api/v1/namespaces/kube-stress/configmaps, kube-stress, , v1, configmaps,
所选列名说明
QueueIndex: 队列索引。对于没有队列的优先级等级,该值为 -1。RequestIndexInQueue: 给定请求在队列中的索引。对于正在执行的请求,该值为 -1。InitialSeats: 请求在初始(正常)执行阶段将占用的席位数量。FinalSeats: 请求执行的最终阶段(考虑关联的 WATCH 通知)将占用的席位数量。AdditionalLatency: 请求执行最终阶段所占用的额外时间。在此期间将占用 FinalSeats。这并不代表用户观察到的延迟。StartTime: 请求开始执行的时间。对于排队中的请求,该值为 0001-01-01T00:00:00Z。在 -v=3 或更高的详细级别下,API 服务器会在 API 服务器日志中为每个请求输出一行 httplog,其中包括以下属性。
apf_fs: 请求所归类的流模式的名称。apf_pl: 该流模式所属的优先级等级名称。apf_iseats: 确定为请求初始(正常)执行阶段的席位数量。apf_fseats: 确定为请求最终执行阶段(考虑关联的 watch 通知)的席位数量。apf_additionalLatency: 请求执行最终阶段的持续时间。在更高级别的详细日志中,会有日志行暴露 APF 处理请求的详细信息,主要用于调试目的。
APF 会向每个 HTTP 响应消息添加以下两个请求头。它们不会出现在审计日志中。可以从客户端侧查看。对于使用 klog 的客户端,请使用 -v=8 或更高的详细级别来查看这些头信息。
X-Kubernetes-PF-FlowSchema-UID 包含对应请求被归类的 FlowSchema 对象的 UID。X-Kubernetes-PF-PriorityLevel-UID 包含与该 FlowSchema 关联的 PriorityLevelConfiguration 对象的 UID。有关 API 优先级和公平性设计细节的背景信息,请参阅增强功能提案。