API 啟動的驅逐

API 啟動的驅逐是指您使用 Eviction API 建立 Eviction 物件以觸發正常 Pod 終止的程序。

您可以透過直接呼叫 Eviction API,或以程式方式使用 API 伺服器的用戶端(例如 kubectl drain 命令)來請求驅逐。這會建立 Eviction 物件,導致 API 伺服器終止 Pod。

API 啟動的驅逐會尊重您配置的 PodDisruptionBudgetsterminationGracePeriodSeconds

使用 API 為 Pod 建立 Eviction 物件就像對 Pod 執行策略控制的 DELETE 操作

呼叫 Eviction API

您可以使用 Kubernetes 語言用戶端 來存取 Kubernetes API 並建立 Eviction 物件。若要執行此操作,請 POST 嘗試的操作,類似於以下範例

{
  "apiVersion": "policy/v1",
  "kind": "Eviction",
  "metadata": {
    "name": "quux",
    "namespace": "default"
  }
}

{
  "apiVersion": "policy/v1beta1",
  "kind": "Eviction",
  "metadata": {
    "name": "quux",
    "namespace": "default"
  }
}

或者,您可以使用 curlwget 存取 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 會按如下方式刪除

  1. API 伺服器中的 Pod 資源會使用刪除時間戳記更新,之後 API 伺服器會將 Pod 資源視為已終止。Pod 資源也會標記已配置的寬限期。
  2. 節點上執行本機 Pod 的 kubelet 會注意到 Pod 資源已標記為終止,並開始正常關閉本機 Pod。
  3. 當 kubelet 關閉 Pod 時,控制平面會從 端點EndpointSlice 物件中移除 Pod。因此,控制器不再將 Pod 視為有效的物件。
  4. 在 Pod 的寬限期到期後,kubelet 會強制終止本機 Pod。
  5. kubelet 會告知 API 伺服器移除 Pod 資源。
  6. API 伺服器會刪除 Pod 資源。

疑難排解卡住的驅逐

在某些情況下,您的應用程式可能會進入損壞狀態,在您介入之前,Eviction API 將僅傳回 429500 回應。例如,如果 ReplicaSet 為您的應用程式建立 Pod,但新的 Pod 未進入 Ready 狀態,則可能會發生這種情況。在最後驅逐的 Pod 具有較長終止寬限期的情況下,您也可能會注意到此行為。

如果您注意到卡住的驅逐,請嘗試以下其中一種解決方案

  • 中止或暫停導致問題的自動化操作。在重新啟動操作之前,調查卡住的應用程式。
  • 稍候片刻,然後直接從叢集控制平面刪除 Pod,而不是使用 Eviction API。

下一步

上次修改時間:2024 年 2 月 19 日下午 1:54 PST:修正排程器章節中的尾隨空格 (2f298d2077)