Данная статья описывает как создать резервную копию кластера Kubernetes (также K8s) с помощью Velero, а затем развернуть её на текущем или новом кластере.
Инструмент Velero
Velero позволяет подготовить кластер Kubernetes к обновлению и восстановить его в случае сбоя. При помощи Velero возможно:
- создавать сжатые резервные копии объектов и ресурсов кластера Kubernetes в объектном хранилище по требованию и по расписанию
- восстанавливать копии из хранилища резервных копий
Инструмент возможно использовать в сценариях:
- восстановления кластера после сбоев
- тиражирования кластера с сохранением пользовательских настроек
- миграции кластеров Kubernetes
- резервного копирования и восстановления томов Persistent Volumes
Прежде чем начать работать с Velero необходимо произвести установку:
- сервера на кластер Kubernetes; сервер Velero производит операцию резервного копирования данных и взаимодействует с Объектным хранилищем #CloudMTS
- клиента на локальный компьютер администратора кластера Kubernetes; клиент Velero понадобится для настройки сервера Velero на кластере kubernetes
Работа с Velero
Шаг 1. Установка клиента Velero
скачайте последнюю версию клиента Velero для своей платформы
распакуйте архив и установите клиент, как описано в документации Velero
- для установки клиента Velero для MacOS выполните:
wget https://github.com/vmware-tanzu/velero/releases/download/v1.8.1/velero-v1.8.1-darwin-amd64.tar.gz tar -zxvf velero-v1.8.1-darwin-amd64.tar.gz sudo cp velero-v1.8.1-darwin-amd64/velero /usr/local/bin
- чтобы проверить, что установка прошла успешно, выведите справку:
velero --help
Если в терминале отобразилась справка о Velero, клиент установлен успешно.
Шаг 2. Создание бакета S3 в объектном хранилище #CloudМТС
- на странице Объектного хранилища создайте новое пространство имён (namespace) или используйте существующее
- если требуется создать новое пространство, запишите пароль (
Secret Key
); он понадобится в дальнейшем при настройке сервера Velero
Если вы забыли свой Secret Key,
его можно изменить в интерфейсе сервиса.
- после создания пространства перейдите на его страницу, нажав на его имя, чтобы посмотреть подробную информацию; запишите
Access Key
; он понадобится в дальнейшем при настройке сервера Velero - нажмите на кнопку [Добавить], чтобы создать бакет, укажите имя бакета, затем снова нажмите на кнопку [Добавить]
В примерах на этой странице в качестве названия бакета указано velero.
- создайте файл
s3-creds
с ключами доступа, полученными ранее:
[default] aws_access_key_id=<Access key> aws_secret_access_key=<Secret Key>
Шаг 3. Установка сервера Velero на кластер
- скачайте файл
kubeconfig
;
Чтобы скачать kubeconfig:
- на странице Containerum Kubernetes нажмите на строку кластера Kubernetes
- в правом верхнем углу нажмите кнопку Скачать kubeconfig
Команды, в которых нужно взаимодействовать с кластерами (шаги 3, 4, 5 и 6), необходимо выполнять из терминала локальной машины, на которой установлен клиент Velero. Чтобы выполнить команду на стороне кластера, необходимо определить путь к файлу kubeconfig. Для этого можно соблюсти одно из следующих условий:
- перенести соответствующий файл kubeconfig в директорию ~/.kube
- задать переменную окружения KUBECONFIG с указанием полного пути к файлу kubeconfig
- применить дополнительный флаг --kubeconfig в командах вызова velero и kubectl с указанием полного пути к файлу kubeconfig
- в терминале выполните команду:
velero install \ --provider aws \ --use-restic \ --default-volumes-to-restic \ --use-volume-snapshots=false \ --plugins velero/velero-plugin-for-aws:v1.4.0 \ --bucket velero \ --secret-file {путь до файла s3-creds} \ --backup-location-config region=msk,s3ForcePathStyle="true",s3Url=https://s3mts.ru
Параметры
--provider | имя провайдера объектного хранилища |
--use-restic и -- default-volumes-to-restic | включение Restic для резервных копий PV (внешняя ссылка) |
--use-volume-snapshots=false | отключение резервных копий PV с текущим провайдером копирования томов. Для создания резервных копий будет использоваться плагин |
--plugins | плагин для взаимодействия с S3-хранилищем, в котором будут сохраняться резервные копии |
--bucket | имя бакета в S3-хранилище, в котором будут сохраняться резервные копии |
--secret-file | путь к файлу с ключами доступа к S3-хранилища |
--backup-location-config | параметры хранилища резервных копий. В region указывается регион размещения, в s3Url указывается URL-адрес хранилища S3 |
--s3ForcePathStyle=true | использовать ли path-style адресацию вместо адресации виртуальных размещенных бакетов (virtual hosted bucket addressing). Установлено значение "true", так как используется локальная служба хранения |
Velero и его плагины требовательны к вычислительным ресурсам. Рекомендуемая минимальная конфигурация узлов кластера для установки: 2 CPU и 2 Гбайт RAM.
Требования по вычислительным ресурсам плагина Restic пропорциональны объемам Persistent Volumes. Если планируется создавать резервные копии большого объема данных, увеличьте значения параметров limits
и requests
для настройки restic
, как описано в документации Velero.
- проверьте результат выполнения:
CustomResourceDefinition/backups.velero.io: attempting to create resource CustomResourceDefinition/backups.velero.io: already exists, proceeding CustomResourceDefinition/backups.velero.io: created ... Deployment/velero: attempting to create resource Deployment/velero: already exists, proceeding Deployment/velero: created Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.
- убедитесь, что под (pod) Velero запущен и находится в состоянии
Running
:
kubectl get pods -n velero
- проверьте результат выполнения:
NAME READY STATUS RESTARTS AGE restic-gzqr2 1/1 Running 0 3m34s velero-7bc4b5cd46-2mpzx 1/1 Running 0 5m9s
Шаг 4. Создание резервной копии кластера k8s
На этом шаге выполняется создание резервной копии кластера. В примерах используется сервис, который каждые 5 секунд записывает в файл текущие дату и время.
- сохраните следующий текст спецификации в YAML-файл с именем
backup-test.yaml
и через kubectl примените данную спецификацию; подробнее работа с выделенными томами описана в данной статье
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-pvc annotations: volume.beta.kubernetes.io/storage-class: mts-ssd-fast spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: v1 kind: Pod metadata: name: pod spec: containers: - name: app image: ubuntu command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"] volumeMounts: - name: persistent-storage mountPath: /data volumes: - name: persistent-storage persistentVolumeClaim: claimName: test-pvc
kubectl apply -f backup-test.yaml
- выполните команду, чтобы проверить, что все работает:
kubectl exec -it pod -- cat /data/out.txt
- проверьте результат выполнения:
... Thu May 12 02:27:23 UTC 2022 Thu May 12 02:27:28 UTC 2022 Thu May 12 02:27:33 UTC 2022
- для создания резервной копии выполните:
velero backup create test-backup --exclude-namespaces kube-system,velero
Данная команда приведена как пример и создаёт резервную копию всего кластера. В реальных задачах рекомендуется гранулярно настраивать объекты резервного копирования, чтобы снизить нагрузку и ускорить создание резервной копии. Для создания гранулярных копий используйте параметры, описанные в разделе Параметры настройки гранулярных копий данной статьи. Рекомендуется настроить расписание резервного копирования, как описано в документации Velero.
Параметры
backup create test-backup | команда для создания резервной копии кластера с именем test-backup |
--exclude-namespaces kube-system , velero | параметр, задающий исключенные из резервной копии пространства имен (в данном случае - системные настройки кластера и сам Velero) |
Параметры настройки гранулярных копий
Чтобы получить детальную информацию о доступных опциях бэкапа, выполните команду:
velero backup create -h
Отобразится список команд:
Flags: --default-volumes-to-restic optionalBool[=true] Use restic by default to backup all pod volumes --exclude-namespaces stringArray Namespaces to exclude from the backup. --exclude-resources stringArray Resources to exclude from the backup, formatted as resource.group, such as storageclasses.storage.k8s.io. --from-schedule string Create a backup from the template of an existing schedule. Cannot be used with any other filters. Backup name is optional if used. -h, --help help for create --include-cluster-resources optionalBool[=true] Include cluster-scoped resources in the backup --include-namespaces stringArray Namespaces to include in the backup (use '*' for all namespaces). (default *) --include-resources stringArray Resources to include in the backup, formatted as resource.group, such as storageclasses.storage.k8s.io (use '*' for all resources). --label-columns stringArray A comma-separated list of labels to be displayed as columns --labels mapStringString Labels to apply to the backup. --ordered-resources string Mapping Kinds to an ordered list of specific resources of that Kind. Resource names are separated by commas and their names are in format 'namespace/resourcename'. For cluster scope resource, simply use resource name. Key-value pairs in the mapping are separated by semi-colon. Example: 'pods=ns1/pod1,ns1/pod2;persistentvolumeclaims=ns1/pvc4,ns1/pvc8'. Optional. -o, --output string Output display format. For create commands, display the object but do not send it to the server. Valid formats are 'table', 'json', and 'yaml'. 'table' is not valid for the install command. -l, --selector labelSelector Only back up resources matching this label selector. (default <none>) --show-labels Show labels in the last column --snapshot-volumes optionalBool[=true] Take snapshots of PersistentVolumes as part of the backup. --storage-location string Location in which to store the backup. --ttl duration How long before the backup can be garbage collected. (default 720h0m0s) --volume-snapshot-locations strings List of locations (at most one per provider) where volume snapshots should be stored. -w, --wait Wait for the operation to complete.
Шаг 5. Проверка резервной копии кластера k8s
- чтобы убедиться, что резервная копия создана успешно, выполните:
velero backup get
- проверьте результат выполнения:
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR test-backup Completed 0 0 2022-05-12 10:18:24 +0300 MSK 29d default <none>
подключитесь к кластеру, в котором будем восстанавливать бэкап
установите Velero по инструкции, как указано в Шаге 3
- убедитесь, что резервная копия доступна в новом кластере:
velero backup get
- проверьте результат выполнения:
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR test-backup Completed 0 0 2022-05-12 10:18:24 +0300 MSK 29d default <none>
Шаг 6. Восстановление кластера k8s из резервной копии
чтобы восстановить кластер, выполните команду на новом кластере:
velero restore create --from-backup test-backup --include-namespaces default
убедитесь, что восстановление прошло успешно:
velero restore get
проверьте результат выполнения:
NAME BACKUP STATUS STARTED COMPLETED ERRORS WARNINGS CREATED SELECTOR test-backup-20220512122935 test-backup Completed 2022-05-12 12:29:35 +0300 MSK 2022-05-12 12:29:37 +0300 MSK 0 6 2022-05-12 12:29:35 +0300 MSK <none>
проверьте восстановленные данные. Для этого найдите строку с датой создания резервной копии:
kubectl exec -it pod -- cat /data/out.txt | grep "Thu May 12 02:27:23 UTC 2022"
проверьте результат выполнения:
Thu May 12 02:27:23 UTC 2022