随笔 - 349  文章 - 0  评论 - 5  阅读 - 5273

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

五、避坑指南

  1. 版本兼容性

    • Kubernetes v1.20+ 需使用NFSv4.1+
    • 旧版本内核需添加nfsvers=4.1挂载参数
  2. 权限陷阱

    nfs:
      path: /data
      readOnly: false  # 显式声明读写权限
    
  3. 防火墙配置

    # 必要端口开放
    iptables -A INPUT -p tcp --dport 2049 -j ACCEPT
    iptables -A INPUT -p udp --dport 2049 -j ACCEPT
    
  4. 客户端缓存

    # 强制刷新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,并定期进行存储故障演练,以构建高可用的存储架构。

posted on   Leo-Yide  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示