流控制
API 優先順序和公平性(API Priority and Fairness)在 Kubernetes API 伺服器過載時控制其行為。您可以在 API 優先順序和公平性 文件中找到更多關於此功能的資訊。
診斷
當 API 伺服器啟用了優先順序和公平性功能時,每個 HTTP 響應都包含兩個額外的標頭:X-Kubernetes-PF-FlowSchema-UID
和 X-Kubernetes-PF-PriorityLevel-UID
,分別指示匹配請求的流量模式(flow schema)和分配給它的優先順序級別。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}"
來獲取 FlowSchemas 和 PriorityLevelConfigurations 的 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
:下一個請求將被排程的進度條讀數,單位是“座位秒”(seat-seconds)。InitialSeatsSum
:給定佇列中所有請求的 InitialSeats 之和。MaxSeatsSum
:給定佇列中所有請求的 MaxSeats 之和。TotalWorkSum
:給定佇列中所有等待請求的總工作量,單位是“座位秒”(seat-seconds)。
注意:
seat-second
(縮寫為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
:請求被分類到的流量模式(flow schema)的名稱。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 優先順序和公平性設計細節的背景資訊,請參閱 增強提案。