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 请求过多:由于配置的 PodDisruptionBudget,当前不允许驱逐。您稍后可能可以再次尝试驱逐。您也可能会因为 API 速率限制而看到此响应。
  • 500 内部服务器错误:不允许驱逐,因为存在配置错误,例如多个 PodDisruptionBudget 引用了同一个 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 资源。

解决卡住的驱逐问题

在某些情况下,您的应用程序可能会进入损坏状态,在这种状态下,驱逐 API 将只返回 429500 响应,直到您进行干预。例如,如果 ReplicaSet 为您的应用程序创建 Pod,但新 Pod 未进入 Ready 状态,则可能会发生这种情况。您也可能会在最后一个被驱逐的 Pod 具有较长终止宽限期的情况下注意到此行为。

如果您注意到卡住的驱逐,请尝试以下解决方案之一

  • 中止或暂停导致问题的自动化操作。在重新启动操作之前,请调查卡住的应用程序。
  • 等待一段时间,然后直接从集群控制平面中删除 Pod,而不是使用驱逐 API。

下一步

上次修改时间:2024 年 2 月 19 日下午 1:54 PST:修复调度器部分中的尾随空格 (2f298d2077)