问题描述
我需要什么? 具有 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
字段中指定回收策略,该字段可以是 Delete
或 Retain
。如果创建 StorageClass 对象时未指定 reclaimPolicy
,则默认为 Delete
。
因此,我们为 Reclaim Policy
提供了 2 个支持的选项:Delete
或 Retain
。
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 仍然存在并且该卷被视为“已释放”。但它尚不可用于其他索赔,因为前一个索赔人的数据仍保留在卷上。管理员可以通过以下步骤手动回收卷。
- 删除 PersistentVolume。删除 PV 后,外部基础设施(例如 AWS EBS、GCE PD、Azure 磁盘或 Cinder 卷)中的关联存储资产仍然存在。
- 手动相应地清理相关存储资产上的数据。
- 手动删除关联的存储资产,或者如果您想重复使用相同的存储资产,请使用存储资产定义创建一个新的 PersistentVolume。