Резервное копирование кластера Kubernetes в Yandex Object Storage
Данные в кластерах Managed Service for Kubernetes надежно хранятся и реплицируются в инфраструктуре Yandex.Cloud. Однако в любой момент вы можете сделать резервные копии данных из групп узлов кластеров Kubernetes и хранить их в Object Storage или другом хранилище.
Вы можете делать резервные копии:
-
данных из групп узлов кластера Kubernetes с помощью инструмента Velero;
-
постоянных томов (Persistent Volumes) с помощью программы restic. Более подробная информация о настройке программы restic описана в документации Velero.
Программа restic копирует данные с Persistent Volumes в виде файлов, поэтому мы рекомендуем выполнять резервное копирование БД средствами самого приложения. Например, для СУБД ClickHouse использовать утилиту clickhouse-backup, для СУБД MySQL — утилиту MySQLdump, для PostgreSQL — pg_dump.
Требования
У группы узлов кластера Kubernetes должен быть доступ в интернет. Предоставить доступ в интернет можно только на этапе создания группы узлов.
Резервное копирование
Чтобы выполнить резервное копирование данных группы узлов:
-
Выберите последнюю версию программы Velero для своей платформы.
-
Скачайте Velero, распакуйте архив и установите программу. Подробнее об установке программы читайте в документации Velero.
-
Посмотрите описание любой команды Velero с помощью флага
--help
. Например:CLIvelero --help
-
Создайте в Object Storage бакет, в котором будет храниться резервная копия данных:
Консоль управления- В консоли управления выберите каталог, в котором хотите создать бакет.
- Выберите сервис Object Storage.
- Нажмите кнопку Создать бакет.
- На странице Новый бакет:
-
Введите Имя бакета в соответствии с правилами именования.
Например,
velero-backup
. -
При необходимости ограничьте Максимальный размер бакета.
Размер
0
означает отсутствие ограничений и аналогичен включенной опции Без ограничений. -
Выберите тип Доступа.
-
Выберите Класс хранилища: Стандартное.
-
Нажмите кнопку Создать бакет для завершения операции.
-
-
Создайте сервисный аккаунт, которому будет назначен доступ к бакету:
Консоль управленияCLI-
В консоли управления выберите каталог, в котором хотите создать сервисный аккаунт.
-
Выберите вкладку Сервисные аккаунты.
-
Нажмите кнопку Создать сервисный аккаунт.
-
Введите Имя сервисного аккаунта. Например,
velero-sa
.- Длина — от 3 до 63 символов.
- Может содержать строчные буквы латинского алфавита, цифры и дефисы.
- Первый символ — буква. Последний символ — не дефис.
-
Нажмите кнопку Создать.
Если у вас еще нет интерфейса командной строки Yandex.Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.Создайте сервисный аккаунт:
yc iam service-account create --name velero-sa
Где:
name
— имя сервисного аккаунта.
Результат выполнения команды:
id: abcdo12h3j04odg56def folder_id: b1g23ga45ghf0cljderg created_at: "2020-10-19T12:59:56Z" name: velero-sa
-
-
Создайте статический ключ доступа для сервисного аккаунта
velero-sa
:Консоль управленияCLI-
В консоли управления выберите каталог, которому принадлежит сервисный аккаунт
velero-sa
. -
Выберите вкладку Сервисные аккаунты.
-
Выберите сервисный аккаунт
velero-sa
и нажмите на строку с его именем. -
На странице Обзор нажмите кнопку Создать новый ключ на верхней панели.
-
Выберите пункт Создать статический ключ доступа.
-
В открывшемся окне Новый ключ нажмите кнопку Создать.
-
Сохраните идентификатор и секретный ключ.
Внимание
После закрытия диалога значение секретного ключа будет недоступно.
-
Создайте статический ключ доступа для сервисного аккаунта:
yc iam access-key create --service-account-name velero-sa
Где:
service-account-name
— имя сервисного аккаунта.
Результат выполнения команды:
access_key: id: abcdo12h3j04odg56def service_account_id: ajego12h3j03slk16upe created_at: "2020-10-19T13:22:29Z" key_id: y1qiM23o-Y3WeoP5oSdc secret: MLSeE12TYJZpjFkfgMeKJ3e7PR7z6dk3UyEeC7PJ
-
Сохраните идентификатор
key_id
и секретный ключsecret
. Получить значение ключа снова будет невозможно.
-
-
Создайте файл со статическим ключом доступа.
Например, вы можете создать файл с именем
credentials
и сохранить его в домашней директории.Чтобы созданные статические ключи доступа были совместимы с AWS API, содержимое файла должно выглядеть следующим образом:
[default] aws_access_key_id=y1qiM23o-Y3WeoP5oSdc aws_secret_access_key=MLSeE12TYJZpjFkfgMeKJ3e7PR7z6dk3UyEeC7PJ
-
Выдайте сервисному аккаунту
velero-sa
доступ к бакетуvelero-backup
. Object Storage поддерживает управление доступом с помощью ACL.Консоль управления- В консоли управления выберите каталог, в котором создан бакет
velero-backup
. - Выберите сервис Object Storage.
- Чтобы отредактировать ACL, нажмите значок справа от имени бакета и выберите ACL бакета.
- В появившемся окне Редактирование ACL:
- Выберите пользователя
velero-sa
. - Выдайте ему разрешения READ + WRITE.
- Выберите пользователя
- Нажмите кнопку Добавить.
- Нажмите кнопку Сохранить.
- В консоли управления выберите каталог, в котором создан бакет
-
Установите программу Velero в кластер Kubernetes, из которого необходимо сделать резервное копирование данных:
CLIvelero install \ --backup-location-config s3Url=https://storage.yandexcloud.net,region=ru-central1 \ --bucket velero-backup \ --plugins velero/velero-plugin-for-aws:v1.0.0 \ --provider aws \ --secret-file ./credentials \ --use-restic \ --use-volume-snapshots false
Где:
backup-location-config
— конфигурация адреса хранилища резервных копий. URL-адрес хранилища Object Storage и зоны доступности.bucket
— имя бакета для хранения резервных копий.plugins
— образ плагина для совместимости с AWS API.provider
— имя провайдера объектного хранилища Object Storage.secret-file
— имя файла со статическим ключом доступа и путь до него.use-restic
— флаг для использования программы restic для резервного копирования Persistent Volumes.use-volume-snapshots
— флаг, необходимый, чтобы снимки хранилищ не создавались автоматически.
Результат выполнения команды:
CustomResourceDefinition/backups.velero.io: attempting to create resource CustomResourceDefinition/backups.velero.io: already exists, proceeding CustomResourceDefinition/backups.velero.io: created ... DaemonSet/restic: already exists, proceeding DaemonSet/restic: created Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.
-
Выполните резервное копирование данных с группы узлов кластера Kubernetes:
CLIvelero backup create my-backup --default-volumes-to-restic
Где:
default-volumes-to-restic
— копирование Persistent Volumes из пространства именdefault
с помощью программы restic.
Результат выполнения команды:
Backup request "my-backup" submitted successfully. Run `velero backup describe my-backup` or `velero backup logs my-backup` for more details.
-
Дождитесь завершения резервного копирования. В графе
STATUS
появится значениеCompleted
.CLIvelero backup get
Результат выполнения команды:
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR my-backup Completed 0 0 2020-10-19 17:13:25 +0300 MSK 29d default <none>
Восстановление данных их резервной копии
Чтобы восстановить данные группы узлов кластера Kubernetes:
-
Создайте кластер Kubernetes.
Как создать кластер KubernetesКонсоль управленияCLIAPI- В консоли управления выберите каталог, в котором будет создан кластер Kubernetes.
- В списке сервисов выберите Managed Service for Kubernetes.
- Нажмите кнопку Создать кластер.
- Введите имя и описание кластера Kubernetes.
- Укажите Сервисный аккаунт для ресурсов, который будет использоваться для создания ресурсов.
- Укажите Сервисный аккаунт для узлов, который будет использоваться узлами для доступа к реестру Docker-образов.
- Укажите релизный канал.
- В блоке Конфигурация мастера:
-
В поле Версия Kubernetes выберите версию Kubernetes, которая будет установлена на мастере.
-
В поле Публичный адрес выберите способ назначения адреса:
- Автоматически — чтобы назначить случайный IP-адрес из пула адресов Yandex.Cloud.
- Без адреса — чтобы не назначать публичный IP-адрес.
-
В поле Тип мастера выберите тип мастера:
- Зональный — создается в подсети в одной зоне доступности.
- Региональный — создается распределенно в трех подсетях в каждой зоне доступности.
-
Выберите Зону доступности, в которой будет создан мастер.
Шаг доступен только для зонального мастера.
-
В поле Формат сети выберите способ отображения сетей:
- Список — отображается список доступных сетей. Если у вас нет облачной сети, нажмите кнопку Создать сеть:
- В открывшемся окне задайте имя сети. Укажите, что необходимо создать подсети. Нажмите кнопку Создать сеть. По умолчанию будет создана сеть с подсетями в каждой зоне доступности.
- ID — необходимо ввести уникальные идентификаторы необходимых сетей.
- Список — отображается список доступных сетей. Если у вас нет облачной сети, нажмите кнопку Создать сеть:
-
В поле Облачная сеть выберите сеть, в которой будет создан мастер.
-
В поле Подсеть выберите подсеть, в которой будет создан мастер.
Для регионального мастера необходимо указать три подсети в каждой зоне доступности.
-
- В блоке Настройки окна обновлений:
- В поле Частота обновлений / Отключение настройте окно для обновлений:
- Отключено — отключение автоматических обновлений.
- В любое время — обновления разрешены в любое время.
- Ежедневно — обновления будут происходить во временном интервале, указанном в поле Время (UTC) и продолжительность.
- В выбранные дни — обновления будут происходить во временном интервале, указанном в поле Расписание по дням.
- В поле Частота обновлений / Отключение настройте окно для обновлений:
- В блоке Сетевые настройки кластера:
- Укажите CIDR кластера — диапазон IP-адресов, из которого будут выделяться IP-адреса для подов.
- Укажите CIDR сервисов — диапазон IP-адресов, из которого будут выделяться IP-адреса для сервисов.
- Нажмите кнопку Создать кластер.
Выполните команду:
yc managed-kubernetes cluster create \ --name cluster-from-backup \ --network-name network \ --node-service-account-name docker \ --service-account-name k8s \ --zone ru-central1-a
Где:
name
— имя кластера Kubernetes.network-name
— имя сети.node-service-account-id
— уникальный идентификатор сервисного аккаунта для узлов. От его имени узлы будут скачивать из реестра необходимые Docker-образы.service-account-id
— уникальный идентификатор сервисного аккаунта для ресурсов. От его имени будут создаваться ресурсы, необходимые кластеру Kubernetes.zone
— зона доступности.
Результат выполнения команды:
done (6m9s) id: catab1c2f0fmb3d0ef94 folder_id: b1g23ga82bcv0cdeferg created_at: "2020-10-19T17:41:28Z" name: cluster-from-backup status: RUNNING health: HEALTHY network_id: enpabc1rfondide2fflu3 master: zonal_master: zone_id: ru-central1-a internal_v4_address: 10.0.0.32 version: "1.17" endpoints: internal_v4_endpoint: https://10.0.0.32 master_auth: cluster_ca_certificate: | -----BEGIN CERTIFICATE----- MIIAbCCCAbCgAwIBAgIBADANBgkqhkiG1w0BAQsFADAVMRMwEQYDVQQDEwdefWJl ... pi0jAbcDCLzCkfFuNimHejsSvVFN1N2bYYBCBMkhaYDzV5Ypfy/De0fHJ9U= -----END CERTIFICATE----- version_info: current_version: "1.17" maintenance_policy: auto_upgrade: true maintenance_window: anytime: {} ip_allocation_policy: cluster_ipv4_cidr_block: 10.112.0.0/16 node_ipv4_cidr_mask_size: "24 service_ipv4_cidr_block: 10.96.0.0/16 service_account_id: ajeabcfldeftb1238n99 node_service_account_id: ajea1b023cmndeft7t7j release_channel: REGULAR
-
Создайте группу узлов.
При создании группы узлов укажите публичный IP-адрес, чтобы узлы имели доступ в интернет.
Как создать группу узловКонсоль управленияCLIAPI- В консоли управления выберите каталог, в котором будет создан кластер Kubernetes.
- В списке сервисов выберите Managed Service for Kubernetes.
- Выберите кластер Kubernetes, для которого необходимо создать группу узлов.
- На странице кластера Kubernetes перейдите на вкладку Группы узлов.
- Нажмите кнопку Создать группу узлов.
- Введите имя и описание группы узлов.
- Укажите Версию Kubernetes для узлов.
- Укажите количество узлов в группе узлов.
- В блоке Масштабирование:
- Выберите тип политики масштабирования.
- Укажите количество узлов в группе узлов.
- В блоке В процессе создания и обновления разрешено укажите максимальное количество виртуальных машин, на которое можно превысить и уменьшить размер группы.
- В блоке Вычислительные ресурсы:
- Выберите платформу.
- Укажите необходимое количество vCPU и гарантированную долю vCPU, а также объем RAM.
- В блоке Хранилище:
- Укажите Тип диска узла:
- HDD — стандартный сетевой диск, сетевое блочное хранилище на HDD-накопителе.
- SSD — быстрый сетевой диск, сетевое блочное хранилище на SSD-накопителе.
- Укажите размер диска узла.
- Укажите Тип диска узла:
- В блоке Сетевые настройки:
- В поле Публичный адрес выберите способ назначения адреса:
- Автоматически — чтобы назначить случайный IP-адрес из пула адресов Yandex.Cloud.
- Укажите расположение узлов по зонам доступности и сетям.
- В поле Публичный адрес выберите способ назначения адреса:
- В блоке Доступ укажите данные для доступа на узел:
- В поле Логин введите имя пользователя.
- В поле SSH-ключ вставьте содержимое файла публичного ключа.
- В блоке Настройки окна обновлений:
- В поле Частота обновлений / Отключение выберите окно для обновлений:
- Отключено — отключение автоматических обновлений.
- В любое время — обновления разрешены в любое время.
- Ежедневно — обновления будут происходить во временной интервал, указанный в поле Время (UTC) и продолжительность.
- В выбранные дни — обновления будут происходить во временной интервал, указанный в поле Расписание по дням.
- В поле Частота обновлений / Отключение выберите окно для обновлений:
- Нажмите кнопку Создать группу узлов.
Выполните команду:
yc managed-kubernetes node-group create \ --cluster-name cluster-from-backup \ --fixed-size 1 \ --public-ip
Где:
cluster-name
— имя кластера Kubernetes, в котором будет создана группа узлов.fixed-size
— количество узлов в группе.public-ip
— флаг, который указывается, если группе узлов требуется публичный IP-адрес.
Результат выполнения:
done (2m31s) id: catabcio1iq2sdefial3 cluster_id: catab1c2f0fmb3d0ef94 created_at: "2020-10-19T17:43:54Z" status: RUNNING node_template: platform_id: standard-v2 resources_spec: memory: "4294967296" cores: "2" core_fraction: "100" boot_disk_spec: disk_type_id: network-hdd disk_size: "103079215104" v4_address_spec: one_to_one_nat_spec: ip_version: IPV4 scheduling_policy: {} scale_policy: fixed_scale: size: "1" allocation_policy: locations: - zone_id: ru-central1-a subnet_id: e1bm23abcs81edef6dqg deploy_policy: max_expansion: "3" instance_group_id: cl1ca2bch3lde1fi2tk7 node_version: "1.17" version_info: current_version: "1.17" maintenance_policy: auto_upgrade: true auto_repair: true maintenance_window: anytime: {}
-
Установите программу Velero в кластер Kubernetes, в котором необходимо восстановить данные:
CLIvelero install \ --backup-location-config s3Url=https://storage.yandexcloud.net,region=ru-central1 \ --bucket velero-backup \ --plugins velero/velero-plugin-for-aws:v1.0.0 \ --provider aws \ --secret-file ./credentials \ --use-restic \ --use-volume-snapshots false
Где:
backup-location-config
— конфигурация адреса хранилища резервных копий. URL-адрес хранилища Object Storage и все зоны доступности.bucket
— имя бакета для хранения резервных копий.plugins
— образ плагина для совместимости с AWS API.provider
— имя провайдера объектного хранилища Object Storage.secret-file
— имя файла со статическим ключом доступа и путь до него.use-restic
— использование программы restic для резервного копирования Persistent Volumes.use-volume-snapshots
— опция создания снимков хранилищ. Возможные значения:false
— не создавать,true
— создавать. Значение по умолчанию:true
.
Результат выполнения команды:
CustomResourceDefinition/backups.velero.io: attempting to create resource CustomResourceDefinition/backups.velero.io: already exists, proceeding CustomResourceDefinition/backups.velero.io: created ... DaemonSet/restic: already exists, proceeding DaemonSet/restic: created Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.
-
Проверьте, что в созданном кластере Kubernetes отображается резервная копия данных:
CLIvelero backup get
Результат выполнения команды:
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR my-backup Completed 0 0 2020-10-19 17:13:25 +0300 MSK 29d default <none>
-
Восстановите данные из резервной копии:
CLIvelero restore create create --exclude-namespaces velero --from-backup my-backup
Где:
exclude-namespaces
— флаг, позволяющий не восстанавливать объекты из пространства именvelero
.from-backup
— имя бакета, где хранится резервная копия.
Результат выполнения команды:
Restore request "create" submitted successfully. Run `velero restore describe create` or `velero restore logs create` for more details.
-
Дождитесь завершения восстановления данных из резервной копии. В графе
STATUS
появится значениеCompleted
.CLIvelero get restore
Результат выполнения команды:
NAME BACKUP STATUS STARTED COMPLETED ERRORS WARNINGS CREATED SELECTOR create my-backup Completed 2020-10-20 14:04:55 +0300 MSK 2020-10-20 14:05:22 +0300 MSK 0 23 2020-10-20 14:04:55 +0300 MSK <none>