前言

k8s 的服务器在安装完成后,难免会遇到服务器需要整个更换 ip 段的情况,虽然很麻烦,需要改各种外部依赖的 Endpoints、重装 k8s ……但是也不得不做,其中最麻烦的就属以 NFS 为基础的持久卷了

遇到的小问题

k8s使用的 NFS 服务器更换 ip ,会导致 pvc 挂载不上,按说修改下挂载参数的 NFS 服务器 ip 就行,而挂载参数是在 pv 里面设置的,但是 pv 在创建后里面的参数无法修改,使用 kubectl edit 时候提示 k8s 禁止修改已经创建好的 pv

尝试解决

狗歌搜索下,发现前人也遇到了这个问题 https://serverfault.com/questions/1033326/kubernetes-persistencevolume-nfs-ip-change

文章里面第一个回答本质还是去改 pv 的配置,等 kubectl apply -f pv.yaml 就会发现 kubectl 提示不能更改,看到了下面提供了一个 k8s 论坛的链接:https://discuss.kubernetes.io/t/update-persistentvolume-nfs-ip/9633

里面提到的解决方案是删除并重新创建 pvc ,想想就觉得麻烦,想找找康康有没有什么取巧的办法

看了 k8s 论坛里面有人提出可以使用 pv-migrate 来做这个事情,就去看了一下,但是发现这个需要旧的服务器在线,但是在这次迁移中,因为网络规划的原因,两个网段不互通,也不会给多的服务器,而是直接在虚拟化平台把虚机迁移到了另一个 VLAN 段的服务器里面,所以也不行

感觉手动做实在是有点麻烦,因为有 17 个 pvc 需要改,于是就想到,既然 k8s 的配置都是存在 etcd 里面的,我直接去改 etcd 里面的数据不就 ok 了嘛,于是自然就想到了找一个 etcd 的管理工具,试图直接改 etcd 里面的数据试试

出于部署的简便性考虑,最终选了 tzfun/etcd-workbench: A beautiful web ui client for etcd v3. Supports SSL, SSH tunnel, version comparison, multi session etc. (github.com) 这个

部署还是比较容易的,有 Java 11+ 的环境,直接把 jar 包跑起来就行,连接 localhost 的 etcd ,去持久卷(persistentvolumes)里面找到配置就行,不过一看数据里面有乱码,一下就不敢动了,看工具有 Export 的功能,于是就先导出备份一份再上手操作,备份之后,试着改下里面的地址保存,kubectl get pv 一看,寄,Unexpected EOF ,于是麻溜还原备份,老老实实按照论坛里面说法手动处理😂

手动处理

大概思路是这样,删除旧的 pv ,再应用一个同名 pv ,改的时候修改里面的挂载参数即可,既然有 webui 了,我们可以配合 webui 来做这个事情

首先先导出旧 pv 的配置

kubectl get pv <name> -o yaml > pv.yaml

再修改里面的 nfs 的配置 (nfs server 节)

60f30b0b6217bf2ea0865de695e790e4

然后去 webui 删除 etcd 里面这个的数据

dc85fa9ceebb7bd5295328763c6608a9

最后应用新的配置

kubectl apply -f pv.yaml

再看 pod 就能起来了

不过用 kubectl delete pv pvc 应该是也可以的,不过用 webui 多备份一下总归是有备无患嘛