API 发起的驱逐是一个过程,你可以通过此过程使用 驱逐 API 创建一个触发 Pod 优雅终止的 Eviction 对象。
你可以通过直接调用驱逐 API 来请求驱逐,也可以通过编程方式使用 API 服务器 的客户端(如 kubectl drain 命令)来请求。这会创建一个 Eviction 对象,从而使 API 服务器终止 Pod。
API 发起的驱逐会遵循你配置的 PodDisruptionBudgets 和 terminationGracePeriodSeconds。
使用 API 为 Pod 创建驱逐对象,类似于对 Pod 执行策略受控的 DELETE 操作。
你可以使用 Kubernetes 语言客户端 来访问 Kubernetes API 并创建一个 Eviction 对象。为此,你需要对该尝试的操作发送 POST 请求,类似于以下示例:
policy/v1 驱逐在 v1.22+ 版本中可用。在更早的版本中请使用 policy/v1beta1。{
"apiVersion": "policy/v1",
"kind": "Eviction",
"metadata": {
"name": "quux",
"namespace": "default"
}
}
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 服务器会执行准入检查,并以下列方式之一进行响应:
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 将按如下方式删除:
Pod 资源会被更新一个删除时间戳,此后 API 服务器会将 Pod 资源视为已终止。Pod 资源还会被标记上配置的宽限期。Pod 资源被标记为终止,并开始优雅地关闭本地 Pod。Pod 资源。Pod 资源。在某些情况下,你的应用程序可能会进入损坏状态,即在干预之前,驱逐 API 只会返回 429 或 500 响应。例如,如果 ReplicaSet 为你的应用程序创建了 Pod,但新 Pod 未能进入 Ready 状态,就可能会发生这种情况。你还可能会注意到,当最后一个被驱逐的 Pod 具有较长的终止宽限期时,也会出现此行为。
如果你注意到驱逐任务卡住,请尝试以下解决方案之一: