API 發起的驅逐

API 發起的驅逐是指你使用 驅逐 API 來建立 Eviction 物件的過程,該物件會觸發 Pod 的優雅終止。

你可以透過直接呼叫驅逐 API 來請求驅逐,也可以透過 API 伺服器 的客戶端(如 kubectl drain 命令)以程式設計方式進行。這會建立一個 Eviction 物件,導致 API 伺服器終止 Pod。

API 發起的驅逐會遵循你所配置的 PodDisruptionBudgetsterminationGracePeriodSeconds

使用 API 為 Pod 建立一個 Eviction 物件,就像對 Pod 執行一個受策略控制的 DELETE 操作一樣。

呼叫驅逐 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,類似於向 Pod URL 傳送 DELETE 請求。
  • 429 Too Many Requests:由於已配置的 PodDisruptionBudget,當前不允許驅逐。你可能稍後可以再次嘗試驅逐。你也可能因為 API 速率限制而看到此響應。
  • 500 Internal Server Error:驅逐不被允許,因為存在配置錯誤,例如多個 PodDisruptionBudget 引用同一個 Pod。

如果你想要驅逐的 Pod 不屬於具有 PodDisruptionBudget 的工作負載,則 API 伺服器始終返回 200 OK 並允許驅逐。

如果 API 伺服器允許驅逐,Pod 會按如下方式刪除:

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

排查卡住的驅逐

在某些情況下,你的應用程式可能會進入故障狀態,其中驅逐 API 只會返回 429500 響應,直到你進行干預。例如,如果 ReplicaSet 為你的應用程式建立了 Pod,但新 Pod 未進入 Ready 狀態,則可能會發生這種情況。在上次驅逐的 Pod 具有較長終止寬限期的情況下,你可能也會注意到這種行為。

如果你發現驅逐卡住,請嘗試以下解決方案之一:

  • 中止或暫停導致問題的自動化操作。在重新啟動操作之前,調查卡住的應用程式。
  • 等待一段時間,然後直接從叢集控制平面刪除 Pod,而不是使用驅逐 API。

下一步

最後修改於 2025 年 4 月 9 日太平洋標準時間上午 5:08:更新 Endpoints API 棄用文件 (#49831) (649bda2cbd)