在部署中重用 PV

问题描述

我需要什么? 具有 2 个从同一卷 (PV) 读取的 POD 的部署。卷必须以 RW 模式在 PODS 之间共享。

注意:我已经有一个带有定义的存储类“rook-cephfs”的 rook ceph,它允许此功能。该 SC 也有保留政策

这就是我所做的:

apiVersion: v1
kind: PersistentVolumeClaim
Metadata:
  name: data-Nginx
spec:
  accessModes:
    - "ReadWriteMany"
  resources:
    requests:
      storage: "10Gi"
  storageClassName: "rook-cephfs"
---
apiVersion: apps/v1
kind: Deployment
Metadata:
  name: Nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: Nginx
  template:
    Metadata:
      labels:
        app: Nginx
    spec:
      serviceAccountName: default
      containers:
      - name: Nginx
        image: Nginx:latest
        imagePullPolicy: Always
        ports:
          - name: http
            containerPort: 80
        volumeMounts:
          - name: pvc-data
            mountPath: /data
      volumes:
      - name: pvc-data
        persistentVolumeClaim:
          claimName: data-Nginx

它有效!两个 Nginx 容器共享该卷。

问题: 如果删除所有资源(PV 除外)并重新创建它们,则会创建一个新的 PV,而不是重用旧的 PV。所以基本上,新卷是空的。

旧 PV 的状态变为“已发布”而不是“可用”

我意识到如果对 PV 应用补丁删除 claimRef.uid :

kubectl patch pv $PV_NAME --type json -p '[{"op": "remove","path": "/spec/claimRef/uid"}]'

然后重新部署它就可以了。 但我不想做这个手动步骤。我需要这个自动化。

我也用 statefulSet 尝试了相同的配置,但遇到了同样的问题。

有什么解决办法吗?

解决方法

确保在您的 StorageClass 中使用 reclaimPolicy: Retain。它将告诉 Kubernetes 重用 PV。

参考:https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/

,

但我不想执行此手动步骤。我需要这个自动化。

根据official documentation,不幸的是这是不可能的。首先看Reclaim Policy

由 StorageClass 动态创建的 PersistentVolume 将在类的 reclaimPolicy 字段中指定回收策略,该字段可以是 DeleteRetain。如果创建 StorageClass 对象时未指定 reclaimPolicy,则默认为 Delete

因此,我们为 Reclaim Policy 提供了 2 个支持的选项:DeleteRetain

Delete 选项不适合您,因为,

对于支持 Delete 回收策略的卷插件,删除会从 Kubernetes 中删除 PersistentVolume 对象,以及外部基础设施中的相关存储资产,例如 AWS EBS、GCE PD、Azure 磁盘、或煤渣体积。动态配置的卷继承 reclaim policy of their StorageClass,默认为 Delete。管理员应根据用户的期望配置StorageClass; otherwise,the PV must be edited or patched after it is created

Retain 选项允许您手动回收资源:

当 PersistentVolumeClaim 被删除时,PersistentVolume 仍然存在并且该卷被视为“已释放”。但它尚不可用于其他索赔,因为前一个索赔人的数据仍保留在卷上。管理员可以通过以下步骤手动回收卷。

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