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。

相关推荐
炎码工坊2 小时前
在Linux上安装Docker并配置镜像加速器:从入门到实战
linux·docker·云原生
luckywuxn3 小时前
Eureka实战:怎么配置优化以减少服务发现延迟
云原生·eureka·服务发现
kongxx5 小时前
Docker Compose使用自定义用户名密码启动Redis
redis·docker·容器
玄德公笔记12 小时前
ubuntu 22.04安装k8s高可用集群
linux·ubuntu·kubernetes·k8s·containerd·高可用集群·ubuntu 22.04
foundbug99915 小时前
docker运行centos提示Operation not permitted
docker·容器·centos
人类群星闪耀时15 小时前
三层架构 vs SOA vs 微服务:该选谁?
微服务·云原生·架构
国际云,接待16 小时前
微软云如何申请使用
服务器·云原生·架构·微软·云计算·量子计算
AIGC_北苏17 小时前
Windows安装Docker部署dify,接入阿里云api-key进行rag测试
docker·容器·qwen·dify
hnlucky17 小时前
k8s中kubeSphere的安装使用+阿里云私有镜像仓库配置完整步骤
linux·运维·学习·阿里云·容器·kubernetes·云计算