12

PersistentVolume使用PersistentVolumeClaim.

我想在吊舱完成后保留 PV。所以我想拥有什么persistentVolumeReclaimPolicy: Reclaim

但是,这适用于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  ???
4

4 回答 4

4

解决方法是创建新的 StorageClassreclaimPolicy: Retain并在任何地方使用该 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

于 2019-04-05T10:02:04.473 回答
3

这不是 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 

我认为这样做的方法是声明一个PersistentVolumeClaimwithreclaimPolicy: Retain然后在我的部署中引用它。但即使我开始reclaimPolicy: Retain工作,PersistentVolume每个kubectl apply. reclaimPolicy: Retain只是确保旧的没有被删除。

但不是。实现此用例的方法是使用StatefulSet. 它更简单,然后它的行为就像我习惯使用 docker 和 docker-compose 一样。

于 2021-01-04T10:19:03.043 回答
3

Kubernetes Github 上有一个关于动态配置卷的回收策略的问题。

简短的回答是“否” - 您无法设置策略。

这是票证中关于如何避免删除 PV 的对话中的小引语:

Speedline:偶然发现了这个,我正在经历一个类似的问题。我想创建一个 Elasticsearch 集群,但要确保如果集群由于某种原因出现故障,存储在永久磁盘上的数据会在重启期间得到维护。我目前有一个 PersistentVolumeClaim 用于承载数据的弹性搜索的每个部署。

jsafrane:@speedplane:只要您不删除 PVC,它就会被维护。仅当 kuberenetes 看到绑定到 PVC 且 PVC 不存在的 PV 时,才会执行回收策略。

@jsafran好的,明白了。所以只需要小心PVC,删除一个就像删除磁盘上的所有数据一样。

于 2018-05-22T13:44:06.027 回答
1

你可以在 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

存储类.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"}}'

于 2020-08-30T03:58:42.833 回答