Клонирование томов в Kubernetes с Cinder CSI

Создание клона тома

Чтобы создать клон тома:

  1. Создайте файл манифеста для исходного PVC, например, pvc-source.yaml:
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <имя исходного PVC>
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
      storageClassName: <тип диска>
    где:
    • <имя исходного PVC> — имя PVC, который будет использоваться для клонирования, например, pvc-source;
    • <тип диска>тип диска.
    Примените созданный манифест:
    kubectl apply -f pvc-source.yaml
  2. Создайте файл манифеста для пода, который будет использован для клонирования, например, pod-source.yaml:
    apiVersion: v1
    kind: Pod
    metadata:
      name: <имя исходного пода>
    spec:
      containers:
      - name: app
        image: busybox
        command: ["/bin/sh"]
        args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
        volumeMounts:
        - name: data
          mountPath: /data
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: <имя исходного PVC>
    где:
    • <имя исходного пода> — имя пода, который будет использован для клонирования, например, pod-source;
    • <имя исходного PVC> — имя ранее созданного PVC, например, pvc-source.
    Примените созданный манифест:
    kubectl apply -f pod-source.yaml
    Дождитесь записи данных, это занимает несколько секунд.
  3. Создайте файл манифеста для клона PVC, например, pvc-clone.yaml:
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <имя клона PVC>
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
      storageClassName: <тип диска>
      dataSource:
        name: <имя исходного PVC>
        kind: PersistentVolumeClaim
    где:
    • <имя клона PVC> — имя создаваемого клона PVC, например, pvc-clone;
    • <тип диска>тип диска;
    • <имя исходного PVC> — имя исходного PVC, например, pvc-source.
    Примените созданный манифест:
    kubectl apply -f pvc-clone.yaml
  4. Проверьте статус клона:
    kubectl get pvc <имя клона PVC>
    NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-clone   Bound    pvc-uuid                                   1Gi        RWO            cinder-csi     10s
    Статус клона должен быть Bound.

Примечание

Клон создаётся синхронно. Время зависит от размера тома. Подробнее см. CSI Volume Cloning.

Создание пода из клона

Чтобы создать под из клона:

  1. Создайте файл манифеста клонируемого пода, например, pod-clone.yaml:
    apiVersion: v1
    kind: Pod
    metadata:
      name: <имя клонированного пода>
    spec:
      containers:
      - name: app
        image: busybox
        command: ["/bin/sh"]
        args: ["-c", "cat /data/out.txt && echo '---' && date -u >> /data/out.txt && cat /data/out.txt"]
        volumeMounts:
        - name: data
          mountPath: /data
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: <имя клона PVC>
    где:
    • <имя клонированного пода> — имя создаваемого пода, например, pod-clone;
    • <имя клона PVC> — имя ранее созданного клона PVC, например, pvc-clone.
    Примените созданный манифест:
    kubectl apply -f pod-clone.yaml
  2. Проверьте данные:
    kubectl logs <имя клонированного пода>
    Mon Sep 30 14:41:23 UTC 2025
    Mon Sep 30 14:41:28 UTC 2025
    ---
    Mon Sep 30 14:41:23 UTC 2025
    Mon Sep 30 14:41:28 UTC 2025
    Mon Sep 30 14:41:35 UTC 2025
    В результате данные из исходного тома будут скопированы, новые записи будут добавляться в клонированный под независимо.

Примечание

Изменения в клоне не влияют на исходный том. Для удаления клона используйте команду:
kubectl delete pvc <имя клона PVC>

Диагностика клонов

Диагностика клонов — процесс проверки состояния и ошибок клона PVC.

Чтобы выполнить диагностику:

  1. Выполните команду для проверки клона:
    kubectl describe pvc <имя клона PVC>
    где:
    • <имя клона PVC> — имя клона PVC, например, pvc-clone.
    Name:          pvc-clone
    Namespace:     default
    StorageClass:  cinder-csi
    Status:        Bound
    Volume:        pvc-uuid
    Mounted By:    <none>
    Events:
      Type    Reason              Age   From                         Message
      ----    ------              ----  ----                         -------
      Normal  Provisioning        15s   cinder.csi.openstack.org     External provisioner is provisioning volume for claim "default/pvc-clone"
      Normal  ExternalProvisioning 12s   cinder.csi.openstack.org     waiting for a volume to be created, either by external provisioner "cinder.csi.openstack.org" or manually created by system administrator
      Normal  Provisioned         8s    cinder.csi.openstack.org     Successfully created volume pvc-uuid
  2. Проверьте ключевые поля:
    • Status — должно быть Bound  (клон готов). Если Pending , проверьте содержание блока Events для выявления причин (например, недостаток квот в OpenStack). Для получения дополнительной информации посмотрите логи CSI-драйвера:

      kubectl logs -n kube-system -l app=cinder-csi
      Подробнее см. CSI Volume Cloning;
    • Volume — UUID тома в Cinder;
    • Events — информация об ошибках. Например, проблемы с доступом к Cinder.

Мы ответили на ваш вопрос?