K8s nfs静态pv已满,如何使用新的备份nfs静态pv更新“ pvc / pv”而无需全部重新安装

问题描述 投票:0回答:1

问题:

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

我尝试:

  • PV NFS pathlimitStorage更新到新的备份服务器,但k8s不允许。
  • 使用新的PV在新的备份服务器上更新[[现有的PVC,但k8仍然不允许。
错误消息:

#持久卷声称“ data-core-container-log-elasticsearch-data-0”无效:#*规范:禁止:创建后不可更改,除了resources.bound声明的请求
kubernetes backup nfs rancher
1个回答
2
投票
可能有几种解决方案,这是我根据您在上述场景中提到的所有内容解决的。

[假设nfs驱动器已装满,请在10.20.4.101处使用nfs量声明的状态集。我重定位并将所有数据复制到另一个虚拟机10.20.4.102

现在,当我保留旧配置时,我在同一个名称空间中使用10.20.4.102创建了一个新的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中看到状态为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标志

来完成此小技巧

kubectl delete statefulset mystatefulset -n pv-test --cascade=false

这只会删除状态集而不是状态集中的Pod,如果您监视命名空间中的所有资源,它将删除状态集,而不是Pod或任何资源。使所有应用程序仍然可以访问正在运行的应用程序。

现在apply更新的状态集将创建具有不同pvc的新状态集。但是您的广告连播仍会引用旧的pvc和pv。

现在只需使用kubectl delete pod mypod-0 -n pv-test删除广告连播>

这将删除pod,但是在后台的statefulset会在删除时使用新的pvc创建一个新pod。现在,如果您kubectl pv和pvc,您会发现会有另外一个pvc,并且带有Available的pv将变成Bound,并且将由pvc声明。

手动删除所有吊舱,有状态集负责娱乐。完成所有操作后,请先手动删除旧的pvc,然后再删除旧的pv。

您可能已经尝试了所有这些步骤,并且都知道了,只是为了清楚起见,我在这里写下了所有步骤,而不是含糊其词。

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.