Как создать PVC / PV, поддерживаемый ранее существующим томом EBS?

#kubernetes

#kubernetes

Вопрос:

Допустим, у меня есть ранее существующий (сохраненный) том EBS, созданный с помощью PVC / PV, который был удален по ошибке. Этот том был создан следующим образом:

 ---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gp2-retain
parameters:
  fsType: ext4
  type: gp2
provisioner: kubernetes.io/aws-ebs
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: prometheus
  name: prometheus-server
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  storageClassName: gp2-retain
  volumeMode: Filesystem
  

и использовался модулем, созданным helm chart с

 helm install prometheus-current stable/prometheus server.persistentVolume.existingClaim=prometheus-server
  

Итак, этот EBS содержит некоторые файлы, созданные этим модулем, которые я хочу сохранить. Теперь нам удалось удалить PVC / PV, но том EBS был сохранен из-за reclaimPolicy .

Итак, я хочу воссоздать PersistingVolumeClaim и PersistentVolume таким образом, чтобы они указывали на этот конкретный идентификатор тома EBS aws://eu-west-1/vol-xxxxx . Как создать PVC без запуска динамической подготовки и создать новый PV, поддерживаемый совершенно новым томом EBS?

Ответ №1:

Вы можете «адаптировать» существующий EBS-том к новому PVC / PV. ключевые моменты:

  • Создайте PersistentVolume с .metadata.name по вашему выбору (например, vol-imported-prometheus-server и .spec.awsElasticBlockStore.volumeID равным aws://region/vol-xxxx
    • Если вы укажете volumeID , Kubernetes не будет пытаться выделить новый том EBS
  • Создайте PersistentVolumeClaim с spec.volumeName именем PV на предыдущем шаге
    • Если вы укажете volumeName , Kubernetes будет привязывать PVC к существующему PV вместо того, чтобы пытаться динамически создавать новый PV на основе StorageClass

Как этот пример:

 ---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: vol-imported-prometheus-server
spec:
  accessModes:
  - ReadWriteOnce
  awsElasticBlockStore:
    fsType: ext4
    volumeID: aws://eu-west-1c/vol-xxxxx
  capacity:
    storage: 8Gi
  persistentVolumeReclaimPolicy: Retain
  storageClassName: gp2-retain
  volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: prometheus
  name: imported-prometheus-server
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  storageClassName: gp2-retain
  volumeMode: Filesystem
  volumeName: vol-imported-prometheus-server
  

Если вы kubectl apply -f thatfile.yaml получите желаемый том PVC -> PV -> existing EBS.

 kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                   STORAGECLASS   REASON   AGE
vol-imported-prometheus-server             8Gi        RWO            Retain           Bound    prometheus/imported-prometheus-server   gp2-retain              15m

kubectl get pvc
NAME                         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
imported-prometheus-server   Bound    vol-imported-prometheus-server             8Gi        RWO            gp2-retain     16m
  

И затем вы можете использовать это имя PVC в helm вот так:

 helm install prometheus-current stable/prometheus server.persistentVolume.existingClaim=imported-prometheus-server 
  

где imported-prometheus-server имя только что созданного вами PVC.