如何停掉 Kubernetes 集群中某个节点上的 Pod

在 Kubernetes (简称 K8S) 中,节点是集群中的一个工作节点,负责运行容器并提供资源。有时候,我们需要停掉某个节点上的 Pod,可能是为了维护节点或者排查问题。本文将介绍如何通过适当的步骤,停掉节点上的 Pod。

整体流程:

1. 标记节点不可调度:将节点标记为不可调度,以确保没有新的 Pod 被调度到该节点上。
2. 撤掉节点上的运行着的 Pod:将节点上的所有 Pod 标记为删除状态,并等待它们终止。
3. 从集群中删除节点:将节点从集群中移除。

下面是一步一步的具体实现过程:

步骤 1:标记节点不可调度

要停掉一个节点上的 Pod,最好先将该节点标记为不可调度。这样,Kubernetes 将不会再将新的 Pod 调度到该节点上。

首先,使用以下命令获取节点列表:

```
kubectl get nodes
```

选择要停掉 Pod 的节点,并使用以下命令将其标记为不可调度:

```
kubectl cordon
```

这里的 `` 是要停掉 Pod 的节点名称。标记节点后,Kubernetes 将不会再将新的 Pod 调度到该节点上。

步骤 2:撤掉节点上的运行着的 Pod

在将节点上的 Pod 终止之前,我们需要查找到该节点上的运行着的 Pod。可以使用以下命令获取节点上的 Pod 列表:

```
kubectl get pods --field-selector=spec.nodeName=
```

这里的 `` 是要停掉 Pod 的节点名称。

可以看到 Pod 的名称、状态、所在的命名空间等信息。

接下来,使用以下命令将节点上的所有 Pod 标记为删除状态,并等待它们终止:

```
kubectl delete pods --field-selector=spec.nodeName= --grace-period=0 --force
```

这里的 `` 是要停掉 Pod 的节点名称。`--grace-period=0` 表示立即终止 Pod,`--force` 表示强制删除。

步骤 3:从集群中删除节点

终止节点上的 Pod 后,我们可以将该节点从集群中移除。

首先,使用以下命令查看节点的详细信息:

```
kubectl describe node
```

这里的 `` 是要停掉 Pod 的节点名称。

在输出结果中找到 `Taints` 这个段落。如果该节点已被标记为 `NoSchedule`,请先使用以下命令删除 `NoSchedule` 的标记:

```
kubectl taint nodes node-role.kubernetes.io/master:NoSchedule-
```

这里的 `` 是要停掉 Pod 的节点名称。

最后,使用以下命令将节点从集群中删除:

```
kubectl delete node
```

这里的 `` 是要停掉 Pod 的节点名称。

整个过程的代码示例:

```bash
# 获取所有节点
kubectl get nodes

# 标记节点不可调度
kubectl cordon

# 获取该节点上的运行着的 Pod
kubectl get pods --field-selector=spec.nodeName=

# 删除节点上的所有 Pod
kubectl delete pods --field-selector=spec.nodeName= --grace-period=0 --force

# 查看节点详细信息,删除 NoSchedule 的标记(如果有)
kubectl describe node
kubectl taint nodes node-role.kubernetes.io/master:NoSchedule-

# 删除节点
kubectl delete node
```

以上就是停掉 Kubernetes 集群中某个节点上的 Pod 的完整过程。通过标记节点不可调度、终止节点上的 Pod 并将节点从集群中删除,我们可以方便地停掉节点上的 Pod。希望本文对于刚入行的小白能够有所帮助。