---
title: 'Снапшоты постоянных томов в кластере Managed Kubernetes'
sidebar_label: 'Снапшоты постоянных томов'
sidebar_position: 3
description: 'Как создать снапшоты и восстановить из снапшота постоянный том'
toc_max_heading_level: 2
---

import Formbricks from '@theme/MDXComponents/Formbricks'

# Снапшоты постоянных томов в кластере Managed Kubernetes

Снапшоты постоянных томов ([VolumeSnapshots](https://kubernetes.io/docs/concepts/storage/volume-snapshots/#volumesnapshots)) — это копии содержимого [постоянных томов](/managed-kubernetes/volumes/persistent-volumes.mdx) (PersistentVolume) в кластере Managed Kubernetes на определенный момент времени.

Снапшоты можно использовать для резервного копирования данных или переноса данных на другой ресурс без необходимости создавать новый диск.

В Managed Kubernetes снапшоты работают на [ресурсах облачной платформы](/access-control/projects/about-projects.mdx#selectel-products-that-support-projects).

## Создать снапшот \{#create-snapshot}

1. Настройте Volume Snapshot Controller — один из [компонентов CSI Snapshotter](https://github.com/kubernetes-csi/external-snapshotter#usage):

   ```bash
   kubectl apply -f https://raw.githubusercontent.com/selectel/mks-csi-snapshotter/master/deploy/setup-snapshot-controller.yaml
   ```

   В ответе появится список созданных объектов. Например:

   ```bash
   deployment.apps/snapshot-controller created
   serviceaccount/snapshot-controller created
   clusterrole.rbac.authorization.k8s.io/snapshot-controller-runner created
   clusterrolebinding.rbac.authorization.k8s.io/snapshot-controller-role created
   role.rbac.authorization.k8s.io/snapshot-controller-leaderelection created
   rolebinding.rbac.authorization.k8s.io/snapshot-controller-leaderelection created
   customresourcedefinition.apiextensions.k8s.io/volumesnapshots.snapshot.storage.k8s.io created
   customresourcedefinition.apiextensions.k8s.io/volumesnapshotcontents.snapshot.storage.k8s.io created
   customresourcedefinition.apiextensions.k8s.io/volumesnapshotclasses.snapshot.storage.k8s.io created
   ```

2. Убедитесь, что поды с Volume Snapshot Controller созданы:

   ```bash
   kubectl get pod -l app=snapshot-controller --namespace=kube-system
   ```

   В ответе появится список подов. Например:

   ```bash
   NAME                                   READY   STATUS    RESTARTS   AGE
   snapshot-controller-7d7f5775d4-cz9j4   1/1     Running   0          3m37s
   snapshot-controller-7d7f5775d4-tc42c   1/1     Running   0          3m37s
   ```

3. Создайте YAML-файл с манифестом для объектов VolumeSnapshotClass и VolumeSnapshot:

   Пример манифеста:

   ```yaml
   ---
   apiVersion: snapshot.storage.k8s.io/v1
   kind: VolumeSnapshotClass
   metadata:
   name: csi-hostpath-snapclass-v1
   driver: cinder.csi.openstack.org
   deletionPolicy: Delete
   parameters:
   force-create: "true"
   ---
   apiVersion: snapshot.storage.k8s.io/v1
   kind: VolumeSnapshot
   metadata:
   name: new-snapshot-demo
   spec:
   volumeSnapshotClassName: csi-hostpath-snapclass-v1
   source:
       persistentVolumeClaimName: my-pv-claim
   ```

   Здесь:

   * `csi-hostpath-snapclass-v1` — имя объекта SnapshotClass;
   * `new-snapshot-demo` — имя объекта VolumeSnapshot;
   * `my-pv-claim` — имя объекта PersistentVolumeClaim, снапшот которого вы создаете.

4. Примените манифест:

   ```bash
   kubectl apply -f <file_name>
   ```

   Укажите `<file_name>` — имя YAML-файла с манифестом для объектов VolumeSnapshotClass и VolumeSnapshot. Например, `snapshot.yaml`.

   В ответе появится сообщение, что объекты созданы. Например:

   ```bash
   volumesnapshotclass.snapshot.storage.k8s.io/csi-hostpath-snapclass-v1 created
   volumesnapshot.snapshot.storage.k8s.io/new-snapshot-demo created
   ```

5. Убедитесь, что создан объект VolumeSnapshotContent:

   ```bash
   kubectl get volumesnapshotcontents.snapshot.storage.k8s.io
   ```

   В ответе появится созданный объект VolumeSnapshotContent. Например:

   ```bash
   NAME                                               READYTOUSE   RESTORESIZE   DELETIONPOLICY   DRIVER                     VOLUMESNAPSHOTCLASS         VOLUMESNAPSHOT      VOLUMESNAPSHOTNAMESPACE   AGE
   snapcontent-acc83be5-065f-42c1-a465-9f26497de1b1                              Delete           cinder.csi.openstack.org   csi-hostpath-snapclass-v1   new-snapshot-demo   default                   9m7s
   ```

## Восстановить постоянный том из снапшота \{#restore-persistent-volume-from-snapshot}

1. Создайте YAML-файл с манифестом для создания нового PersistentVolumeClaim из снапшота.

   Пример манифеста:

   ```yaml
   apiVersion: v1
   kind: PersistentVolumeClaim
   metadata:
   name: snapshot-demo-restore
   spec:
   storageClassName: fast.ru-3b
   dataSource:
       name: new-snapshot-demo
       kind: VolumeSnapshot
       apiGroup: snapshot.storage.k8s.io
   accessModes:
       - ReadWriteOnce
   resources:
       requests:
       storage: 10Gi
   ```

   Здесь:

   * `snapshot-demo-restore` — имя нового объекта PersistentVolumeClaim, куда будут скопированы данные из снапшота;
   * `new-snapshot-demo` — имя снапшота, из которого вы будете восстанавливать объект.

2. Примените манифест:

   ```yaml
   kubectl apply -f <file_name>
   ```

   Укажите `<file_name>` — имя YAML-файла с манифестом для создания нового PersistentVolumeClaim из снапшота. Например, `snapshot-restore.yaml`.

3. Убедитесь, что новый объект PersistentVolumeClaim создан:

   ```bash
   kubectl get pvc
   ```

   В ответе появится новый PersistentVolumeClaim. Например:

   ```bash
   NAME          STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
   snapshot-demo-restore   Bound    pvc-62394055-3780-4324-8871-1a56a447d70f   10Gi       RWO            fast.ru-3b     22m
   ```

<Formbricks />
