API 發起的驅逐
API 發起的驅逐是指你使用 驅逐 API 來建立 Eviction
物件的過程,該物件會觸發 Pod 的優雅終止。
你可以透過直接呼叫驅逐 API 來請求驅逐,也可以透過 API 伺服器 的客戶端(如 kubectl drain
命令)以程式設計方式進行。這會建立一個 Eviction
物件,導致 API 伺服器終止 Pod。
API 發起的驅逐會遵循你所配置的 PodDisruptionBudgets
和 terminationGracePeriodSeconds
。
使用 API 為 Pod 建立一個 Eviction 物件,就像對 Pod 執行一個受策略控制的 DELETE
操作一樣。
呼叫驅逐 API
你可以使用 Kubernetes 語言客戶端 來訪問 Kubernetes API 並建立一個 Eviction
物件。為此,你透過 POST 方法執行嘗試的操作,類似於以下示例:
注意
policy/v1
驅逐在 v1.22+ 中可用。在之前的版本中使用 policy/v1beta1
。{
"apiVersion": "policy/v1",
"kind": "Eviction",
"metadata": {
"name": "quux",
"namespace": "default"
}
}
注意
在 v1.22 中已棄用,取而代之的是policy/v1
{
"apiVersion": "policy/v1beta1",
"kind": "Eviction",
"metadata": {
"name": "quux",
"namespace": "default"
}
}
此外,你還可以透過使用 curl
或 wget
訪問 API 來嘗試驅逐操作,類似於以下示例:
curl -v -H 'Content-type: application/json' https://your-cluster-api-endpoint.example/api/v1/namespaces/default/pods/quux/eviction -d @eviction.json
API 發起的驅逐如何工作
當你使用 API 請求驅逐時,API 伺服器會執行准入檢查,並以下列方式之一進行響應:
200 OK
:驅逐被允許,建立Eviction
子資源,並刪除 Pod,類似於向 Pod URL 傳送DELETE
請求。429 Too Many Requests
:由於已配置的 PodDisruptionBudget,當前不允許驅逐。你可能稍後可以再次嘗試驅逐。你也可能因為 API 速率限制而看到此響應。500 Internal Server Error
:驅逐不被允許,因為存在配置錯誤,例如多個 PodDisruptionBudget 引用同一個 Pod。
如果你想要驅逐的 Pod 不屬於具有 PodDisruptionBudget 的工作負載,則 API 伺服器始終返回 200 OK
並允許驅逐。
如果 API 伺服器允許驅逐,Pod 會按如下方式刪除:
- API 伺服器中的
Pod
資源會更新刪除時間戳,此後 API 伺服器將Pod
資源視為已終止。Pod
資源還會標記配置的寬限期。 - 執行本地 Pod 的節點上的 kubelet 注意到
Pod
資源被標記為終止,並開始優雅地關閉本地 Pod。 - 當 kubelet 關閉 Pod 時,控制平面會將 Pod 從 EndpointSlice 物件中移除。因此,控制器不再將 Pod 視為有效物件。
- 在 Pod 的寬限期過期後,kubelet 會強制終止本地 Pod。
- kubelet 通知 API 伺服器移除
Pod
資源。 - API 伺服器刪除
Pod
資源。
排查卡住的驅逐
在某些情況下,你的應用程式可能會進入故障狀態,其中驅逐 API 只會返回 429
或 500
響應,直到你進行干預。例如,如果 ReplicaSet 為你的應用程式建立了 Pod,但新 Pod 未進入 Ready
狀態,則可能會發生這種情況。在上次驅逐的 Pod 具有較長終止寬限期的情況下,你可能也會注意到這種行為。
如果你發現驅逐卡住,請嘗試以下解決方案之一:
- 中止或暫停導致問題的自動化操作。在重新啟動操作之前,調查卡住的應用程式。
- 等待一段時間,然後直接從叢集控制平面刪除 Pod,而不是使用驅逐 API。
下一步
- 瞭解如何使用 Pod 中斷預算 保護你的應用程式。
- 瞭解 節點壓力驅逐。
- 瞭解 Pod 優先順序和搶佔。