API 啟動的驅逐
API 啟動的驅逐是指您使用 Eviction API 建立 Eviction
物件以觸發正常 Pod 終止的程序。
您可以透過直接呼叫 Eviction API,或以程式方式使用 API 伺服器的用戶端(例如 kubectl drain
命令)來請求驅逐。這會建立 Eviction
物件,導致 API 伺服器終止 Pod。
API 啟動的驅逐會尊重您配置的 PodDisruptionBudgets
和 terminationGracePeriodSeconds
。
使用 API 為 Pod 建立 Eviction 物件就像對 Pod 執行策略控制的 DELETE
操作。
呼叫 Eviction API
您可以使用 Kubernetes 語言用戶端 來存取 Kubernetes API 並建立 Eviction
物件。若要執行此操作,請 POST 嘗試的操作,類似於以下範例
注意
policy/v1
Eviction 在 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,類似於將DELETE
請求傳送至 Pod URL。429 Too Many Requests
:目前不允許驅逐,因為已配置 PodDisruptionBudget。您稍後可能會再次嘗試驅逐。您也可能會因為 API 速率限制而看到此回應。500 Internal Server Error
:不允許驅逐,因為存在錯誤配置,例如多個 PodDisruptionBudgets 參考相同的 Pod。
如果您要驅逐的 Pod 不是具有 PodDisruptionBudget 的工作負載的一部分,則 API 伺服器始終會傳回 200 OK
並允許驅逐。
如果 API 伺服器允許驅逐,則 Pod 會按如下方式刪除
- API 伺服器中的
Pod
資源會使用刪除時間戳記更新,之後 API 伺服器會將Pod
資源視為已終止。Pod
資源也會標記已配置的寬限期。 - 節點上執行本機 Pod 的 kubelet 會注意到
Pod
資源已標記為終止,並開始正常關閉本機 Pod。 - 當 kubelet 關閉 Pod 時,控制平面會從 端點 和 EndpointSlice 物件中移除 Pod。因此,控制器不再將 Pod 視為有效的物件。
- 在 Pod 的寬限期到期後,kubelet 會強制終止本機 Pod。
- kubelet 會告知 API 伺服器移除
Pod
資源。 - API 伺服器會刪除
Pod
資源。
疑難排解卡住的驅逐
在某些情況下,您的應用程式可能會進入損壞狀態,在您介入之前,Eviction API 將僅傳回 429
或 500
回應。例如,如果 ReplicaSet 為您的應用程式建立 Pod,但新的 Pod 未進入 Ready
狀態,則可能會發生這種情況。在最後驅逐的 Pod 具有較長終止寬限期的情況下,您也可能會注意到此行為。
如果您注意到卡住的驅逐,請嘗試以下其中一種解決方案
- 中止或暫停導致問題的自動化操作。在重新啟動操作之前,調查卡住的應用程式。
- 稍候片刻,然後直接從叢集控制平面刪除 Pod,而不是使用 Eviction API。
下一步
- 瞭解如何使用 Pod 中斷預算 保護您的應用程式。
- 瞭解關於 節點壓力驅逐。
- 瞭解關於 Pod 優先順序和搶佔。
上次修改時間:2024 年 2 月 19 日下午 1:54 PST:修正排程器章節中的尾隨空格 (2f298d2077)