Kubernetes: как сделать динамический PersistentVolumeClaim с persistentVolumeReclaimPolicy: Восстановить

У меня динамический PersistentVolume обеспечение с использованием PersistentVolumeClaim,

Я хотел бы сохранить PV после того, как стручок сделан. Поэтому я хотел бы иметь то, что persistentVolumeReclaimPolicy: Reclaim делает.

Однако это применимо к PersistentVolumeне PersistentVolumeClaim (НАСКОЛЬКО МНЕ ИЗВЕСТНО).

Как я могу изменить это поведение для динамически подготовленных 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 ответа

Обходным путем будет создание нового 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

PS: reclaimPolicy существующего StorageClass не может быть отредактирован, но вы можете удалить StorageClass и воссоздать его с reclaimPolicy: Retain

Это не ответ на ОП, но ответ на личный зуд, который привел меня сюда, заключается в том, что мне это вообще не нужно. мне нуженвместо. Читайте дальше, если это для вас:

Мой зуд состоял в том, чтобы постоянно использовать контейнер снова и снова; способ, который является поведением по умолчанию при использовании dockerа также docker-composeтома. Так что новый создается только один раз:

      # 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 

И я подумал, что способ сделать это — объявить PersistentVolumeClaimс, а затем укажите это в моем развертывании. Но даже когда я начал работать, совершенно новый PersistentVolumeпо-прежнему создается на каждом kubectl apply. 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:

Спидлайн: Наткнулся на это, и я прохожу аналогичную проблему. Я хочу создать кластер Elasticsearch, но убедитесь, что если кластер выйдет из строя по какой-либо причине, данные, хранящиеся на постоянных дисках, будут сохраняться при перезапуске. В настоящее время у меня есть один PersistentVolumeClaim для каждого развертывания эластичного поиска, который переносит данные.

jsafrane: @speedplane: он поддерживается до тех пор, пока вы не удалите PVC. Политика восстановления выполняется только в том случае, если kuberenetes видит PV, который был связан с PVC, и PVC не существует.

@jsafrane хорошо, понял. Так что просто нужно быть осторожным с PVC, удаление одного - это как удаление всех данных на диске.

Другие вопросы по тегам