Kubernetes:如何使用persistentVolumeReclaim动态执行PersistentVolumeClaim策略:回收

Ond*_*žka 5 kubernetes persistent-volumes persistent-volume-claims

我使用进行动态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  ???
Run Code Online (Sandbox Code Playgroud)

Tum*_*nvi 9

解决方法是创建新的 StorageClass 并reclaimPolicy: 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
Run Code Online (Sandbox Code Playgroud)

PS:现有StorageClass的reclaimPolicy无法编辑,但您可以删除StorageClass并重新创建它reclaimPolicy: Retain


Pet*_*rch 9

这不是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 
Run Code Online (Sandbox Code Playgroud)

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

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


小智 6

您可以在 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
Run Code Online (Sandbox Code Playgroud)

存储类.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
Run Code Online (Sandbox Code Playgroud)

打补丁

kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

Run Code Online (Sandbox Code Playgroud)


Ant*_*nko 4

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

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

以下是票证中有关如何避免 PV 被删除的对话中的小引述:

Speedline:偶然发现了这个,我也遇到了类似的问题。我想创建一个 Elasticsearch 集群,但要确保如果集群因任何原因出现故障,存储在永久性磁盘上的数据在重新启动时仍能得到维护。目前,我为每个承载数据的 Elasticsearch 部署都有一个 PersistentVolumeClaim。

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

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