Перенос данных из любого Kubernetes кластера в Nova Container Platform
1. Сценарий
Требуется перенести все ресурсы (включая данные на PVC) в определенном namespace из обычного Kubernetes кластера в Nova Container Platform.
2. Предварительные условия
-
В Nova Container Platform установлен модуль Data Protection
-
Подготовлен и настроен сервер с MinIO
-
В MinIO создан бакет с именем
velero-backup-bucket -
В MinIO создан Access Key
3. Настройка хранилища резервных копий
В данном примере используется MinIO, но можно использовать любое S3-совместимое хранилище.
3.1. Nova Container Platform
-
Создайте файл с именем
cloud-credentials. Он должен содержать Access и Secret ключи для MinIO. Далее представлен пример файла. Используйте его, чтобы создать свой.[default] aws_access_key_id = minio aws_secret_access_key = minio123 -
Создайте секрет с использованием файла
cloud-credentialsс помощью команды:kubectl create secret generic cloud-credentials -n nova-cluster-backup --from-file cloud=cloud-credentials -
Получите сертификат MinIO и закодируйте его в
base64формате.openssl s_client -showcerts -connect minioapi.mycompany.local:443 -servername minioapi.mycompany.local < /dev/null 2>/dev/null | openssl x509 -outform PEM | base64 -w0 -
Для настройки места хранения резервного копирования используйте специальный манифест. Далее представлен пример манифеста и описание его полей.
apiVersion: velero.io/v1 kind: BackupStorageLocation metadata: name: minio (1) namespace: nova-cluster-backup (2) spec: config: region: ru-dc-1 (3) s3ForcePathStyle: 'true' s3Url: https://minioapi.mycompany.local (4) credential: key: cloud name: cloud-credentials (5) objectStorage: bucket: velero-backup-bucket (6) caCert: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0 (7) provider: aws1 name(типstring) - имя CR BackupStorageLocation;2 namespace(типstring) - пространство имен, где регистрируется объектное хранилище. Должно быть всегдаnova-cluster-backup;3 region(типstring) - регион для подключения к объектному хранилищу;4 s3Url(типstring) - точка подключения к объектному хранилищу;5 credential(типstring) - имя секрета доступа к объектному хранилищу;6 bucket(типstring) - имя бакета для хранения резервных копий;7 caCert(типstring) - сертификат закодированный вbase64формате.
3.2. Другие Kubernetes кластера
-
Создайте файл с именем
cloud-credentials. Он должен содержать Access и Secret ключи для MinIO. Далее представлен пример файла. Используйте его, чтобы создать свой.[default] aws_access_key_id = minio aws_secret_access_key = minio123 -
Получите сертификат MinIO и закодируйте его в
base64формате.openssl s_client -showcerts -connect minioapi.mycompany.local:443 -servername minioapi.mycompany.local < /dev/null 2>/dev/null | openssl x509 -outform PEM | base64 -w0 -
Используя Helm установите Velero в ваш Kubernetes кластер и настройки места хранения резервного копирования
helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts helm install velero vmware-tanzu/velero \ --namespace velero \ --create-namespace \ --set-file credentials.secretContents.cloud=./credentials-velero \ (1) --set configuration.backupStorageLocation[0].name=minio \ (2) --set configuration.backupStorageLocation[0].provider=aws \ --set configuration.backupStorageLocation[0].bucket=velero-backup-bucket \ (3) --set configuration.backupStorageLocation[0].config.region=ru-dc-1 \ (4) --set configuration.backupStorageLocation[0].config.s3ForcePathStyle=true \ --set configuration.backupStorageLocation[0].config.s3Url=https://minioapi.mycompany.local \ (5) --set snapshotsEnabled=false \ --set deployNodeAgent=true \ --set uploaderType=kopia \ (6) --set image.repository=hub.nova-platform.io/registry/velero/velero \ (7) --set image.tag=v1.15.2 \ (7) --set nodeAgent.image.repository=hub.nova-platform.io/registry/velero/velero \ (7) --set nodeAgent.image.tag=v1.15.2 \ (7) --set kubectl.image.repository=docker.io/bitnamilegacy/kubectl \ (8) --set kubectl.image.tag=1.31 \ (8) --set initContainers[0].name=velero-plugin-for-aws \ --set initContainers[0].image=hub.nova-platform.io/registry/velero/velero-plugin-for-aws:v1.12.2 \ (7) --set initContainers[0].volumeMounts[0].mountPath='/target' \ --set initContainers[0].volumeMounts[0].name=plugins \ --set configuration.backupStorageLocation[0].caCert=LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0 (9)1 файл содержащий Access и Secret ключи для MinIO 2 имя CR BackupStorageLocation 3 имя бакета для хранения резервных копий 4 регион для подключения к объектному хранилищу 5 точка подключения к объектному хранилищу 6 используем kopiaдля резервного копирования данных из PVC7 нужно использовать такие же версии Velero и плагина для AWS, как и в Nova Container Platform. Убедитесь, что версии совпадают. 8 нужно указать версию вашего Kubernetes кластера или выше 9 сертификат закодированный в base64формате
4. Подготовка данных для резервного копирования
В данном примере будет использован заранее подготовленный под и PVC, на которых хранятся данные.
-
В вашем Kubernetes кластере создайте namespace с именем
test, под и PVC. В данном примере используется NFS как StorageClass. Измените его на используемый в вашей инфраструктуре.apiVersion: v1 kind: Namespace metadata: name: test --- apiVersion: v1 kind: Pod metadata: name: busybox-pod namespace: test spec: containers: - name: busybox image: busybox:latest command: ["/bin/sh", "-c", "sleep 3600"] volumeMounts: - mountPath: /tmp/busybox name: busybox-storage volumes: - name: busybox-storage persistentVolumeClaim: claimName: busybox-pvc --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: busybox-pvc namespace: test spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: nfs-client -
Создайте файл внутри пода с помощью команды:
kubectl exec -it busybox-pod -n test -- touch /tmp/busybox/test.txt
5. Резервное копирование
-
В вашем Kubernetes кластере сделайте резервную копию всего namespace
testиспользуя следующий манифест.apiVersion: velero.io/v1 kind: Backup metadata: name: test-backup (1) namespace: velero (2) spec: csiSnapshotTimeout: 10m0s defaultVolumesToFsBackup: true (3) includedNamespaces: (4) - test includedResources: (5) - '*' itemOperationTimeout: 4h0m0s snapshotMoveData: false storageLocation: minio (6) ttl: 720h0m0s (7)1 name(типstring) - имя ресурса для резервного копирования;2 namespace(типstring) - пространство имен, в котором установлен Velero. Должно бытьvelero;3 defaultVolumesToFsBackup(типbool) - использование kopia для резервного копирования файлов внутри PVC;4 includedNamespaces(типlist) - резервное копирование указанного пространства имен. В данном случае -test;5 includedResources(типlist) - резервное копирование указанных ресурсов. В данном случае - всех;6 storageLocation(типstring) - выбор созданного ранее места хранения резервного копирования;7 ttl(типstring) - время хранения резервной копии. -
Подождите пока не завершится резервное копирование. Для этого выполните следующую команду и убедитесь, что
Phaseсодердит значениеCompleted.kubectl describe backup test-backup -n velero -
При резервном копировании с помощью kopia - данные хранятся в MinIO в зашифрованном виде. Получите пароль с помощью команды.
kubectl get secrets velero-repo-credentials -n velero -o yaml
6. Восстановление из резервной копии
-
В веб-интерфейсе Nova Container Platform убедитесь, что реезервное копирование появилось. Перейдите на вкладку Резервное копирование → Резервные копии.
-
Выберите namespace
nova-cluster-backupили все. -
Перейдите на вкладку Ресурсы → Secrets. Выберите секрет
velero-repo-credentialsи перейдите на вкладку YAML. -
Замените пароль от репозитория на тот, что вы получили из вашего Kubernetes кластера на этапе получения пароля.
-
Убедитесь, что DaemonSet
node-agentустановил поды на Worker-узлы. -
Необязательно. Если необходимо изменить ресурсы при восстановлении (например, указать другой StorageClass), то создайте следующий ConfigMap:
kind: ConfigMap apiVersion: v1 metadata: name: modifier (1) namespace: nova-cluster-backup (2) data: resource-modifiers.yaml: | version: v1 resourceModifierRules: - conditions: groupResource: persistentvolumeclaims (3) patches: - operation: replace path: "/spec/storageClassName" value: "longhorn-storage-single-replica"1 name(типstring) - имя ConfigMap;2 namespace(типstring) - пространство имен. Должно бытьnova-cluster-backup;3 groupResource(типstring) - стандартный патч для изменения StorageClass. -
Создайте ресурс для восстановления данных из резервной копии.
apiVersion: velero.io/v1 kind: Restore metadata: name: test-restore (1) namespace: nova-cluster-backup (2) spec: backupName: test-backup (3) itemOperationTimeout: 4h namespaceMapping: {} (4) restorePVs: true (5) preserveNodePorts: true includedResources: (6) - '*' resourceModifier: (7) kind: ConfigMap name: modifier1 name(типstring) - имя ресурса для восстановления данных из резервной копии;2 namespace(типstring) - пространство имен. Должно бытьnova-cluster-backup;3 backupName(типstring) - имя резервной копии;4 namespaceMapping(типmap) - используется только если нужно изменить имя namespace при восстановлении;5 restorePVs(типbool) - восстанавливаются данные на PVC;6 includedResources(типlist) - включены указанные ресурсы. Укажите*, если хотите выбрать все ресурсы;7 resourceModifier(типobject) - необязателен к заполнению. Указывается ConfigMap с патчем для изменения ресурсов при восстановлении. Необходимо удалить, если ничего не меняется. -
Убедитесь, что восстановление создано успешно и нет никаких ошибок.
Могут возникнуть предупреждения, однако это не критично.
-
Убедитесь, что все ресурсы восстановились и созданный ранее файл существует.
kubectl exec -it busybox-pod -n test -- ls /tmp/busybox/test.txt