容器迁移时不保存运行时状态,必须依赖外部机制保障关键数据不丢失;核心原则是只持久化存储状态、放弃运行时状态,区分运行时状态(如内存变量、网络连接)与存储状态(如数据库文件、用户上传内容、日志配置),前者需应用无状态化或交由redis/数据库托管,后者通过velero备份资源定义、单独处理pv、保留外部依赖地址,并对etcd执行快照备份与还原。

容器在集群迁移时本身不保存运行时状态,必须靠外部机制保障关键数据不丢失。核心原则是:只持久化存储状态,放弃运行时状态。
区分两类状态再决定保留策略
容器重启即丢失的状态(如内存变量、进程表、网络连接)无法直接迁移,这类运行时状态应由应用自身设计为无状态或通过外部服务(如Redis、数据库)托管。真正需要迁移的是存储状态,包括:
- 数据库文件(如
/var/lib/mysql) - 用户上传内容(如
/data/uploads) - 日志与配置(如
/var/log/app、/etc/app/config) - 可选缓存数据(需评估是否需保留)
Kubernetes集群迁移优先用声明式备份
对K8s环境,不推荐直接迁移单个容器,而是通过工具备份集群资源定义和持久卷:
- 用Velero备份
Deployment、Service、ConfigMap等对象(避开kube-system和velero命名空间) - 持久卷(PV)需单独处理:块存储类卷可随集群迁移;HostPath类型不支持自动备份,需手动导出数据
- 外部依赖(如RDS、OBS)保持原地址不变,仅更新应用配置指向新集群
Docker单机容器迁移靠镜像+卷组合
若只是跨主机迁移Docker容器,分两步走:
- 用
docker commit把当前容器生成新镜像,保存应用代码和配置变更 - 用
docker cp或挂载方式迁移卷数据——例如将/var/lib/docker/volumes/myapp_data/_data打包复制,再在目标机用-v挂载到新容器 - 避免直接拷贝
/var/lib/docker整目录,易因版本或文件系统差异失败
etcd与集群元数据必须单独备份
对于K8s控制面,etcd是集群状态的唯一真实来源:
- 迁移前执行
etcdctl snapshot save生成快照,包含所有资源对象、RBAC规则、Secret等 - 新集群初始化后,用
etcdctl snapshot restore还原,再启动apiserver - 注意证书路径和端点配置需与新环境匹配,否则快照无法加载











