【问题标题】:How to rename persistence volume claim?如何重命名持久卷声明?
【发布时间】:2018-07-02 09:07:52
【问题描述】:

是否可以重命名 PVC?我似乎找不到任何证据。


我正在尝试缓解我刚刚偶然发现的“设备没有剩余空间”问题。本质上,我的计划要求我调整卷的大小,我的服务在该卷上保留其数据。

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

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

  1. 创建一个新的、更大体积的 PVC,
  2. 创建一个带有附加“受害者”pvc 和一个新的更大 pvc 的临时容器,
  3. 复制数据,
  4. 丢弃“受害者”PVC,
  5. 重命名新的更大的 pvc 来代替“受害者”。

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

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

【问题讨论】:

  • 我才意识到我搞砸了。我不需要重命名任何东西。复制数据后,我将删除并重新创建受害者。
  • 检查我的答案。会有帮助吗?
  • 嗨.. 你的问题解决了吗?

标签: kubernetes persistence rename google-kubernetes-engine


【解决方案1】:

使用 Kubernetes 1.11+,您可以通过简单地修改 PVC 的存储请求 (https://kubernetes.io/blog/2018/07/12/resizing-persistent-volumes-using-kubernetes/) 来执行按需调整大小。

GKE 支持这一点(我自己用过几次),而且非常简单,没有戏剧性。

【讨论】:

    【解决方案2】:

    您的问题的答案是。在 Kubernetes 中无法更改任何元名称。

    但是,有一种方法可以满足您的要求。

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

    可以说,旧 PVC 名为 victim,新 PVC 名为 bigger。您想要声明由victim PVC 为bigger 创建的 PV。因为您的应用程序已经在使用victim PVC。

    按照这些步骤进行破解。

    第 1 步:删除旧的 PVC victim

    第 2 步: 使 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 声明,我们的 victim

    再次编辑 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 的状态是可用的。

    第 3 步:通过victimPVC 声明bigger PV

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

    使用卷名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 搞出这样的把戏。谢谢!
    • 嗨@Mir 我按照这些步骤进行操作,我可以确认它们运行良好。
    • 不知道是否可以在删除PVC时使用--cascade=false防止它删除PV?我知道这在删除 StatefulSet 以不删除 Pod 但不确定它是否也适用于 PVC 时有效。这将使过程更容易。
    • 如果使用脚本和kubectl edit Patch persistentVolumeReclaimPolicy: kubectl patch pv <name> -p "{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}" Patch to remove spec.claimRef kubectl patch pv <name> --type json -p '[{"op": "remove", "path": "/spec/claimRef"}]',则可以使用这两个补丁命令示例
    【解决方案3】:

    我无法验证这一点,但我相当肯定,对于 GKE,您可以转到 Google Cloud Console 中的磁盘并找到 PV 使用的磁盘并在那里调整其大小。完成后,您应该能够登录到它所连接的节点并在设备上运行resize2fs。这很脏,但相当肯定这在过去对我有用过一次。

    您无需卸载或复制即可执行此操作,如果磁盘是活动的或较大的,这可以为您节省时间。

    【讨论】:

    • 嗨,德里克!我可以调整磁盘大小,这没有问题。我想做的是调整持久卷声明的大小,但我的 Kubernetes 版本中没有该功能。为了解决这个问题,我决定使用数据“复制”解决方案。它要求我重命名其中一个 PVC。但这似乎是不可能的......
    • 抱歉,我一定完全错过了C。我知道调整 Persistent Volumes 的大小对我来说很烦人,因为它在某些云中不是自动化的。
    猜你喜欢
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2020-11-08
    相关资源
    最近更新 更多