如何在 Kubernetes 中驱逐 pod?

问题描述 投票:0回答:2

我正在测试我在 k8s 集群上设置的触发器。它的作用是检测 pod 是否被驱逐。所以为了测试我跑了

kubectl drain <NODENAME> --ignore-daemonsets --force

但是被逐出的 Pod 会自动删除,而不是留在集群中。 你们能帮我解决如何驱逐 Pod 的问题吗? 我正在使用 kind 在我的计算机上进行本地测试。 实际上,我想在被驱逐后读取被驱逐的 pod yaml,以便我可以构建该触发器。

kubernetes kind
2个回答
3
投票

首先回答标题问题:“如何在 kubernetes 中驱逐 pod?”还有许多其他方法可以触发 Pod 驱逐,但有两种简单的方法:

基于 API 的驱逐

您可以使用一个 API 来手动驱逐 pod。使用 API:

    通过curl:
  • https://kubernetes.io/docs/concepts/scheduling-eviction/api-eviction/
  • 使用工具:
  • https://github.com/rajatjindal/kubectl-evict-pod
应用 NoExecute 污点

您的 Pod 不能容忍的

NoExecute 污点

将导致其被驱逐。 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,例如资源等。

0
投票
为了获得保持活动状态的东西,您需要使用

Deployment

DaemonSetStatefulSet 等。您为这些对象提供模板规范,它们会为您管理 Pod 的创建。

© www.soinside.com 2019 - 2024. All rights reserved.