如何安全迁移EKS上带PVC的MongoDB StatefulSet副本至其他节点
解决EKS环境下MongoDB StatefulSet副本节点迁移问题
前置检查
- 确认MongoDB副本集健康状态:
连接集群执行以下命令,确保所有节点stateStr为PRIMARY/SECONDARY,且optimeDate同步一致:rs.status() - 可选但推荐:全量备份数据
mongodump --uri="mongodb://<你的Mongo服务地址>:27017" --out=/tmp/mongo-full-backup
迁移操作步骤
1. 恢复原节点调度能力(若之前执行过cordon)
kubectl uncordon <原Pod所在节点名称>
2. 缩容StatefulSet至1副本
终止待迁移的副本Pod(例如mongo-1):
kubectl scale statefulset <你的StatefulSet名称> --replicas=1
等待mongo-1完全终止后,执行kubectl get pods确认仅mongo-0处于运行状态。
3. 解除PV的节点绑定
查看待迁移副本对应的PV详情,确认节点亲和性配置:
kubectl describe pv <mongo-1对应的PV名称>
编辑PV移除节点绑定规则:
kubectl edit pv <mongo-1对应的PV名称>
找到并删除spec.nodeAffinity整块配置,保存退出。
4. 标记原节点为不可调度
阻止新Pod再调度回原节点:
kubectl cordon <原Pod所在节点名称>
5. 扩容StatefulSet回2副本
触发新副本Pod创建,此时它会自动调度到其他可用节点:
kubectl scale statefulset <你的StatefulSet名称> --replicas=2
执行kubectl get pods -o wide确认新的mongo-1运行在目标节点。
6. 验证副本集状态
再次连接MongoDB集群执行rs.status(),确认新节点已加入副本集且数据同步完成。
特殊场景处理
如果使用的云托管存储(如EBS)无法修改PV的节点绑定,可采用以下方案:
- 从原
mongo-1Pod导出节点数据 - 删除原
mongo-1对应的PVC和PV - 扩容StatefulSet,让集群在目标节点创建新的PVC
- 将导出的数据导入新节点,完成副本集同步
内容的提问来源于stack exchange,提问作者Isaac
相关产品推荐
相关产品推荐

