如何在 Longhorn 中保留 PersistenceVolume

Ral*_*lph 0 kubernetes longhorn

我已经设置了一个自我管理的 kubernetes 集群和longhorn作为分布式存储。安装非常简单。

我创建了一个这样的存储类:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: longhorn
  annotations:
    # make this class the default storage class
    storageclass.kubernetes.io/is-default-class: "true"

provisioner: driver.longhorn.io
reclaimPolicy: Retain
allowVolumeExpansion: true
parameters:
  numberOfReplicas: "3"
  staleReplicaTimeout: "2880" # 48 hours in minutes
  fromBackup: ""
Run Code Online (Sandbox Code Playgroud)

我可以创建一个新的 PersistenceVolume 并将其绑定到我的 pod(例如 postgres 服务器),现在可以轻松定义 PersistenceVolumeClaim:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: appdata
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 2Gi
Run Code Online (Sandbox Code Playgroud)

现在在我部署了我的 pod 之后,我可以看到一个 PV 被创建了(当然它正在工作)

kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM            STORAGECLASS   REASON   AGE
pvc-803d3061-457c-4023-9864-636c7a3f626a   2Gi        RWO            Retain           Bound    default/dbdata   longhorn                10d
Run Code Online (Sandbox Code Playgroud)

由于“保留”策略,当我删除我的 postgreSQL pod 时,我的 PV 仍然存在。但是当我再次重新创建我的 pod 时,会创建一个新的 PersistenceVolume。所以现在我有两个:

kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM            STORAGECLASS   REASON   AGE
pvc-803d3061-457c-4023-9864-636c7a3f626a   2Gi        RWO            Retain           Released   default/dbdata   longhorn                10d
pvc-9385b1ad-4c06-4bf2-b595-db6681334c3d   2Gi        RWO            Retain           Bound      default/dbdata   longhorn                10d
Run Code Online (Sandbox Code Playgroud)

到目前为止我不明白 - 这是我的问题 - 如何创建/声明具有自定义名称的 PersistenceVolume (没有随机 UUID)。我怎样才能告诉我的 POD 重用这个 PV?或者换一种方式问:我如何告诉 longhorn 创建一个具有给定名称而不是随机 UUID 的 PersistenceVolume?

Mal*_*ata 5

删除 PVC 时,对应的 PV 变为已发布。这个PV通常包含敏感数据,这就是为什么没有可能绑定到它,即使它是一个与前一个同名且位于相同命名空间的 PVC - 谁知道谁在试图窃取数据!

此处需要管理员干预。有两种选择:

  1. 将 PV 提供给所有人 - 删除PV.Spec.ClaimRef。这个 PV 可以绑定到任何 PVC(假设容量、访问模式和选择器匹配)
  2. 使 PV 可用于特定 PVC - 预填充PV.Spec.ClaimRef 指向 PVC 的指针。保留PV.Spec.ClaimRef空的 UID,因为此时 PVC 不需要存在并且您不知道 PVC 的 UID。此 PV 只能绑定到指定的 PVC。

如果您专注于动态配置,通常 pvc 具有静态名称,因为您手动创建它,然后根据声明中的信息生成 pv。

看看这里:reusing-persistent-volume

如果有帮助,请告诉我。