Kubernetes 虚拟机安全关机操作流程
不规范关机的危害
Kubernetes集群(尤其是基于VirtualBox搭的)关机/暂停时,如果不规范操作,会导致:
-
etcd 数据损坏
-
kubelet 容器状态丢失
-
PV 挂载紊乱(尤其用了 local PV / hostPath)
-
集群启动卡住或组件 crash
下面是安全关机的操作流程,分为简单版和完整版,学习和测试环境可按简单版执行即可
假设为3个节点,k8s-node1为master节点,k8s-node2和k8s-node3为工作节点
简单版关机流程
1️⃣ 先驱逐节点上的 Pod
kubectl drain k8s-node1 --ignore-daemonsets
kubectl drain k8s-node2 --ignore-daemonsets
kubectl drain k8s-node3 --ignore-daemonsets
2️⃣ 关闭节点
将各节点虚拟机关闭
在虚拟机里安全关机,最好先关闭子节点,再关闭master节点,依次在k8s-node2,k8s-node3上执行,最后再k8s-node1 master节点执行关机命令
shutdown -h now
3️⃣ 下次启动虚拟机后,让节点恢复调度
前提是docker和kubelet设置为开机启动,
启动时先启动master节点,然后等 30秒-1分钟 etcd 起稳,再启动子节点
kubectl uncordon k8s-node1
kubectl uncordon k8s-node2
kubectl uncordon k8s-node3
完整版关机流程
1️⃣ 先优雅停止 Kubernetes 集群
只需要在 master 节点 执行以下命令即可(不用每个节点跑):
kubectl drain k8s-node1 --ignore-daemonsets
kubectl drain k8s-node2 --ignore-daemonsets
kubectl drain k8s-node3 --ignore-daemonsets
上面的命令是针对v1.17及以下版本的,如果高于或等于v1.18,还需加上参数--delete-emptydir-data。
作用:
-
通知集群「我要关机」,驱逐 Pod,卸载 Volume
-
防止 etcd 或挂载数据未同步导致数据丢失
❗ 如果只是实验环境,可以跳过 drain,但生产环境建议做
2️⃣ 停止 kubelet + docker/containerd
三台机器都执行:
systemctl stop kubelet
systemctl stop docker # 如果你用 containerd 就改成 systemctl stop containerd
作用:
-
干净卸载 Pod、清理网络 namespace、detach 卷
-
防止「虚拟机强制关机」导致 Container runtime metadata 损坏
3️⃣ 优雅关机虚拟机
不要直接强制 power off!
在 VirtualBox 里,依次选每个节点:
-
VirtualBox → 关闭 → 发送关机信号 (ACPI Shutdown)
等机器自己关机,类似执行shutdown -h now
如果 ACPI 关机无效(有些系统不响应),虚拟机内执行:
shutdown -h now
✅ 下次启动时
-
先启动etcd 节点 / master 节点
-
等 30秒-1分钟 etcd 起稳,再启动 node 节点
-
每台机开机后,执行:
systemctl start docker
systemctl start kubelet
如果docker和kubelet设置为开机启动可跳过。
4. master 节点上执行下面的命令,让节点重新加入调度:
kubectl uncordon k8s-node1
kubectl uncordon k8s-node2
kubectl uncordon k8s-node3
懒人教程
实验环境不怕数据丢 → 直接执行虚拟机内关机命令:
shutdown -h now
等机器都关了,再关 VirtualBox。
别直接 VirtualBox → 强制关机(power off),这样最容易损坏 etcd。