我有一个使用PersistentVolumeClaim
配置的动态PersistentVolume
。
我想在 pod 完成后保留 PV。所以我想拥有persistentVolumeReclaimPolicy: Retain
所做的事情。
但是,这适用于PersistentVolume
,而不是PersistentVolumeClaim
(AFAIK(。
如何更改动态预配的 PV 的此行为?
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: {{ .Release.Name }}-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: gp2
resources:
requests:
storage: 6Gi
---
kind: Pod
apiVersion: v1
metadata:
name: "{{ .Release.Name }}-gatling-test"
spec:
restartPolicy: Never
containers:
- name: {{ .Release.Name }}-gatling-test
image: ".../services-api-mvn-builder:latest"
command: ["sh", "-c", 'mvn -B gatling:test -pl csa-testing -DCSA_SERVER={{ template "project.fullname" . }} -DCSA_PORT={{ .Values.service.appPort }}']
volumeMounts:
- name: "{{ .Release.Name }}-test-res"
mountPath: "/tmp/testResults"
volumes:
- name: "{{ .Release.Name }}-test-res"
persistentVolumeClaim:
claimName: "{{ .Release.Name }}-pvc"
#persistentVolumeReclaimPolicy: Retain ???
解决方法是使用reclaimPolicy: Retain
创建新的存储类,并在任何地方使用该存储类。
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: gp2-retain
annotations:
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
fsType: ext4
reclaimPolicy: Retain
PS:现有存储类的回收策略无法编辑,但您可以删除存储类并使用reclaimPolicy: Retain
重新创建
这不是OP的答案,但导致我来到这里的个人痒的答案是我根本不需要reclaimPolicy: Retain
。我需要一StatefulSet
。如果这适合您,请继续阅读:
我的痒是有一个PersistentVolume
被容器以持久的方式一遍又一遍地重用;这是使用docker
和docker-compose
卷时的默认行为。因此,新PersistentVolume
只创建一次:
# Create a new PersistentVolume the very first time
kubectl apply -f my.yaml
# This leaves the "volume" - the PersistentVolume - alone
kubectl delete -f my.yaml
# Second and subsequent times re-use the same PersistentVolume
kubectl apply -f my.yaml
我认为这样做的方法是使用reclaimPolicy: Retain
声明一个PersistentVolumeClaim
,然后在我的部署中引用它。但即使我reclaimPolicy: Retain
工作,每个kubectl apply
仍然会创建一个全新的PersistentVolume
。reclaimPolicy: Retain
只是确保旧的不会被删除。
但是没有。实现此用例的方法是使用StatefulSet
.它更简单,然后它的行为就像我习惯的docker和docker-compose一样。
您可以在pv.yaml或storageclass.yaml中配置它,或者使用补丁退出pv
pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /tmp
server: 172.17.0.2
storageclass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: gp2-retain
annotations:
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
fsType: ext4
reclaimPolicy: Retain
打补丁
kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
Kubernetes Github 上存在一个关于动态配置卷的回收策略的问题。
简短的回答是"否" - 您无法设置策略。
以下是票证中关于如何避免PV删除的对话中的小引文:
Speedline:偶然发现了这个,我正在经历一个类似的问题。我想创建一个 Elasticsearch 集群,但请确保如果集群因任何原因关闭,存储在永久磁盘上的数据在重新启动期间得到维护。我目前有一个 PersistentVolumeClaim 用于每个携带数据的 elasticsearch 部署。
JSAFRANE: @speedplane:只要你不删除PVC,它就会被维护。仅当 kuberenetes 看到绑定到 PVC 的 PV 并且该 PVC 不存在时,才会执行回收策略。
@jsafrane好的,知道了。所以只需要小心PVC,删除一个就像删除磁盘上的所有数据。