首页 > 解决方案 > 如何使 PersistentVolumeClaim 重新获得对动态配置的已发布 PersistentVolume 的访问权限

问题描述

我已经使用以下 k8s 资源文件从具有保留 reclaimPolicy 的自定义存储类动态创建/配置了 PVC 和 PV。

# StorageClass yaml spec
# kubectl apply -f storage-class.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd
  fstype: ext4
  replication-type: none
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate
# PersistentVolumeClaim yaml specs
# kubectl apply -f mysql-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: test-mysql
  name: test-mysql-pv-claim
spec:
  storageClassName: "fast-ssd"
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 51G

以下是重现我的场景的步骤顺序:

ubuntu@ubuntu-ThinkPad-X230-Tablet:/home/ubuntu/test$ kubectl apply -f mysql-pvc.yaml 
persistentvolumeclaim/test-mysql-pv-claim created

ubuntu@ubuntu-ThinkPad-X230-Tablet:/home/ubuntu/test$ kubectl get pvc,pv
NAME                                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/test-mysql-pv-claim   Bound    pvc-a6bd789c-9e3c-43c8-8604-2e91b2fee616   48Gi       RWO            fast-ssd       7s

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS   REASON   AGE
persistentvolume/pvc-a6bd789c-9e3c-43c8-8604-2e91b2fee616   48Gi       RWO            Retain           Bound    default/test-mysql-pv-claim   fast-ssd                6s

ubuntu@ubuntu-ThinkPad-X230-Tablet:/home/ubuntu/test$ kubectl delete -f mysql-pvc.yaml 
persistentvolumeclaim "test-mysql-pv-claim" deleted

ubuntu@ubuntu-ThinkPad-X230-Tablet:/home/ubuntu/test$ kubectl get pvc,pv
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                         STORAGECLASS   REASON   AGE
persistentvolume/pvc-a6bd789c-9e3c-43c8-8604-2e91b2fee616   48Gi       RWO            Retain           Released   default/test-mysql-pv-claim   fast-ssd                44s

ubuntu@ubuntu-ThinkPad-X230-Tablet:/home/ubuntutest$ kubectl apply -f mysql-pvc.yaml 
persistentvolumeclaim/test-mysql-pv-claim created

ubuntu@ubuntu-ThinkPad-X230-Tablet:/home/ubuntu/test$ kubectl get pvc,pv

NAME                                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/test-mysql-pv-claim   Bound    pvc-fbc266ab-60b0-441b-a789-84f950071390   48Gi       RWO            fast-ssd       6m6s

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                         STORAGECLASS   REASON   AGE
persistentvolume/pvc-a6bd789c-9e3c-43c8-8604-2e91b2fee616   48Gi       RWO            Retain           Released   default/test-mysql-pv-claim   fast-ssd                7m6s
persistentvolume/pvc-fbc266ab-60b0-441b-a789-84f950071390   48Gi       RWO            Retain           Bound      default/test-mysql-pv-claim   fast-ssd                6m5s

正如我们从输出的最后一部分看到的,新 PVC 绑定到新 PV,而不是旧发布的 PV。

那么我们是否可以在 mysql-pvc.yaml 文件中进行一些更改,以便我们的 PVC 可以再次重新分配/绑定到旧版本 PV,因为该 PV 将包含我们需要的重要数据?

标签: kubernetesgoogle-kubernetes-engine

解决方案


当您的回收策略为“保留”时,pvc YAML 中的任何更改都将不起作用。

根据 Kubernetes 文档:

Retain 回收策略允许手动回收资源。PersistentVolumeClaim删除后,仍然PersistentVolume存在,并且该卷被视为“已释放”。但它还不能用于另一个索赔,因为前一个索赔人的数据仍在卷上。管理员可以通过以下步骤手动回收卷。

  • 删除PersistentVolume. 删除 PV 后,外部基础设施(例如 AWS EBS、GCE PD、Azure 磁盘或 Cinder 卷)中的关联存储资产仍然存在。
  • 相应地手动清理相关存储资产上的数据。
  • 手动删除关联的存储资产,或者如果您想重复使用相同的存储资产,PersistentVolume请使用存储资产定义创建一个新的。

参考: https ://kubernetes.io/docs/concepts/storage/persistent-volumes/#retain


推荐阅读