Microk8s单节点非HA环境执行leave命令后Pod/命名空间丢失的恢复方法咨询
Microk8s单节点非HA环境执行leave命令后Pod/命名空间丢失的恢复方法咨询
你好,碰到这种情况确实挺闹心的,先给你捋清楚原因:microk8s leave命令原本是为多节点集群设计的,用来让节点退出集群。但在单节点非HA的Microk8s环境下执行这个命令,会触发集群重置操作——它不仅会重新生成集群证书,还会彻底清空etcd数据库里的所有集群数据(包括Pod、命名空间、部署、服务等所有资源),所以重启后你才会看到所有资源都不见了。
下面给你提供几种恢复思路和具体操作步骤:
尝试从残留的etcd数据恢复
Microk8s的etcd数据默认存在/var/snap/microk8s/current/var/etcd/目录下,如果执行leave命令后这个目录没有被彻底清空,还有机会恢复:
- 先停止Microk8s服务:
sudo microk8s stop
- 先备份当前的etcd目录(留个后手,避免后续操作弄坏现有数据):
sudo cp -r /var/snap/microk8s/current/var/etcd/ /var/snap/microk8s/current/var/etcd_backup/
恢复旧的etcd数据:
- 删除当前的etcd目录:
sudo rm -rf /var/snap/microk8s/current/var/etcd/ - 把备份的etcd目录恢复回去:
sudo cp -r /var/snap/microk8s/current/var/etcd_backup/ /var/snap/microk8s/current/var/etcd/ - 修复目录权限(确保microk8s用户能正常访问):
sudo chown -R microk8s:microk8s /var/snap/microk8s/current/var/etcd/
- 删除当前的etcd目录:
重启Microk8s并检查资源:
sudo microk8s start # 检查所有命名空间的Pod sudo microk8s kubectl get pods --all-namespaces # 检查命名空间列表 sudo microk8s kubectl get namespaces
如果etcd数据已彻底清空
如果上面的方法没效果,说明etcd数据已经被完全删除了,这种情况下只能:
- 从你之前手动导出的资源清单恢复(比如之前用过
microk8s kubectl get all --all-namespaces -o yaml > cluster_backup.yaml导出过资源),用microk8s kubectl apply -f cluster_backup.yaml重新部署; - 或者重新手动部署你的应用和相关资源。
后续避坑建议
在单节点非HA的Microk8s环境中,更新证书根本不需要执行leave和join操作!正确的证书更新方式是用官方提供的refresh-certs命令,它会在不重置集群、不丢失数据的前提下完成证书更新:
sudo microk8s refresh-certs
备注:内容来源于stack exchange,提问作者Umair Khan
相关产品推荐
相关产品推荐

