API 发起的驱逐
API 发起的驱逐是指您使用 驱逐 API 创建 Eviction
对象来触发优雅的 Pod 终止的过程。
您可以通过直接调用驱逐 API 或使用 API 服务器 的客户端(如 kubectl drain
命令)以编程方式请求驱逐。这将创建一个 Eviction
对象,该对象会导致 API 服务器终止 Pod。
API 发起的驱逐会考虑您配置的 PodDisruptionBudgets
和 terminationGracePeriodSeconds
。
使用 API 为 Pod 创建 Eviction
对象就像对 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"
}
}
或者,您可以尝试通过使用 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,类似于向 Pod URL 发送DELETE
请求。429 请求过多
:由于配置的 PodDisruptionBudget,当前不允许驱逐。您稍后可能可以再次尝试驱逐。您也可能会因为 API 速率限制而看到此响应。500 内部服务器错误
:不允许驱逐,因为存在配置错误,例如多个 PodDisruptionBudget 引用了同一个 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
资源。
解决卡住的驱逐问题
在某些情况下,您的应用程序可能会进入损坏状态,在这种状态下,驱逐 API 将只返回 429
或 500
响应,直到您进行干预。例如,如果 ReplicaSet 为您的应用程序创建 Pod,但新 Pod 未进入 Ready
状态,则可能会发生这种情况。您也可能会在最后一个被驱逐的 Pod 具有较长终止宽限期的情况下注意到此行为。
如果您注意到卡住的驱逐,请尝试以下解决方案之一
- 中止或暂停导致问题的自动化操作。在重新启动操作之前,请调查卡住的应用程序。
- 等待一段时间,然后直接从集群控制平面中删除 Pod,而不是使用驱逐 API。
下一步
- 了解如何使用 Pod 中断预算 保护您的应用程序。
- 了解 节点压力驱逐。
- 了解 Pod 优先级和抢占。
上次修改时间:2024 年 2 月 19 日下午 1:54 PST:修复调度器部分中的尾随空格 (2f298d2077)