kubernetes - K8s nfs 静态 pv 已满,如何使用新备份 nfs 静态 pv 更新“pvc/pv”而不重新安装所有
问题描述
问题:
我有一个使用静态 NFS PV 的弹性集群。如何将这些数据移动到另一台服务器有更多空间(already did, just copy it)
并保持应用程序应用新的备份数据而无需重新安装所有内容。我在 Centos 7 上使用 Rancher(没有 VM Sphere)。
我尝试什么:
- 更新PV
NFS path
和limitStorage
新的备份服务器,但 k8s 不允许。 - 在新的备份服务器上使用新PV更新现有 PVC,但 k8s 仍然不允许。
错误信息:
# persistentvolumeclaims "data-core-container-log-elasticsearch-data-0" 无效:
# * spec: Forbidden: 在创建后是不可变的,除了 resources.requests 用于绑定声明
解决方案
可能有几种解决方案,这就是我在上述场景中提到的所有内容的结果。
10.20.4.101
假设 nfs 驱动器已填满,在 处获取具有 nfs 卷声明的状态集。我将所有数据重新定位并复制到另一个 vm 10.20.4.102
。
现在,虽然我保留了旧配置,但我10.20.4.102
在同一命名空间中创建了一个新 PV,其标签与原始 PV 不同,如下所示
New Settings
metadata:
name: my-pv-1
namespace: pv-test
labels:
volume-type: pv-1
Old Settings
metadata:
name: my-pv
namespace: pv-test
labels:
volume-type: pv
这会在您的命名空间中创建一个新 PV,您可以在kubectl get pv
with 状态中看到,Available
而其他状态为 Bound
现在将您的 statefulset yaml 文件字段更新volume-type
为与新标签相同的新字段,pv
并将名称更改为volumeClaimTemplates
新名称。现在不要应用此设置。
New
volumeClaimTemplates:
- metadata:
name: pv-data-1
namespace: pv-test
selector:
matchLabels:
volume-type: pv-1
Old
volumeClaimTemplates:
- metadata:
name: pv-data
namespace: pv-test
selector:
matchLabels:
volume-type: pv
因为你肯定不能直接申请,这会引发类似的错误Forbidden: updates to statefulset spec for fields other than `replicas`, `template` and `updateStrategy` are forbidden.
。
现在,您可以删除并重新创建整体statefulset
,只需稍作停机。--cascade=false
或者你可以用flag做这个小技巧
kubectl delete statefulset mystatefulset -n pv-test --cascade=false
这只会删除有状态集而不是有状态集中的 pod,如果您监视命名空间中的所有资源,它将删除有状态集,但不会删除 pod 或任何资源。保持所有应用程序仍在访问正在运行的应用程序。
现在apply
更新的 statefulset 这将使用不同的 pvc 创建新的 statefulset。但是您的 pod 仍然指的是旧的 pvc 和 pv。
现在只需使用删除 podkubectl delete pod mypod-0 -n pv-test
这将删除 pod,但在后台的 statefulset 会创建一个带有新 pvc 的新 pod,因为它会被删除。现在,如果你 kubectl pv 和 pvc,你会发现会有一个额外的 pvc 和 pvAvailable
将被转换成Bound
pvc 并被 pvc 声明。
手动删除所有 pod,statefulset 负责娱乐。一切完成后,先手动删除旧pvc,再手动删除旧pv。
您可能已经尝试了所有这些并且知道所有这些,只是为了清楚起见,我在这里写了所有步骤,而不是模糊地解释。
希望这会有所帮助。
推荐阅读
- php - PHP | 输入控制语句不起作用
- sql - SQL Server 月末
- sql - 产品单价频繁变化时创建库存数据库
- string - 在 url 中使用字符串查询但指定字段集的自动填充复选框
- mysql - 从其他表更新 db avg 值中的字段
- vue.js - 如何让我的 v-show 在 Vue JS 中显示组件
- java - 无法弄清楚为什么我的选择排序作为 java 方法的实现不能按预期工作
- jquery - 使用 JQuery 向表单添加元素会导致提交时出现“无法解密防伪令牌”错误
- html - 仅设置图像高度属性在 HTML 中不起作用,但仅设置宽度属性有效
- docker - 无法在 Bitnami Dokuwiki 上创建用户