K8S常见问题汇总
一、 驱逐 master 节点上的所有 Pod
这会“清空”一个节点(包括 master)上的所有可驱逐的 Pod:
kubectl drain <master-node-name> --ignore-daemonsets --delete-emptydir-data
--ignore-daemonsets
:保留 DaemonSet 类型的 Pod--delete-emptydir-data
:允许删除使用 emptyDir 的本地数据
例如:
kubectl drain master-node-01 --ignore-daemonsets --delete-emptydir-data
⚠️ 注意: 你可能需要先允许对 master 节点操作:
kubectl taint nodes master-node-01 node-role.kubernetes.io/master-
要彻底不让 Pod 再运行在 master 节点上,你可以通过以下几种方式来实现。推荐使用的是 给 master 节点打 taint,并确保 Pod 不会设置容忍(toleration)去匹配这个 taint。
✅ 步骤一:给 master 节点打 Taint(防止调度业务 Pod)
执行以下命令,给 master 节点打 taint:
kubectl taint nodes <master-node-name> node-role.kubernetes.io/master=:NoSchedule
例如,如果你的 master 节点名字是 master-node-01:
kubectl taint nodes master-node-01 node-role.kubernetes.io/master=:NoSchedule
这条命令的意思是:不允许任何没有明确容忍该 taint 的 Pod 调度到 master 节点上。
✅ 步骤二:确保你的业务 Pod 没有添加 tolerations
查看你的 Deployment、StatefulSet、Pod 等 YAML,确认里面没有如下 toleration 字段:
tolerations:
- key: "node-role.kubernetes.io/master"effect: "NoSchedule"
如果有,要把这段删掉。
✅(可选)步骤三:把现有运行在 master 节点上的 Pod 迁移出去
kubectl drain <master-node-name> --ignore-daemonsets --delete-emptydir-data
例如:
kubectl drain master-node-01 --ignore-daemonsets --delete-emptydir-data
这样会驱逐业务 Pod,但保留 DaemonSet 等系统 Pod。
🚫 常见误区
-
只设置了 taint,不迁移现有 Pod → 现有 Pod 不会自动移动,要你手动 drain
-
有容忍规则的 Pod 仍然可以调度到 master → 所以要确保没有写 tolerations
二、调度失败
如果出现报错0/3 nodes are available: 1 Insufficient cpu, 1 node(s) had untolerated taint {node-role.kubernetes.io/master: }, 1 node(s) had untolerated taint {node.kubernetes.io/disk-pressure: }. preemption: 0/3 nodes are available: 1 No preemption victims found for incoming pod, 2 Preemption is not helpful for scheduling..
这个报错信息说明 Pod 无法调度 到任何节点,原因如下:
❌ 调度失败原因解析
共 3 个节点,全部不可用:
1️⃣ 1 Insufficient cpu
有一个节点 CPU 不足,无法调度 Pod。
2️⃣ 1 node(s) had untolerated taint {node-role.kubernetes.io/master: }
有一个节点是 master,并且带有 taint node-role.kubernetes.io/master:NoSchedule,但 Pod 没有 toleration,所以不能调度过去。
3️⃣ 1 node(s) had untolerated taint {node.kubernetes.io/disk-pressure: }
有一个节点存在 磁盘压力(disk pressure),K8s 自动打了 taint:
node.kubernetes.io/disk-pressure:NoSchedule
Pod 默认不会容忍这个 taint,所以不能调度过去。
✅ 方法:清理磁盘压力节点
在master节点执行下面命令:
kubectl describe node <node-name>
❗当前节点的问题:
-
磁盘空间不足 导致:
-
自动打上
disk-pressure
taint; -
kubelet 尝试清理镜像失败:
-
Failed to garbage collect required amount of images.
Attempted to free 46250890035 bytes, but only found 0 bytes eligible to free.
- 被标记为不能调度业务 Pod。
✅ 建议解决步骤:
✅ 1. 清理无用镜像
在 k8s-node1 节点上运行以下命令:
sudo crictl rmi --prune
或
sudo docker system prune -a
⚠️ 第二个命令适用于使用 Docker 作为容器运行时的情况,你用的是 containerd,所以首选 crictl 命令。
✅ 2. 查看哪些文件占用了磁盘空间
你可以使用以下命令找出大文件和目录(推荐):
sudo du -h / --max-depth=1 | sort -hr | head -n 20
特别关注 /var/lib/containerd/
或 /var/lib/docker/
,这些目录通常会积累大量镜像和容器数据。