我正在测试我在 k8s 集群上设置的触发器。它的作用是检测 pod 是否被驱逐。所以为了测试我跑了
kubectl drain <NODENAME> --ignore-daemonsets --force
但是被逐出的 Pod 会自动删除,而不是留在集群中。 你们能帮我解决如何驱逐 Pod 的问题吗? 我正在使用 kind 在我的计算机上进行本地测试。 实际上,我想在被驱逐后读取被驱逐的 pod yaml,以便我可以构建该触发器。
首先回答标题问题:“如何在 kubernetes 中驱逐 pod?”还有许多其他方法可以触发 Pod 驱逐,但有两种简单的方法:
您可以使用一个 API 来手动驱逐 pod。使用 API:
将导致其被驱逐。
kubectl taint nodes node1 key1=value1:NoExecute
现在,您的问题文本提出了一个略有不同的问题:在成功驱逐后读取 Pod 资源。至少在我的环境和 k8s 版本中,一旦 pod 被驱逐,它就会被与其运行的节点关联的服务帐户删除。
在实践中,很多东西都可以删除 pod - 包括垃圾收集器
,因此在 pod 终止后查询它充满了潜在的竞争条件。
相反,我建议为 Pod 事件设置程序化监视。 client-go
Informer 模式
,可以通过一些样板来完成此任务。为 Pod 创建一个通知程序,为您的事件处理程序定义一个
UpdateFunc
,然后您将可靠地接收由 API 处理的 pod 状态更改——然后您可以对其进行评估以确定它们是否被逐出。不确定这是否仍然相关,但您似乎对 k8s 范式存在误解,因为它与 pod 相关。豆荚被视为基本上被丢弃。 Pod 死了,开始一个新的。 Pod 被驱逐,在其他地方启动一个新的 Pod,等等。k8s 真正保留它们的唯一情况是一些小情况,其中有一个小问题实际启动了 pod,例如资源等。
Deployment
、DaemonSet、StatefulSet 等。您为这些对象提供模板规范,它们会为您管理 Pod 的创建。