如何手动恢复PV

Mic*_*Reh 5 kubernetes pv

根据官方文档https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/的“保留”政策,可以手动恢复PV。这实际上是什么意思,有没有一种工具可以使我从该“保留的” PV中读取数据并将其写入另一个PV,或者这意味着您可以安装该卷手册以获取访问权限?

小智 9

正如 Tummala Dhanvi 在回答中所述,spec.claimRef必须解决该部分。spec.claimRef如果您只有一个 PV,则删除整个PV 可能会很有用,但如果您有多个 PV 需要“拯救”,这将变得非常令人讨厌。

第一步是在删除PVC之前确保 PV 具有Retain回收策略。您可以编辑或修补 PV 来实现此目的

  • kubectl edit pv pvc-73e9252b-67ed-4350-bed0-7f27c92ce826
    • 找出spec.persistentVolumeReclaimPolicy问题的关键
    • 输入Retain其值
    • 保存并退出
  • 或者,在一个命令中kubectl patch pv pvc-73e9252b-67ed-4350-bed0-7f27c92ce826 -p "{\"spec\":{\"persistentVolumeReclaimPolicy\":\"Retain\"}}"

现在您可以删除 PVC(通过使用helm或其他方式),并且 PV 将不会被删除。

要成功地将 PV 重新安装到所需的 Pod,您必须再次编辑 PV 配置,这次是该spec.claimRef部分。但不要删除整个部分。相反,仅删除resourceVersionuid键。结果部分看起来像这样

...
  capacity:
    storage: 16Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: database
    namespace: staging
  nodeAffinity:
...
Run Code Online (Sandbox Code Playgroud)

对所有 PV 重复此操作,随后kubectl get pv将显示它们在输出中的状态Available。通过保持spec.claimRef.namespec.claimRef.namespace密钥完好无损,我们确保具有相应的新 PVC specstaging/database在我的例子中)将绑定到它应该绑定的确切 PV。

另外,请确保您的新声明未指定比 PV 实际拥有的存储容量更大的存储容量(似乎新声明的容量可能小于现有 PV 的容量)。如果新的 PVC 拥有更大的存储空间,则会创建一个新的 PV。最好保持相同。

题外话:如果storageClass您使用的允许调整卷大小,您可以稍后调整它的大小;这里解释了如何: https: //kubernetes.io/blog/2018/07/12/resizing-persistent-volumes-using-kubernetes/

我在这方面的经历非常有压力。我已经拍了 6 个 PV,谢天谢地,都在Retain模式中。由于某种原因,新的部署部署被卡住了,两个 Pod 就是不想终止。最后,我最终删除了整个部署(使用helm),重新启动集群节点,然后重新重新部署。这导致创建了6 个新PV!

我找到了这个帖子,然后删除了spec.claimRef所有的PV。再次删除并部署安装会导致 PV 被重新使用,但它们没有安装在应有的位置,数据也不存在。经过大量挖掘后,我发现该database卷已安装到 RabbitMQ pod、mongodbElasticSearch 等。

我花了大约十几次才把这件事做好。幸运的是,对我来说,混合安装卷并没有破坏任何原始数据。Pod 初始化并没有清除该卷,只是在那里写入了它们的内容。

希望这能减轻一些严重的头痛!


Jav*_*r81 6

共有三种回收策略,这些策略定义了删除绑定卷声明后持久卷会发生什么情况

  • 保留
  • 删除
  • 回收

删除表示外部基础架构中的永久卷以及关联的存储资产被删除。

回收将清理卷rm -rf / thevolume / *,然后将其用于新的永久卷声明。

保留使持久卷保持释放状态,不允许新的持久卷声明对其进行回收。整个回收过程是手动的。您需要自己删除永久卷。您可以从存储资产中备份数据,然后再删除数据。然后,您可以删除该存储资产或为该资产创建新的永久卷。

如果您想使用Kubernetes将数据写入另一个永久卷,则可以使用Job复制数据。

在那种情况下,请确保您使用ROX-ReadOnlyMany或RWX-ReadWriteMany持久卷访问模式,并启动运行一个容器的作业,该容器要求使用选择器备份该持久卷并声明另一个目标备份卷。然后通过容器复制数据。

或者,您可以在Kubernetes之外进行备份。然后,您的方法确实取决于您所使用的存储资产的类型。例如,如果您正在使用NFS,则可以挂载源和目标,并通过命令行复制数据。

我设定的两个选项或多或少都是手动备份策略。如果您想要针对生产工作负载的更复杂的备份策略,则可以查看Stash-Kubernetes中用于生产工作负载的磁盘备份


Tum*_*nvi 5

手动恢复卷的过程如下。

即使删除了PVC,您也可以使用同一PV连同数据一起安装到不同的Pod(PV必须存在,如果storageclass的回收策略是Retain,通常将存在PV)

验证PV处于释放状态。(即,目前没有pvc要求它)

 ?  ~ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                     STORAGECLASS   REASON   AGE
pvc-eae6acda-59c7-11e9-ab12-06151ee9837e   16Gi       RWO            Retain           Released   default/dhanvi-test-pvc   gp2                     52m
Run Code Online (Sandbox Code Playgroud)

编辑PV(kubectl edit pv pvc-eae6acda-59c7-11e9-ab12-06151ee9837e)并删除spec.claimRef部分。PV索赔将像下面这样未定。

 ?  ~ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pvc-eae6acda-59c7-11e9-ab12-06151ee9837e   16Gi       RWO            Retain           Available           gp2                     57m
Run Code Online (Sandbox Code Playgroud)

然后使用PVC声明PV,如下所示。

---

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: dhanvi-test-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 16Gi
  volumeName: "pvc-eae6acda-59c7-11e9-ab12-06151ee9837e"
Run Code Online (Sandbox Code Playgroud)

可以在以下吊舱中使用。

volumes:
- name: dhanvi-test-pv
  persistentVolumeClaim:
    claimName: dhanvi-test-pvc
Run Code Online (Sandbox Code Playgroud)

更新:卷克隆可能会帮助 https://kubernetes.io/blog/2019/06/21/introducing-volume-cloning-alpha-for-kubernetes/

  • 您的回答可能会阻止很多人被解雇!:D (3认同)