首页 > 解决方案 > K8s nfs 静态 pv 已满,如何使用新备份 nfs 静态 pv 更新“pvc/pv”而不重新安装所有

问题描述

问题:

我有一个使用静态 NFS PV 的弹性集群。如何将这些数据移动到另一台服务器有更多空间(already did, just copy it)保持应用程序应用新的备份数据而无需重新安装所有内容。我在 Centos 7 上使用 Rancher(没有 VM Sphere)。

我尝试什么:

错误信息:

# persistentvolumeclaims "data-core-container-log-elasticsearch-data-0" 无效:
# * spec: Forbidden: 在创建后是不可变的,除了 resources.requests 用于绑定声明

标签: kubernetesbackupnfsrancher

解决方案


可能有几种解决方案,这就是我在上述场景中提到的所有内容的结果。

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 pvwith 状态中看到,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将被转换成Boundpvc 并被 pvc 声明。

手动删除所有 pod,statefulset 负责娱乐。一切完成后,先手动删除旧pvc,再手动删除旧pv。

您可能已经尝试了所有这些并且知道所有这些,只是为了清楚起见,我在这里写了所有步骤,而不是模糊地解释。

希望这会有所帮助。


推荐阅读