Kubernetes自动化了大多数与Pod相关的管理任务,例如创建、调度、健康检查和删除。 然而,管理员在维护节点或手动扩展集群时可能必须使用kubectl 接口来删除 pod。
下面介绍如何使用 kubectl 删除 Kubernetes Pod。了解如何从节点中删除所有 pod 以及删除单个 pod。
先决条件
- 有集群的管理访问权限。
- kubectl 已安装。
使用 kubectl 删除 Pod
根据具体情况,用户可能需要删除行为不当的 Pod 或驱逐整个集群节点以进行故障排除或维护。以下部分介绍了两种删除 Pod 的方法,kubectl
并提供了避免最常见错误的说明。
删除单个 Pod
使用以下kubectl delete
命令从节点中删除单个 pod:
1. 通过输入以下命令获取 pod 的全名:
kubectl get pods
将出现可用 Pod 的列表。找到要删除的 Pod 并记下其名称。
2. 输入以下命令删除 Pod:
kubectl delete pod [pod-name]
输出确认 Pod 删除。
当 Kubernetes 删除 pod 时,它会自动将其替换为使用相同规格的新 pod。重新检查 pod 列表:
kubectl get pods
该列表显示新创建的 Pod。
注意:删除 Pod 无法更改正在运行的 Pod 副本数量。相反,通过修改部署YAML 文件
来更改它,或使用kubectl scale
:
kubectl scale deployment [deployment-name] --replicas=[number]
从节点删除所有 Pod
通过删除所有 pod 并防止生成新 pod 来排空节点。kubectl 具有drain
在指定节点上执行这两个操作的命令。
请按照以下步骤删除节点中的所有 Pod。
1. 显示可用节点列表:
kubectl get nodes
输出显示由三个节点组成的集群及其Ready
状态。
2. 使用**-o
带有wide
**参数的选项来查看集群中 Pod 的详细列表:
kubectl get pods -o wide
详细的 pod 列表包含一**NODE
列,其中显示托管每个 pod 的节点。下面的示例输出显示了test-node-1**工作节点上正在运行的三个 pod。
3. 使用**kubectl drain
**命令将 Pod 从节点中逐出。
kubectl drain [node-name]
输出显示该命令执行两个操作:
- 封锁节点。此操作可防止新的 Pod 在机器上生成。
- 排空节点。排水会移除当前存在的豆荚。
4. 通过检查集群中可用节点的列表来测试操作。
kubectl get nodes
排空的节点显示**SchedulingDisabled
**状态。
注意:该**kubectl cordon
**命令允许您封锁节点而不耗尽它:
kubectl cordon [节点名称]
排除错误
当尝试从节点驱逐 pod 时,您可能会遇到错误。以下是最常见错误的列表以及解决这些错误的提示。
无法删除 DaemonSet 管理的 Pod
您无法自动驱逐DaemonSet管理的 Pod 。如果您尝试排出的节点包含此类 pod,请使用该 --ignore-daemonsets
选项来覆盖错误。
kubectl drain [node-name] --ignore-daemonsets
无法删除具有本地存储的 Pod
如果 pod 连接到持久卷,存储数据可能会阻止 pod 被驱逐。
要避免此错误,请添加选项 --delete-emptydir-data
:
kubectl drain [node-name] --delete-emptydir-data
无法驱逐 Pod,因为这会违反 Pod 的中断预算。
如果您的应用程序有Pod 中断预算 (PDB),它会限制可以同时关闭的 Pod 数量。PDB 在驱逐节点时可能会出现错误,因为移除的 Pod 数量超出了设定的策略。
键入以下命令以查看当前在系统上强制执行的 PDB:
kubectl get pdb -A
输出显示可用的 PDB 及其策略。例如,下图显示了一个具有一个名为 的 PDB 的集群**test-pdb
**,这要求至少有一个正在运行的 pod。
更改防止节点耗尽的 PDB 策略,或使用以下命令将其删除**kubectl
**:
kubectl delete pdb [policy-name]
强制删除 Pod
如果无法使用标准方法删除 Pod,请尝试以下步骤:
1. 使用以下**kubectl delete
**命令:
kubectl delete pods [pod-name] --grace-period=0 --force
该**--grace-period
选项设置为零会消除 Pod 删除的等待时间。该--force
**选项忽略警告和错误。输出显示 Pod 已成功删除。
如果删除后 Pod 仍在 Pod 列表中,请执行以下命令将其删除:
kubectl patch pod [pod-name] -p '{"metadata":{"finalizers":null}}'
允许 Pod 返回节点
drain
当您在节点上 执行该 命令时,Kubernetes 会自动封锁 该节点并阻止任何未来的 Pod 调度。当您准备好再次将 Pod 发送到节点时,请输入以下命令使 Pod 可调度:
kubectl uncordon [node-name]
该节点现在可以接收新的 Pod。
结论
阅读本文后,您应该知道如何使用 kubectl CLI 从 Kubernetes 中的集群节点中删除 pod。本教程介绍了删除单个 Pod 和排空整个节点的过程。