【问题标题】:Kubernetes: how to do dynamic PersistentVolumeClaim with persistentVolumeReclaimPolicy: ReclaimKubernetes:如何使用 persistentVolumeReclaimPolicy 进行动态 PersistentVolumeClaim:回收
【发布时间】:2018-05-22 00:25:07
【问题描述】:

我使用PersistentVolumeClaim 进行动态PersistentVolume 配置。

我想在 pod 完成后保留 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  ???

【问题讨论】:

    标签: kubernetes persistent-volumes persistent-volume-claims


    【解决方案1】:

    解决方法是使用 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重新创建

    【讨论】:

    • 问题在于,我现在从可移植的东西 (storageClassName: default) 转向通过硬编码 provisioner: kubernetes.io/aws-ebs 引入 AWS 特定的东西。 :-(
    • 正确,如果需要,您也可以将默认存储类更改为这个。
    • 是的,但我不能声明 StorageClass,我声明的唯一内容是 reclaimPolicy: Retain,因此我的 .yaml 文件将是可移植的。
    【解决方案2】:

    这不是 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 工作,一个全新的PersistentVolume 仍然会在每个kubectl apply 上创建。 reclaimPolicy: Retain 只是确保旧的没有被删除。

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

    【讨论】:

      【解决方案3】:

      There 是 Kubernetes Github 上关于动态供应卷的回收政策的问题。

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

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

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

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

      @jsafrane 好的,知道了。所以只需要小心PVC,删除一个就像删除磁盘上的所有数据。

      【讨论】:

      • 不幸的是,就我而言,这是在helm test 内,Helm 会在最后删除所有资源。该项目已结冰,但我稍后再试..
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        • 1970-01-01
        • 1970-01-01
        • 2022-10-23
        • 2018-12-06
        • 2018-12-23
        相关资源
        最近更新 更多