流量管制

API 優先順序與公平性控制 Kubernetes API 伺服器在過載情況下的行為。您可以在API 優先順序與公平性文件中找到更多相關資訊。

診斷

每個來自啟用優先順序與公平性功能的 API 伺服器的 HTTP 回應,都有兩個額外的標頭:X-Kubernetes-PF-FlowSchema-UIDX-Kubernetes-PF-PriorityLevel-UID,分別指出與請求相符的流量模式,以及請求被指派的優先順序層級。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 保留 PriorityLevelConfiguration 物件的 UID,該物件與 FlowSchema 相關聯。

下一步

如需 API 優先順序與公平性設計細節的背景資訊,請參閱增強提案

上次修改時間:2023 年 9 月 14 日下午 6:34 PST:address comments (0469dc9b32)