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。

相关推荐
就叫飞六吧18 分钟前
Kubernetes弹性伸缩:让应用自动应对流量洪峰与低谷
云原生·容器·kubernetes
Ares-Wang2 小时前
私有仓库 Harbor、GitLab
kubernetes
瑟王3 小时前
Kubernetes笔记(1)Kubernetes入门
容器·kubernetes
格桑阿sir4 小时前
Kubernetes控制平面组件:Controller Manager详解
kubernetes·controller·informer·manager·控制器·ccm·leaderelection
bing_1586 小时前
微服务中怎么获取请求头信息
微服务·云原生·架构
大米7458 小时前
kubeadm部署k8s
云原生·容器·kubernetes
开心码农1号11 小时前
K8s 资源分类
大数据·容器·kubernetes
北漂老男孩11 小时前
深入理解高性能网络通信:从内核源码到云原生实践
云原生
hwj运维之路12 小时前
基于k8s的Jenkins CI/CD平台部署实践(三):集成ArgoCD实现持续部署
ci/cd·kubernetes·jenkins
AWS官方合作商13 小时前
AWS云服务深度技术解析:架构设计与最佳实践
云原生·云计算·aws·aws架构设计