Перенести данные томов между кластерами Kubernetes
Вы можете перенести данные томов (PersistentVolumeClaim, PVC) из одного кластера Kubernetes в другой с помощью оператора K8up.
K8up — оператор резервного копирования для Kubernetes. Он создает резервные копии данных PVC с помощью restic, загружает их в S3-совместимое хранилище и восстанавливает в любом кластере, в котором установлен K8up. Способ подходит, когда нужно перенести данные отдельных томов, а не весь кластер.
В примерах копия тома из пространства имен my-app исходного кластера сохраняется в объектное хранилище S3 Selectel и восстанавливается в новый PVC в пространстве имен my-app-new целевого кластера.
1. Установить K8up
K8up нужно установить и в исходный, и в целевой кластер: сначала CRD, затем оператор K8up через Helm. Версия CRD должна соответствовать версии оператора K8up — подробнее на странице Releases в GitHub репозитории K8up.
-
Откройте CLI.
-
Установите CRD K8up:
kubectl apply -f https://github.com/k8up-io/k8up/releases/download/k8up-4.8.6/k8up-crd.yaml -
Установите оператор K8up:
helm repo add k8up-io https://k8up-io.github.io/k8uphelm install k8up k8up-io/k8up --version 4.8.6 --namespace k8up --create-namespace -
Повторите шаги 1-3 для целевого кластера.
2. Создать секреты для K8up
Секреты создаются в пространстве имен с переносимыми томами. Нужны два секрета: с S3-ключом для доступа к хранилищу и с паролем репозитория restic. Паролем репозитория шифруются все резервные копии, без пароля восстановить данные не получится.
-
Откройте CLI.
-
Создайте файл
secrets.yamlс секретами:apiVersion: v1kind: Secretmetadata:name: s3-secrets-k8upnamespace: my-appstringData:username: <s3_access_key>password: <s3_secret_key>---apiVersion: v1kind: Secretmetadata:name: restic-repository-passwordnamespace: my-appstringData:password: <repo_password>Укажите:
-
Примените секреты:
kubectl apply -f secrets.yaml
3. Создать резервную копию тома
Чтобы копия данных была согласованной, на время копирования остановите запись в том.
-
Откройте CLI.
-
Добавьте метку PVC, по которой K8up найдет том:
kubectl -n my-app label pvc <pvc_name> app.kubernetes.io/name=<pvc_name>Укажите
<pvc_name>— имя переносимого PVC. -
Создайте файл
backup.yamlс ресурсом Backup:apiVersion: k8up.io/v1kind: Backupmetadata:name: <pvc_name>namespace: my-appspec:podSecurityContext:runAsUser: 0runAsGroup: 1000labelSelectors:- matchExpressions:- key: app.kubernetes.io/nameoperator: Invalues:- "<pvc_name>"failedJobsHistoryLimit: 2successfulJobsHistoryLimit: 2backend:repoPasswordSecretRef:name: restic-repository-passwordkey: passwords3:endpoint: https://s3.<pool>.storage.selcloud.rubucket: <bucket_name>accessKeyIDSecretRef:name: s3-secrets-k8upkey: usernamesecretAccessKeySecretRef:name: s3-secrets-k8upkey: passwordУкажите:
<pvc_name>— имя переносимого PVC;<pool>— пул, в котором находится бакет, напримерru-1;<bucket_name>— имя бакета в S3 Selectel.
Здесь
podSecurityContextзадает пользователя (UID) и группу (GID), от имени которых под резервного копирования читает файлы тома. Значение0(root) позволяет читать все файлы. Если в журнале пода появились ошибки чтения файлов (permission denied), укажите UID и GID пользователя, от которого работает приложение с этим томом. -
Примените ресурс Backup:
kubectl apply -f backup.yamlK8up создаст под
backup-<pvc_name>, который скопирует данные тома в хранилище. -
Проверьте статус резервной копии и пода резервного копирования:
kubectl -n my-app get backupkubectl -n my-app get pods -
Убедитесь, что данные скопировались полностью, для этого посмотрите журнал пода резервного копирования:
kubectl -n my-app logs <pod_name>Укажите
<pod_name>— имя пода резервного копирования. -
Запишите ID снапшота — он понадобится для восстановления:
kubectl -n my-app get snapshotsВ ответе появится список снапшотов.
4. Восстановить данные в другом кластере
-
Создайте в целевом пространстве имен PVC, в который будут восстановлены данные. Размер PVC должен быть не меньше размера исходного тома. Для кластера Managed Kubernetes используйте инструкцию Создать PersistentVolumeClaim.
-
Создайте в целевом пространстве имен секреты, которые вы создали на этапе 2, — с теми же значениями, что и в исходном кластере.
-
Откройте CLI.
-
Создайте файл
restore.yamlс ресурсом Restore:apiVersion: k8up.io/v1kind: Restoremetadata:name: <pvc_name>namespace: my-app-newspec:podSecurityContext:runAsUser: 0runAsGroup: 0snapshot: <snapshot_id>restoreMethod:folder:claimName: <pvc_name>backend:repoPasswordSecretRef:name: restic-repository-passwordkey: passwords3:endpoint: https://s3.<pool>.storage.selcloud.rubucket: <bucket_name>accessKeyIDSecretRef:name: s3-secrets-k8upkey: usernamesecretAccessKeySecretRef:name: s3-secrets-k8upkey: passwordУкажите:
<snapshot_id>— ID снапшота, который вы записали на шаге 7 при создании резервной копии на этапе 3;<pvc_name>— имя PVC, который вы создали на шаге 1;<pool>— пул, в котором находится бакет;<bucket_name>— имя бакета в S3 Selectel.
Здесь
podSecurityContextзадает пользователя (UID) и группу (GID), от имени которых восстанавливаются файлы, — восстановленные данные получат этого владельца. Укажите UID и GID пользователя, от которого будет работать приложение в целевом кластере, — иначе приложение может не получить доступ к восстановленным данным. -
Примените ресурс Restore:
kubectl apply -f restore.yamlK8up создаст под
restore-<pvc_name>, который подключит PVC и восстановит в него данные. -
Дождитесь завершения операции и проверьте журнал пода:
kubectl -n my-app-new get podskubectl -n my-app-new logs <pod_name>Укажите
<pod_name>— имя пода восстановления. -
Подключите восстановленный PVC к приложению в целевом кластере.