API 发起的驱逐

API 发起的驱逐是一个过程,你可以通过此过程使用 驱逐 API 创建一个触发 Pod 优雅终止的 Eviction 对象。

你可以通过直接调用驱逐 API 来请求驱逐,也可以通过编程方式使用 API 服务器 的客户端(如 kubectl drain 命令)来请求。这会创建一个 Eviction 对象,从而使 API 服务器终止 Pod。

API 发起的驱逐会遵循你配置的 PodDisruptionBudgetsterminationGracePeriodSeconds

使用 API 为 Pod 创建驱逐对象,类似于对 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"
  }
}

或者,你也可以通过使用 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 时,控制平面会从 EndpointSlice 对象中移除该 Pod。结果是,控制器不再将该 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 PST:更新文档以弃用 Endpoints API (#49831) (649bda2cbd)