k8s中NFS服务器IP变更无损迁移
Kubernetes存储维护实战:NFS服务器IP变更无损迁移指南
在Kubernetes生产环境中,NFS存储服务器IP变更如同给飞驰的汽车换轮胎,需要精准操作才能保障业务无感。本文将分享一套经过实战检验的迁移方案,助你平稳完成存储切换。
一、事前准备:制定迁移Checklist
1. 环境信息记录
# 获取当前存储配置信息
kubectl get pv,pvc,sc -l type=nfs -o yaml > nfs-backup-$(date +%Y%m%d).yaml
# 查看NFS挂载点
kubectl exec <pod名> -- df -h | grep nfs
2. 迁移窗口选择
- 业务低峰期操作(如凌晨2-4点)
- 提前通知相关团队
3. 数据同步验证
# 新旧NFS服务器数据一致性检查
rsync -avz --delete /old-nfs-path/ user@new-nfs-ip:/new-nfs-path/
二、四步迁移方案
步骤1:静态PV场景处理(手动创建PV)
# 批量更新PV配置(适用于少量PV)
kubectl get pv -o json | \
jq '.items[].spec.nfs.server = "new-ip"' | \
kubectl replace -f -
步骤2:动态Provisioner场景处理(如nfs-subdir)
# 更新StorageClass参数
kubectl edit sc nfs-sc
---
parameters:
server: new-nfs-ip # 修改此处IP
path: /data
关键操作:
重启Provisioner Pod使配置生效
kubectl rollout restart deploy nfs-client-provisioner -n kube-system
步骤3:业务Pod滚动更新
# 触发Deployment重建(无状态服务)
kubectl rollout restart deploy <有状态服务名>
# 有状态服务特殊处理
kubectl delete pod <pod名> --grace-period=0 --force
步骤4:旧存储清理
# 解除旧PV绑定(回收策略为Retain时)
kubectl patch pv old-pv-name -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
# 物理数据保留7天后删除
find /old-nfs-path -type f -mtime +7 -exec rm -f {} \;
三、生产环境高阶技巧
1. 双写过渡方案
# 临时挂载新旧双存储
volumes:
- name: old-nfs
nfs:
server: old-ip
path: /data
- name: new-nfs
nfs:
server: new-ip
path: /data
2. 客户端自动切换
# 使用DNS别名平滑过渡
nfs:
server: nfs-alias.example.com # CNAME指向新IP
3. 流量监控看板
# Prometheus监控查询
sum(rate(node_disk_read_bytes_total{device=~"nfs.*"}[5m])) by (pod)
四、故障排查工具箱
1. 挂载点检测脚本
#!/bin/bash
# check-nfs-mount.sh
pods=$(kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}')
for pod in $pods; do
echo "=== $pod ==="
kubectl exec $pod -- mount | grep nfs
done
2. 连接性测试Pod
kubectl run netcheck --image=nicolaka/netshoot -- \
bash -c "rpcinfo -p new-nfs-ip && showmount -e new-nfs-ip"
3. 数据一致性校验
# 生成MD5校验文件
find /nfs-data -type f -exec md5sum {} \; > checksum.txt
# 批量校验
md5sum -c checksum.txt
五、避坑指南
-
版本兼容性
- Kubernetes v1.20+ 需使用NFSv4.1+
- 旧版本内核需添加
nfsvers=4.1
挂载参数
-
权限陷阱
nfs: path: /data readOnly: false # 显式声明读写权限
-
防火墙配置
# 必要端口开放 iptables -A INPUT -p tcp --dport 2049 -j ACCEPT iptables -A INPUT -p udp --dport 2049 -j ACCEPT
-
客户端缓存
# 强制刷新NFS缓存 echo 3 > /proc/sys/vm/drop_caches
六、自动化方案进阶
1. 使用Operator自动发现
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: auto-nfs
provisioner: nfs.corp.com/auto
parameters:
discoveryUrl: http://nfs-manager/discovery
2. GitOps配置同步
# ArgoCD自动同步StorageClass变更
argocd app set nfs-storage --refresh
3. 混沌工程测试
# 模拟网络中断
kubectl apply -f - <<EOF
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: nfs-failure
spec:
action: partition
selector:
namespaces: ["kube-system"]
labelSelectors:
app: nfs-provisioner
direction: both
duration: 10m
EOF
通过本文方案,我们成功在某金融生产环境实现200+PV的NFS存储迁移,实现零停机切换。建议将核心流程封装成Ansible Playbook或Kubernetes Operator,并定期进行存储故障演练,以构建高可用的存储架构。
分类:
Kubernetes
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本