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

✅ 下次启动时

  1. 先启动etcd 节点 / master 节点

  2. 等 30秒-1分钟 etcd 起稳,再启动 node 节点

  3. 每台机开机后,执行:

systemctl start docker

systemctl start kubelet

如果docker和kubelet设置为开机启动可跳过。

  1. master 节点上执行下面的命令,让节点重新加入调度:

kubectl uncordon k8s-node1

kubectl uncordon k8s-node2

kubectl uncordon k8s-node3

懒人教程

实验环境不怕数据丢 → 直接执行虚拟机内关机命令:

shutdown -h now

等机器都关了,再关 VirtualBox。
别直接 VirtualBox → 强制关机(power off),这样最容易损坏 etcd。

相关推荐
鱼跃鹰飞3 分钟前
经典面试题:K8S的自动缩扩容和崩溃恢复
java·容器·kubernetes
江湖有缘5 分钟前
Fenrus + Docker 实战:构建简洁高效的浏览器新标签页
运维·docker·容器
Zsr102332 分钟前
K8s核心组件pod:进阶篇
云原生·容器·kubernetes·pod
mr_orange_klj36 分钟前
k8s StorageClass和Provisoner的AI问答(豆包)
人工智能·容器·kubernetes
一条咸鱼_SaltyFish1 小时前
Spring Cloud Gateway鉴权空指针惊魂:HandlerMethod为null的深度排查
java·开发语言·人工智能·微服务·云原生·架构
唯情于酒11 小时前
Docker学习
学习·docker·容器
喵叔哟11 小时前
20.部署与运维
运维·docker·容器·.net
广州服务器托管15 小时前
NVIDIA最新591.74显卡驱动精简版:支持DLSS 4.5、所有RTX显卡都可使用,最新N卡驱动下载
计算机网络·网络安全·云原生·个人开发·可信计算技术
运维栈记16 小时前
虚拟化网络的根基-网络命名空间
网络·docker·容器
lbb 小魔仙17 小时前
【Linux】云原生运维效率提升:Linux 终端工具链(kubectl + tmux + fzf)组合拳教程
linux·运维·云原生