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, удаление одного - это как удаление всех данных на диске.