一、 驅逐 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/
,這些目錄通常會積累大量鏡像和容器數據。