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 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 时,控制平面会从 Endpoint 和 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:修复调度程序部分中的尾随空格 (2f298d2077)