API 驱动的驱逐
API 初始化驱逐是您可以使用 驱逐 API 创建一个触发 Pod 平滑终止的 Eviction
对象的过程。
您可以通过直接调用驱逐 API 或使用 API 服务器 的客户端(例如 kubectl drain
命令)来请求驱逐。这将创建一个 Eviction
对象,该对象会导致 API 服务器终止 Pod。
API 初始化的驱逐会尊重您配置的 PodDisruptionBudgets
和 terminationGracePeriodSeconds
。
使用 API 为 Pod 创建一个驱逐对象就像对 Pod 执行受策略控制的 DELETE
操作。
调用驱逐 API
您可以使用 Kubernetes 语言客户端 访问 Kubernetes API 并创建一个 Eviction
对象。为此,您需要发布尝试的操作,类似于以下示例
注意
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 Too Many Requests
:由于配置的 PodDisruptionBudget,目前不允许驱逐。您可能需要稍后尝试再次进行驱逐。您也可能看到此响应是因为 API 速率限制。500 Internal Server Error
:驱逐不被允许,因为存在错误配置,例如,如果多个 PodDisruptionBudgets 引用同一个 Pod。
如果您要驱逐的 Pod 不属于具有 PodDisruptionBudget 的工作负载,则 API 服务器始终返回 200 OK
并允许驱逐。
如果 API 服务器允许驱逐,则 Pod 将按如下方式删除
- API 服务器中的
Pod
资源将更新为删除时间戳,之后 API 服务器将Pod
资源视为已终止。Pod
资源还将标记为配置的宽限期。 - 在运行本地 Pod 的节点上,kubelet 会注意到
Pod
资源已标记为终止,并开始平滑地关闭本地 Pod。 - 在 kubelet 关闭 Pod 时,控制平面会将 Pod 从 端点 和 端点切片 对象中删除。因此,控制器不再将 Pod 视为有效对象。
- 在 Pod 的宽限期过期后,kubelet 会强制终止本地 Pod。
- kubelet 会告诉 API 服务器删除
Pod
资源。 - API 服务器会删除
Pod
资源。
排查卡住的驱逐
在某些情况下,您的应用程序可能会进入错误状态,其中驱逐 API 只能返回 429
或 500
响应,直到您进行干预。例如,如果 ReplicaSet 为您的应用程序创建 Pod 但新的 Pod 无法进入 Ready
状态,就会发生这种情况。您也可能在最后被驱逐的 Pod 具有较长的终止宽限期的场景中注意到此行为。
如果您注意到驱逐卡住,请尝试以下解决方案之一
- 中止或暂停导致问题的自动操作。在重新启动操作之前,调查卡住的应用程序。
- 等待一段时间,然后直接从集群控制平面中删除 Pod,而不是使用驱逐 API。
下一步
- 了解如何使用 PodDisruptionBudget 保护您的应用程序。
- 了解 节点压力驱逐。
- 了解 Pod 优先级和抢占。
上次修改时间为 2024 年 2 月 19 日下午 1:54 PST:修复调度程序部分中的尾随空格 (2f298d2077)