如何重命名持久卷索赔?

16

如何重命名PVC?我找不到证据表明这是可能的。


我尝试解决一个“设备上没有剩余空间”的问题。实质上,我的计划需要我调整服务数据持久化所使用的卷的大小。

不幸的是,我仍在使用Kubernetes 1.8.6 on GKE。它没有启用 PersistentVolumeClaimResize 准入插件:

因此,我必须手动尝试保存数据。我制定了以下计划:

  1. 创建一个新的更大的卷 PVC,
  2. 创建一个带有“受害者”PVC和新的更大PVC的临时容器,
  3. 复制数据,
  4. 删除“受害者”PVC,
  5. 重命名新的更大PVC以取代“受害者”。

有问题的PVC连接到StatefulSet,因此旧名称和新名称必须匹配(因为StatefulSet遵循卷命名约定)。

但我不知道如何重命名持久卷声明。


我刚意识到我搞错了。我不需要重命名任何东西。在复制数据之后,我只需要删除并重新创建受害者即可。 - oldhomemovie
检查一下我的答案,它有帮助吗? - Shahriar
嗨..你解决了你的问题吗? - Shahriar
4个回答

31

你的问题的答案是不行。在Kubernetes中没有办法更改任何元名称。

但是,有一种方法可以满足你的需求。

你想通过旧的PersistentVolumeClaim来声明你的新的更大的PersistentVolume。

假设,旧的PVC名为victim,新的PVC名为bigger。你想要通过victim PVC来声明为bigger创建的PV,因为你的应用程序已经在使用victim PVC。

按照以下步骤进行操作。

第一步:删除你的旧的PVC victim

第二步:使bigger的PV可用。

$ kubectl get pvc bigger
NAME      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
bigger    Bound     pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6   10Gi       RWO            standard       30s

编辑 PV pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6,将 persistentVolumeReclaimPolicy 设置为 Retain,这样删除 PVC 时不会删除 PV。

现在,删除 PVC bigger

$ kubectl delete pvc bigger

$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM            STORAGECLASS   REASON    AGE
pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6   10Gi       RWO            Retain           Released   default/bigger   standard                 3m

查看状态,PV已被释放。

现在,使该PV可供另一个PVC(我们的受害者)索赔。

再次编辑PV以删除claimRef。

$ kubectl edit pv pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6

$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6   10Gi       RWO            Retain           Available             standard                 6m

现在PV的状态是Available。

第3步: 通过victim PVC声明bigger PV

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: victim
spec:
  accessModes:
    - ReadWriteOnce
  volumeName: pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6
  resources:
    requests:
      storage: 10Gi

使用 volumeName pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6


kubectl get pvc,pv
NAME         STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc/victim   Bound     pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6   10Gi       RWO            standard       9s

NAME                                          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM            STORAGECLASS   REASON    AGE
pv/pvc-8badc3c2-08c5-11e8-b07a-080027b3e1a6   10Gi       RWO            Retain           Bound     default/victim   standard                 9m

最终:将persistentVolumeReclaimPolicy设置为Delete

这就是您的PVC victim如何获得更大的PV。


嗨,抱歉回复晚了。我还没有机会尝试你的解决方案,但仅仅看一眼,它似乎是可行的!我不知道你可以用 PV 来实现这样的技巧。谢谢! - oldhomemovie
嗨@Mir,我按照这些步骤操作了,我可以确认它们完美地运行。 - diegoubi
你知道在删除 PVC 时是否可以使用 --cascade=false 来防止删除 PV 吗?我知道当删除 StatefulSet 时使用它可以避免删除 Pods,但不确定它是否也适用于 PVCs。这将使过程更加简单。 - diegoubi
3
如果使用脚本编写而非 kubectl edit,可以使用以下两个 patch 命令示例。更改持久卷的回收策略: kubectl patch pv <name> -p "{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}"移除 spec.claimRefkubectl patch pv <name> --type json -p '[{"op": "remove", "path": "/spec/claimRef"}]' - bczoma

6

0

我无法验证这一点,但我相当确定对于GKE,您可以转到Google Cloud Console中的磁盘,并找到PV使用的磁盘并在那里调整大小。完成后,您应该能够登录连接的节点并在设备上运行resize2fs。这很不好,但是我相当确定这在过去的某个时候对我起作用过。

您无需卸载或复制即可执行此操作,这可以节省您的时间,特别是在磁盘正在运行或非常大的情况下。


嗨 Derek!我可以调整磁盘大小,这没有问题。我想要做的是调整持久卷索赔的大小,但是我的 Kubernetes 版本中没有这个功能。为了解决这个问题,我决定采用数据“复制”解决方案。这需要我重命名其中一个 PVC。但似乎这是不可能的... - oldhomemovie
哦,抱歉我可能完全忽略了所有的C。我知道在某些云中,调整持久卷的大小一直是一个麻烦,因为它不是自动化的。 - Derek Lemon

0
答案是,实际上是肯定的。
使用安装了Krewrename-pvc插件。
kubectl krew update
kubectl krew install rename-pvc

你应该可以像这样重新命名你的文件:
kubectl rename-pvc old-name new-name

请注意,如果出现问题,您应该创建数据备份。该存储库的此部分解释了其功能,基本上是通过将PV的claimRef更新为新的PVC来进行更新。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接