Kubernetes:如何使用persistentVolumeReclaimPolicy进行动态PersistentVolumeClaim:收回

hgb9j2n6  于 2023-06-05  发布在  Kubernetes
关注(0)|答案(4)|浏览(198)

我有一个使用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  ???
bnlyeluc

bnlyeluc1#

解决方法是使用reclaimPolicy: Retain创建新的StorageClass,并在任何地方使用该StorageClass。

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:现有StorageClass的reclaimPolicy不可编辑,但可以删除StorageClass,使用reclaimPolicy: Retain重新创建

x4shl7ld

x4shl7ld2#

这不是OP的答案,但对导致我在这里的个人渴望的答案是,我根本不需要reclaimPolicy: Retain。我需要一个StatefulSet代替。如果这是给你的,请继续阅读:
我的愿望是有一个PersistentVolume,它可以被容器以持久的方式反复重用;使用dockerdocker-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上创建一个全新的PersistentVolumereclaimPolicy: Retain只是确保旧的没有被删除。
实现这个用例的方法是使用StatefulSet。它简单得多,然后它的行为就像我习惯的docker和docker-compose一样。

vddsk6oq

vddsk6oq3#

您可以在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"}}'
jjjwad0x

jjjwad0x4#

There是Kubernetes Github上关于动态配置卷的回收策略的问题。
简短的回答是“不”-您不能设置策略。
下面是从如何避免PV删除票中的对话的小报价:

快速通道:偶然发现了这个问题,我正在经历一个类似的问题。我想创建一个Elasticsearch集群,但要确保如果集群因为任何原因而关闭,存储在持久磁盘上的数据在重启时得到维护。我目前有一个PersistentVolumeClaim,用于每个携带数据的elasticsearch部署。
***********:@speedplane:只要你不删除PVC,它就会被保留。只有当kuberenetes看到一个绑定到PVC的PV并且PVC不存在时,才会执行回收策略。

@jsafrane好的,我知道了。因此,必须小心处理PVC,删除一个PVC就像删除磁盘上的所有数据。

相关问题