如何重命名持久卷声明?

How to rename persistence volume claim?

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


我正在尝试缓解我刚刚偶然发现的 "No space left of device" 问题。本质上,我的计划要求我调整卷的大小,我的服务在该卷上保留其数据。

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

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

  1. 创建一个新的、更大容量的 PVC,
  2. 创建一个带有附加 "victim" pvc 和一个更大的新 pvc 的临时容器,
  3. 复制数据,
  4. 掉落 "victim" PVC,
  5. 重命名 新的更大的 PVC 以取代 "victim"。

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

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

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

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

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

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

您想通过旧的 PersistentVolumeClaim 申请新的更大 PersistentVolume。

比方说,名为 victim 的旧 PVC 和名为 bigger 的新 PVC。您想要领取由 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的状态是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

使用卷名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 变大了。

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

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