K8s nfs static pv full,如何使用新的备份nfs static pv更新“ pvc / pv”而无需重新安装所有

时间:2019-12-26 03:58:35

标签: kubernetes backup nfs rancher

问题:

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

我尝试什么:

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

错误消息:

  

#持久卷声称“ data-core-container-log-elasticsearch-data-0”无效:
  #*规范:禁止:创建后除了资源,绑定声明请求之外都是不变的

1 个答案:

答案 0 :(得分: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。

您可能已经尝试了所有这些方法,并且都知道它们,只是为了清楚起见,我在这里写下了所有步骤,而不是隐约地解释。

希望这会有所帮助。