【问题标题】:Reuse PV in Deployment在部署中重用 PV
【发布时间】:2021-07-05 15:13:18
【问题描述】:

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

注意:我已经有一个定义了 storageClass“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 的状态为“已发布”而不是“可用”

我意识到,如果将 patch 应用到 PV 以删除 claimRef.uid :

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

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

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

有什么办法吗?

【问题讨论】:

  • 不,没有人提供自动化解决方案,这正是我所需要的。我找到了一种使用 Helm Hooks 来应用补丁的方法......但我正在寻找一个更简单的解决方案。

标签: kubernetes persistent-volumes persistent-volume-claims


【解决方案1】:

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

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

【讨论】:

  • 存储类“rook-cephfs”具有保留策略。当我删除所有资源时,PV 的状态是“已发布”而不是“可用”
  • 你可以试试reclaimPolicy: Recycle吗?
  • 不,我不想回收,因为我不想删除PV中的数据。无论如何回收已被弃用。
【解决方案2】:

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

基于official documentation,不幸的是这是不可能的。先看Reclaim Policy

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

因此,Reclaim Policy 有 2 个受支持的选项:DeleteRetain

Delete 选项不适合你,因为,

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 2019-03-26
    • 2020-11-27
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2021-08-08
    相关资源
    最近更新 更多