Резервное копирование мастер-узлов
Регулярное резервное копирование мастер-узлов Nova Container Platform необходимо, чтобы восстановить кластер в критических ситуациях. Рекомендуется организовать хранение резервных копий в инфраструктуре за пределами кластера Kubernetes. Резервное копирование не должно выполняться в пиковые часы нагрузки, поскольку процессы подготовки резервных копий оказывают влияние на дисковую подсистему мастер-узлов.
1. Объекты резервного копирования
Критически важными компонентами платформы, мастер-узлов и среды Kubernetes являются следующие сервисы:
-
Etcd: основное хранилище данных, содержит всю информацию о ресурсах в Kubernetes.
-
StarVault: основное хранилище TLS-сертификатов, секретов, учетных записей.
Кроме этого, в Nova Container Platform поддерживается опциональная возможность резервного копирования следующих объектов:
-
Токены StarVault (Unseal Tokens): токены для распечатывания (расшифровки) хранилища StarVault.
-
TLS-сертификаты: сертификаты компонентов Kubernetes Control Plane и Nova Configuration Manager.
-
Ключи шифрования Etcd: ключи, необходимые для шифрования секретов в Etcd.
2. Совместимость резервных копий
В Nova Container Platform поддерживается полное восстановление резервной копии только для патч-версии платформы (x.y.Z), в которой данная резервная копия создавалась.
|
Восстановление образов хранилищ Etcd и StarVault в несовместимые версии Nova Container Platform может привести к непредсказуемому поведению служебных сервисов платформы. |
3. Выбор решения для резервного копирования
В Nova Container Platform поддерживается два основных решения для резервного копирования мастер-узлов:
-
Регулярное задание CronJob в Kubernetes.
-
C помощью дополнительного модуля Nova Data Protection и ПО Velero, входящего в его состав.
В каждом из решений запускается сервис Nova Backup Daemon, который выполняет резервное копирование информации на мастер-узлах. В зависимости от используемого решения в пользовательской инфраструктуре должно быть подготовлено соответствующее хранилище:
-
В регулярном задании CronJob сервис Nova Backup Daemon использует том, куда выполняется сохранение резервной копии. Рекомендуется использовать в качестве тома подключаемое NFS-хранилище.
-
При использовании ПО Velero из модуля Nova Data Protection в пользовательской инфраструктуре должно быть подготовлено и доступно S3-совместимое объектное хранилище. В данном сценарии сервис Nova Backup Daemon сохраняет резервную копию мастер-узлов локально, а затем выполняется резервная копия сервиса с его данными с помощью Velero.
Вы можете использовать наиболее подходящее решение в зависимости от вашей инфраструктуры и доступных ресурсов.
В разделе Резервное копирование и восстановление пользовательских данных вы можете ознакомиться с требованиями для установки модуля Nova Data Protection.
4. Настройка резервного копирования мастер-узлов
В данном разделе описана процедура настройки резервного копирования мастер-узлов платформы Nova Container Platform:
-
используя возможности запуска регулярных заданий CronJob в Kubernetes;
-
с помощью ПО Velero, входящего в состав модуля Data Protection.
4.1. Настройка резервного копирования с помощью регулярного задания CronJob
Необходимые условия
-
У вас есть доступ к кластеру с учетной записью, имеющей роль
cluster-adminв Kubernetes. -
Вы установили утилиту
kubectlдля работы с Kubernetes. -
У вас подготовлено NFS-хранилище для резервных копий.
-
Подготовьте манифест кастомизации (Kustomization) в зависимости от количества мастер-узлов в кластере Kubernetes:
3 мастер-узла
apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: name: nova-release-cluster-backup-rbac namespace: nova-gitops labels: nova-application-group: data-protection kustomization.nova-platform.io/cluster: "true" spec: serviceAccountName: kustomize-controller commonMetadata: labels: app.kubernetes.io/managed-by: Nova interval: 10m retryInterval: 30s timeout: 5m prune: false force: true sourceRef: kind: GitRepository name: nova-release-gitrepo-main path: ./resources/cluster-backup-rbac --- apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: name: nova-release-cluster-backup-cronjob namespace: nova-gitops labels: nova-application-group: data-protection kustomization.nova-platform.io/cluster: "true" spec: dependsOn: - name: nova-release-cluster-backup-rbac serviceAccountName: kustomize-controller commonMetadata: labels: app.kubernetes.io/managed-by: Nova interval: 10m retryInterval: 30s timeout: 5m prune: false force: true sourceRef: kind: GitRepository name: nova-release-gitrepo-main path: ./resources/cluster-backup-cronjob postBuild: substituteFrom: - kind: ConfigMap name: nova-gitops-common-substitute-config patches: - patch: | apiVersion: batch/v1 kind: CronJob metadata: name: nova-backup-scheduled namespace: nova-cluster-backup spec: schedule: "0 4 * * *" jobTemplate: spec: parallelism: 3 completions: 3 template: spec: volumes: - name: backup-volume nfs: server: nfs-share.nova.internal path: /nova-cluster-8b4e9344-9dcd-4c64-b98a-4a8a08a53da6 readOnly: false containers: - name: backup-daemon env: - name: MY_NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName - name: INCLUDE_STARVAULT_UNSEAL_TOKENS value: "true" - name: INCLUDE_PKI_DATA value: "true" - name: INCLUDE_DATA_ENCRYPTION_CONFIG value: "true" - name: INCLUDE_STARVAULT_DB_BACKUP value: "true" - name: RETENTION_PERIOD_DAYS values: "7" - name: MY_POD_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name - name: MY_NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace target: kind: CronJob name: nova-backup-scheduled namespace: nova-cluster-backup1 мастер-узел
apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: name: nova-release-cluster-backup-rbac namespace: nova-gitops labels: nova-application-group: data-protection kustomization.nova-platform.io/cluster: "true" spec: serviceAccountName: kustomize-controller commonMetadata: labels: app.kubernetes.io/managed-by: Nova interval: 10m retryInterval: 30s timeout: 5m prune: false force: true sourceRef: kind: GitRepository name: nova-release-gitrepo-main path: ./resources/cluster-backup-rbac --- apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: name: nova-release-cluster-backup-cronjob namespace: nova-gitops labels: nova-application-group: data-protection kustomization.nova-platform.io/cluster: "true" spec: dependsOn: - name: nova-release-cluster-backup-rbac serviceAccountName: kustomize-controller commonMetadata: labels: app.kubernetes.io/managed-by: Nova interval: 10m retryInterval: 30s timeout: 5m prune: false force: true sourceRef: kind: GitRepository name: nova-release-gitrepo-main path: ./resources/cluster-backup-cronjob postBuild: substituteFrom: - kind: ConfigMap name: nova-gitops-common-substitute-config patches: - patch: | apiVersion: batch/v1 kind: CronJob metadata: name: nova-backup-scheduled namespace: nova-cluster-backup spec: schedule: "0 4 * * *" jobTemplate: spec: parallelism: 1 completions: 1 template: spec: volumes: - name: backup-volume nfs: server: nfs-share.nova.internal path: /nova-cluster-8b4e9344-9dcd-4c64-b98a-4a8a08a53da6 readOnly: false containers: - name: backup-daemon env: - name: MY_NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName - name: INCLUDE_STARVAULT_UNSEAL_TOKENS value: "true" - name: INCLUDE_PKI_DATA value: "true" - name: INCLUDE_DATA_ENCRYPTION_CONFIG value: "true" - name: INCLUDE_STARVAULT_DB_BACKUP value: "true" - name: RETENTION_PERIOD_DAYS values: "7" - name: MY_POD_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name - name: MY_NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace target: kind: CronJob name: nova-backup-scheduled namespace: nova-cluster-backup -
Установите параметры резервного копирования.
Укажите переменные окружения сервиса Nova Backup Daemon:
Параметр Значение по умолчанию Описание INCLUDE_STARVAULT_UNSEAL_TOKENStrueДобавление в архив резервной копии токенов для распечатывания StarVault.
INCLUDE_PKI_DATAtrueДобавление в архив резервной копии всех выпущенных TLS-сертификатов для платформы.
INCLUDE_DATA_ENCRYPTION_CONFIGtrueДобавление в архив резервной копии ключей шифрования Etcd.
INCLUDE_STARVAULT_DB_BACKUPtrueДобавление в архив резервной копии снимка БД StarVault.
RETENTION_PERIOD_DAYS7Количество дней, в течение которых необходимо хранить резервные копии на внешнем хранилище.
Информация
Для каждого мастер-узла создается собственная резервная копия выбранных данных с учетом следующей информации:
-
Резервная копия Etcd создается всегда и только однократно на одном из мастер-узлов платформы.
-
Для получения полного набора токенов для распечатывания StarVault необходимо иметь резервные копии всех мастер-узлов.
-
Резервное копирование TLS-сертификатов не включает приватные ключи центров сертификации платформы, поскольку они не являются эскпортируемыми и хранятся только в БД StarVault.
-
Управление количеством дней хранения резервных копий доступно только для решения резервного копирования с помощью регулярного задания CronJob. При использовании модуля Nova Data Protection политика хранения данных определяется средствами ПО Velero.
Укажите спецификацию тома
backup-volume, предназначенного для хранения резервных копий.Например, для NFS-хранилища используйте спецификацию:
spec: volumes: - name: backup-volume nfs: server: nfs-share.nova.internal path: /nova-cluster-8b4e9344-9dcd-4c64-b98a-4a8a08a53da6 readOnly: falseгде
nfs.server- DNS-имя вашего NFS-сервера или его IP-адрес,nfs.path- путь для хранения резервных копий.Укажите график резервного копирования в формате Cron, например, для выполнения резервных копий каждый день в 4:00:
schedule: "0 4 * * *" -
-
Сохраните полученный манифест и установите его в кластер Kubernetes с помощью Nova Console или kubectl.
Пример
kubectl apply -f nova-release-cluster-backup-cronjob.yaml kustomization.kustomize.toolkit.fluxcd.io/nova-release-cluster-backup-cronjob created -
Проверьте статус кастомизации:
kubectl get ks nova-release-cluster-backup-cronjob -n nova-gitopsПример
kubectl get ks nova-release-cluster-backup-cronjob -n nova-gitops NAME AGE READY STATUS nova-release-cluster-backup-cronjob 41s True Applied revision: v1.1.0@sha1:6789a4025a1edd244044677ed43d8087018e5a7d -
Получите информацию об установленном регулярном задании Cronjob:
kubectl get cronjobs.batch -n nova-cluster-backupПример
kubectl get cronjobs.batch -n nova-cluster-backup NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE nova-backup-scheduled 0 4 * * * False 1 7s 14m
Регулярное задание запустится автоматически в указанное в графике время.
В процессе работы задания на мастер-узлах будут запускаться сервисы Nova Backup Daemon, а по завершению работы их статус можно будет отследить в пространстве имен nova-cluster-backup. Статус может быть Completed в успешном случае, и Error в случае ошибки.
Для просмотра статуса резервного копирования выполните команду:
kubectl get pods -n nova-cluster-backup
Пример
kubectl get pods -n nova-cluster-backup
NAME READY STATUS RESTARTS AGE
nova-backup-scheduled-28629407-0-v7qbv 0/1 Completed 0 24s
nova-backup-scheduled-28629407-1-t2wbt 0/1 Completed 0 24s
nova-backup-scheduled-28629407-2-h6hq9 0/1 Completed 0 24s
4.1.1. Проверка резервных копий на внешнем хранилище
Вы также можете проверить наличие резервных копий на внешнем хранилище. На примере ниже показана директория внешнего NFS-сервера, куда выполняется резервное копирование мастер-узлов кластера Nova Container Platform.
Пример
ls -la /storage/nova-364f9cbe-b209-4f3a-a4d4-9fe36a81afef/
drwxr-xr-x. 2 nobody nobody 4096 Jun 7 15:47 .
drwxr-xr-x. 3 nobody nobody 55 Jun 7 14:44 ..
-rw-r--r--. 1 root root 16209258 Jun 7 15:47 etcd_snapshot_nova-v1.1.0_k8s-v1.27.11_2024-06-07_124701.db.tar.gz
-rw-------. 1 root root 219326 Jun 7 15:47 nova-master-1-nova-internal_kuberesources_2024-06-07_124701.tar.gz
-rw-------. 1 root root 219247 Jun 7 15:47 nova-master-2-nova-internal_kuberesources_2024-06-07_124701.tar.gz
-rw-------. 1 root root 219279 Jun 7 15:47 nova-master-3-nova-internal_kuberesources_2024-06-07_124700.tar.gz
-rw-------. 1 root root 314521 Jun 7 15:47 starvault_snapshot_nova-v1.1.0_2024-06-07_124701.db
Для архивов резервных копий применяется следующая схема именования:
-
Имя архива резервной копии Etcd имеет формат
etcd_snapshot_nova-<Версия Nova>_k8s-<Версия Kubernetes>_<Время создания копии>.db.tar.gz. -
Имена архивов резервных копий конфигураций мастер-узлов имеют формат
<Имя узла в Kubernetes>_kuberesources_<Время создания копии>.tar.gz. -
Имя архива резервной копии StarVault имеет формат
starvault_snapshot_nova-<Версия Nova>_<Время создания копии>1.db.
4.2. Настройка резервного копирования с помощью Velero
Необходимые условия
-
У вас есть доступ к кластеру с учетной записью, имеющей роль
cluster-adminв Kubernetes. -
Вы установили утилиту
kubectlдля работы с Kubernetes. -
Вы установили модуль Data Protection в Nova Container Platform.
-
Вы настроили утилиту velero для работы с резервными копиями Velero.
-
Вы подготовили внешнее хранилище Velero
BackupStorageLocation.-
Для установка сервиса Nova Backup Daemon с помощью модуля Data Protection в Nova Container Platform используйте представленный далее манифест кастомизации.
apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: name: nova-release-cluster-backup-rbac namespace: nova-gitops labels: nova-application-group: data-protection kustomization.nova-platform.io/cluster: "true" spec: serviceAccountName: kustomize-controller commonMetadata: labels: app.kubernetes.io/managed-by: Nova interval: 10m retryInterval: 30s timeout: 5m prune: false force: true sourceRef: kind: GitRepository name: nova-release-gitrepo-main path: ./resources/cluster-backup-rbac --- apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: name: nova-release-cluster-backup-velero namespace: nova-gitops labels: nova-application-group: data-protection kustomization.nova-platform.io/cluster: "true" spec: serviceAccountName: kustomize-controller commonMetadata: labels: app.kubernetes.io/managed-by: Nova interval: 10m retryInterval: 30s timeout: 5m prune: false force: true dependsOn: - name: nova-release-velero-main - name: nova-release-cluster-backup-rbac sourceRef: kind: GitRepository name: nova-release-gitrepo-main path: ./resources/cluster-backup-velero postBuild: substituteFrom: - kind: ConfigMap name: nova-gitops-common-substitute-config healthChecks: - apiVersion: apps/v1 kind: DaemonSet name: nova-backup-daemon namespace: nova-cluster-backup -
Проверьте статус кастомизации:
kubectl get ks nova-release-cluster-backup-velero -n nova-gitopsПример
kubectl get ks nova-release-cluster-backup-velero -n nova-gitops NAME AGE READY STATUS nova-release-cluster-backup-velero 39s True Applied revision: v1.1.0@sha1:86f53cb7e4dbacb29fa42f2c1c9814fa6aec7a07 -
Получите информацию об установленном сервисе Nova Backup Daemon:
kubectl get ds nova-backup-daemon -n nova-cluster-backupПример
kubectl get ds nova-backup-daemon -n nova-cluster-backup NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE nova-backup-daemon 3 3 3 3 3 node-role.kubernetes.io/control-plane= 103s -
Подготовьте и установите манифест плана резервного копирования мастер-узлов в кластер Kubernetes с помощью Nova Console или kubectl.
apiVersion: velero.io/v1 kind: Schedule metadata: name: control-plane-backup namespace: nova-cluster-backup spec: paused: false schedule: 0 4 * * * template: csiSnapshotTimeout: 0s includedNamespaces: - nova-cluster-backup includedResources: - 'daemonsets' - 'pods' labelSelector: matchLabels: app.kubernetes.io/component: nova-backup-daemon metadata: {} ttl: 24h0m0sУкажите график резервного копирования в формате Cron, например, для выполнения резервных копий каждый день в 4:00:
schedule: "0 4 * * *"Пример
kubectl create -f backup-schedule.yaml schedule.velero.io/control-plane-backup created -
Проверьте статус плана резервного копирования:
kubectl
kubectl get schedules.velero.io -n nova-cluster-backupПример
kubectl get schedules.velero.io -n nova-cluster-backup NAME STATUS SCHEDULE LASTBACKUP AGE PAUSED control-plane-backup Enabled 15 * * * * 48s falseVelero CLI
velero schedule getПример
velero schedule get NAME STATUS CREATED SCHEDULE BACKUP TTL LAST BACKUP SELECTOR PAUSED control-plane-backup Enabled 2024-06-10 11:59:00 +0000 UTC 15 * * * * 24h0m0s n/a app.kubernetes.io/component=nova-backup-daemon false -
Дождитесь выполнения резервного копирования и проверьте статус плана резервного копирования:
kubectl
kubectl get schedules.velero.io -n nova-cluster-backupПример
kubectl get schedules.velero.io -n nova-cluster-backup NAME STATUS SCHEDULE LASTBACKUP AGE PAUSED control-plane-backup Enabled 15 * * * * 41m 3h57m falseVelero CLI
velero schedule getПример
velero schedule get NAME STATUS CREATED SCHEDULE BACKUP TTL LAST BACKUP SELECTOR PAUSED control-plane-backup Enabled 2024-06-10 11:59:00 +0000 UTC 15 * * * * 24h0m0s 41m ago app.kubernetes.io/component=nova-backup-daemon false -
Проверьте статус отдельных заданий резервного копирования:
kubectl
kubectl get backups.velero.io -n nova-cluster-backupПример
kubectl get backups.velero.io -n nova-cluster-backup NAME AGE control-plane-backup-20240610121525 3h45m control-plane-backup-20240610131525 165m control-plane-backup-20240610141525 105m control-plane-backup-20240610151525 45mVelero CLI
velero backup getПример
velero backup get NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR control-plane-backup-20240610151525 Completed 0 0 2024-06-10 15:15:25 +0000 UTC 23h default app.kubernetes.io/component=nova-backup-daemon control-plane-backup-20240610141525 Completed 0 0 2024-06-10 14:15:25 +0000 UTC 22h default app.kubernetes.io/component=nova-backup-daemon control-plane-backup-20240610131525 Completed 0 0 2024-06-10 13:15:25 +0000 UTC 21h default app.kubernetes.io/component=nova-backup-daemon control-plane-backup-20240610121525 Completed 0 0 2024-06-10 12:15:25 +0000 UTC 20h default app.kubernetes.io/component=nova-backup-daemon
-
4.2.1. Проверка резервных копий на внешнем хранилище
Вы также можете проверить наличие резервных копий в объектном хранилище. На примере ниже показан пример резервных копий в объектном хранилище, куда выполняется резервное копирование мастер-узлов кластера Nova Container Platform.
|
Вы можете использовать любой совместимый с вашим объектным хранилищем консольный клиент или веб-интерфейс. |
Пример
aws s3 ls s3://velero-backup-bucket --endpoint-url https://s3.nova.internal
PRE backups/
PRE kopia/
В директории backups/ находятся резервные копии спецификаций ресурсов (манифестов) Kubernetes.
Пример
aws s3 ls s3://velero-backup-bucket/backups/ --endpoint-url https://s3.nova.internal
PRE control-plane-backup-20240610121525/
PRE control-plane-backup-20240610131525/
PRE control-plane-backup-20240610141525/
PRE control-plane-backup-20240610151525/
В директории kopia/ находятся резервные копии файлов сервиса Nova Backup Daemon: резервные копии Etcd, StarVault, PKI и др.
Пример
aws s3 ls s3://velero-backup-bucket/kopia/nova-cluster-backup/ --endpoint-url https://s3.nova.internal
2024-06-10 15:15:43 747 _log_20240610121542_f5ce_1718021742_1718021743_1_6bd1da03b924c1be6ec634227e336f19
2024-06-10 15:15:45 1685 _log_20240610121544_c120_1718021744_1718021745_1_dfc7e059b0394a85ca25fe7ecce7ab29
2024-06-10 15:16:04 1755 _log_20240610121603_6ea6_1718021763_1718021764_1_64d9d4b3f4b3d8c4eb7dc310be213d1a
2024-06-10 15:16:28 2640 _log_20240610121626_aa10_1718021786_1718021788_1_0eeb3acc062071d4a84bd08f8ab82621
2024-06-10 16:15:32 1919 _log_20240610131531_287a_1718025331_1718025332_1_60750784af3ee83ed569fbe2e82d40ee
2024-06-10 16:15:39 1941 _log_20240610131537_04d8_1718025337_1718025339_1_564e1ea03aade8ccfb2236efc04f1fb7
2024-06-10 16:15:50 2737 _log_20240610131548_7f66_1718025348_1718025350_1_5595519176d088bf2512ae9d22513816
2024-06-10 16:16:26 3775 _log_20240610131625_6f8c_1718025385_1718025386_1_c60f0d81f4b09128277702e43ddf3655
2024-06-10 17:15:32 2097 _log_20240610141530_363a_1718028930_1718028932_1_dd21e1a8aa835344b058b311aa58ad78
2024-06-10 17:15:39 3334 _log_20240610141537_b56d_1718028937_1718028939_1_efd4f6b0da8be6a04d392e7aa4e8e20b
2024-06-10 17:15:51 2875 _log_20240610141549_8d12_1718028949_1718028951_1_75f3ceb8dce9a244c56bd08631a34761
2024-06-10 17:16:26 1320 _log_20240610141625_ca81_1718028985_1718028986_1_c4975114b6b94de09792c2bbe8694061
2024-06-10 18:15:32 2261 _log_20240610151531_7b9a_1718032531_1718032532_1_7325bf67c58d582df1363ddaff938cfa
2024-06-10 18:15:39 2392 _log_20240610151537_074c_1718032537_1718032539_1_4c8b33484e2ee5c7cc21d411b7eeefbd
2024-06-10 18:15:50 3330 _log_20240610151548_2718_1718032548_1718032550_1_5b2cb4f36c3124cc78acf28574555b65
2024-06-10 18:16:26 1825 _log_20240610151625_aff3_1718032585_1718032586_1_9be5f2ab4206fd4b43b49fdc8dfde303
2024-06-10 15:15:42 30 kopia.blobcfg
2024-06-10 18:16:26 620 kopia.maintenance
2024-06-10 15:15:42 1075 kopia.repository
2024-06-10 18:15:31 26726736 p0941d6b0f97eccef7587b5cbff2207f6-s77d051db729eba1e129
...