База знаний LinxCloud Services

Резервное копирование с помощью Velero

При помощи Velero можно создать резервную копию кластера Kubernetes в облако Linx Cloud и развернуть эту копию в новый кластер. Эта операция полезна при необходимости тиражировать кластер с пользовательскими настройками.

Для этого понадобится:

  • Развернутый в Linx Cloud кластер Kubernetes;
  • Velero клиент;
  • Плагин OpenStack.

 

Описание

Velero — это удобный инструмент резервного копирования для Kubernetes, который сжимает и бэкапит объекты Kubernetes в объектное хранилище.

Он может сделать снапшот с persistent volume кластера, используя возможности создания снапшотов блочных устройств облачного провайдера. Как следствие, Velero может развернуть Persistent Volumes из бэкапа в первозданном виде.

Каждая операция Velero — резервное копирование по требованию, резервное копирование по расписанию, восстановление из бэкапа — это кастомный ресурс, определенный с помощью Custom Resource Definition. Также Velero содержит собственные контроллеры для отслеживания операций с резервным копированием.

Velero идеально подходит для плана аварийного восстановления и для подготовки кластера Kubernetes к обновлению, путем создания снапшотов состояния ресурсов кластера. В этом сценарии мы установим и настроим Velero для взаимодействия с кластером Kubernetes на Linx Cloud и сделаем бэкап неймспейса со всем содержимым в облачное S3-хранилище Linx Cloud Storage, используя плагин Openstack.

 

Установка Velero client

Velero состоит из:

  • клиента, который устанавливается на локальный компьютер администратора кластера Kubernetes;
  • сервера, который запускается в самом кластере kubernetes.

Дополнительно может понадобиться клиент Openstack с пакетом API блочного хранилища. Подробнее читайте здесь.

Установите клиент Velero на Ubuntu 20.04. Используйте версию проекта — 1.2.0.

Затем скачайте архив с клиентом на локальную машину администратора Kubernetes, распакуйте и установите:

wget https://github.com/vmware-tanzu/velero/releases/download/v1.2.0/velero-v1.2.0-linux-amd64.tar.gz
tar -zxvf velero-v1.2.0-linux-amd64.tar.gz
sudo cp velero-v1.2.0-linux-amd64/velero /usr/local/bin

Чтобы проверить работоспособность Velero, вызовите справочную информацию:

velero --help

 

Создание бакета для бекапов

Так как Velero сохраняет свои бэкапы в S3-хранилище, необходимо перед установкой сервера в кластер, предварительно создать бакет в S3-хранилище.

Создайте бакет my-velero-backup в сервисе «Объектное хранилище», используя Панель Linx Cloud.

Также необходимо создать аккаунт для доступа к бакету в сервисе «Объектное хранилище» и получить ключи доступа.

Полученные ключи доступа запишите в файл s3_creds:

[default]
aws_access_key_id=<Access Key ID>
aws_secret_access_key=<Secret Key>

 

Установка сервера velero

Инсталляция Velero состоит из нескольких объектов Kubernetes, которые работают вместе над созданием, планированием и управлением резервными копиями.

Важно
Перед установкой Velero убедитесь, что node-узлы кластера имеют как минимум 2 CPU, либо, что включено автомасштабирование кластера.

Команда velero install выполнит предварительные шаги по настройке вашего кластера, в частности:

  • создаст namespace velero;
  • добавит velero сервис аккаунт;
  • сконфигурирует rbac для доступа сервис аккаунта Velero;
  • установит CRD для специфических Velero ресурсов — Backup, Schedule, Restore, Config.

Выполните команду:

velero install \
--plugins velero/velero-plugin-for-aws:v1.0.0,registry.infra.mail.ru:5010/velero/velero-plugin-mcs:v1.2.0 \
--provider aws \
--bucket my-velero-backup \
--secret-file ./s3_creds \
--use-volume-snapshots=false \
--backup-location-config region=mail,s3ForcePathStyle="true",s3Url=https://hb.bizmrg.com:443

Остановимся подробно на аргументах:

  • —plugins velero/velero-plugin-for-aws:v1.0.0,registry.infra.mail.ru:5010/velero/velero-plugin-mcs:v1.2.0 — плагины для взаимодействия с S3 хранилищем для бэкапов и создания snapshot PV.
  • —provider aws — протокол взаимодействия с S3 хранилищем.
  • —bucket my-velero-backup — бакет для бэкапов.
  • —secret-file ./s3_cred — файл с ключами подключения к S3 хранилищу.
  • —use-volume-snapshots=false — отключим создание снапшотов PV для текущим провайдером. Для создания снапшотов будет использоваться плагин.
  • —backup-location-config region=mail,s3ForcePathStyle=»true»,s3Url=https://hb.bizmrg.com:443 — конечная точка подключения к Объектному хранилищу Linx Cloud.

После выполнения команды можно увидеть подобный вывод:

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.

 

Установка плагина Linx Cloud

Далее необходимо установить плагин Linx Cloud для работы с блочным хранилищем.

Для начала нужно получить openstack rc файл, содержащий в себе переменные окружения, необходимые для доступа к API Openstack. Получить файл можно в меню «Настройки проекта» в личном кабинете Linx Cloud. Для этого перейдите в раздел «API ключи» и нажмите «Скачать openrc  версии 3».

Сохраните файл как openrc.sh. Далее добавьте права на выполнение:

. openrc.sh

Введите пароль от своего аккаунта Linx Cloud. После этого в переменных окружения будут выставлены параметры доступа к openstack.

Создайте credential файл для плагина, используя параметры учетной записи:

kubectl -n velero create secret generic openstack-cloud-credentials \
--from-literal OS_PROJECT_ID=$OS_PROJECT_ID \
--from-literal OS_REGION_NAME=$OS_REGION_NAME \
--from-literal OS_IDENTITY_API_VERSION=$OS_IDENTITY_API_VERSION \
--from-literal OS_PASSWORD=$OS_PASSWORD \
--from-literal OS_AUTH_URL=$OS_AUTH_URL \
--from-literal OS_USERNAME=$OS_USERNAME \
--from-literal OS_INTERFACE=$OS_INTERFACE \
--from-literal OS_FILE_OPERATION_TIMEOUT=$OS_FILE_OPERATION_TIMEOUT \
--from-literal OS_DOMAIN_NAME=$OS_USER_DOMAIN_NAME -o yaml

Результат выполнения команды должен быть таким:

apiVersion: v1
data:
OS_AUTH_URL: aHR0cHM6Ly9pbmZyYS5tYWlsLnJ1OjM1MzU3L3YzLw==
OS_DOMAIN_ID: ""
OS_FILE_OPERATION_TIMEOUT: ""
OS_IDENTITY_API_VERSION: Mw==
OS_INTERFACE: cHVibGslj
OS_PASSWORD: xxxxxxxxxxxxxx
OS_PROJECT_DOMAIN_ID: MmY4NDhkYWY3xMWY1NDQ0ZfmIzOWVlZDVdmYmZkOTFiMmI=
OS_PROJECT_ID: MGNkYldrWFhNjQwMmQ0NDI0ZTk2NzZjNzVhNzIwYWZhODU=
OS_REGION_NAME: UmVnsdaW9uT25l
OS_USERNAME: cm9tYW5lbmtvZGVueXNAZ21haWwuYas29t
kind: Secret
metadata:
creationTimestamp: "2020-04-14T10:38:33Z"
name: openstack-cloud-credentials
namespace: velero
resourceVersion: "5976669"
selfLink: /api/v1/namespaces/velero/secrets/openstack-cloud-credentials
uid: 923ad314-b870-476f-9da7-4b2a526d9bbb
type: Opaque

Отредактируйте Deployment Velero. Для этого выполните команду:

kubectl edit deployment/velero -n velero

В открывшемся окне редактора найдите секцию:

spec:
  containers:
  - args:
    - server
    command:
    - /velero

И приведите ее к следующему виду:

spec:
  containers:
  - args:
    - server
    envFrom:
    - secretRef:
        name: openstack-cloud-credentials
    command:
    - /velero

Так же найдите секцию:

     - image: velero/velero-plugin-for-aws:v1.0.0
        imagePullPolicy: IfNotPresent
        name: velero-plugin-for-aws
        resources: {}
        terminationMessagePath: /dev/termination-log

и приведите её к следующему виду:

     - image: velero/velero-plugin-for-aws:v1.0.0
        imagePullPolicy: IfNotPresent
        name: velero-plugin-for-aws
        resources:
          limits:
            cpu: "1"
            memory: 512Mi
          requests:
            cpu: 500m
            memory: 256Mi
        terminationMessagePath: /dev/termination-log

Найдите секцию:

     - image: registry.infra.mail.ru:5010/velero/velero-plugin-mcs:v1.2.0
        imagePullPolicy: IfNotPresent
        name: velero-plugin-mcs
        resources: {}
        terminationMessagePath: /dev/termination-log

И приведите её к виду:

     - image: registry.infra.mail.ru:5010/velero/velero-plugin-mcs:v1.2.0
        imagePullPolicy: IfNotPresent
        name: velero-plugin-mcs
        resources:
          limits:
            cpu: "1"
            memory: 512Mi
          requests:
            cpu: 500m
            memory: 256Mi
        terminationMessagePath: /dev/termination-log

Создадим дефолтный snapshot-location для провайдера openstack.

velero snapshot-location create default --provider openstack --config region=mail

Настроенные локации для хранения снапшотов можно посмотреть с помощью команды:

velero get snapshot-locations

Проверьте статус командой:

kubectl logs deployment/velero -n velero

В выводе не должно содержаться ошибок.

Перезапустите деплоймент:

kubectl rollout restart deployment/velero -n velero

Проверим, что плагин установился и в списке есть строка velero.io/openstack.

velero plugin get
NAME                              KIND
velero.io/pod                     BackupItemAction
velero.io/pv                      BackupItemAction
velero.io/service-account         BackupItemAction
velero.io/aws                     ObjectStore
velero.io/add-pv-from-pvc         RestoreItemAction
velero.io/add-pvc-from-pod        RestoreItemAction
velero.io/change-storage-class    RestoreItemAction
velero.io/cluster-role-bindings   RestoreItemAction
velero.io/job                     RestoreItemAction
velero.io/pod                     RestoreItemAction
velero.io/restic                  RestoreItemAction
velero.io/role-bindings           RestoreItemAction
velero.io/service                 RestoreItemAction
velero.io/service-account         RestoreItemAction
velero.io/aws                     VolumeSnapshotter
*velero.io/openstack               VolumeSnapshotter*

 

Создание бэкапа

Проверять создание и восстановление из бэкапов можно на примере сервера nginx.

Создайте манифест, в котором опишем deployment и Persistent Volume Claim с указанием, что volume должен создаваться через блочное хранилище Linx Cloud.

Создайте файл nginx-app.yml, в котором опишем deployment и Persistent Volume Vlaim с указанием, что volume должен создаваться через блочное хранилище Linx Cloud.

---
apiVersion: v1
kind: Namespace
metadata:
 name: nginx-example
 labels:
   app: nginx

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
 name: cinder
provisioner: kubernetes.io/cinder

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
 name: mypvc
 namespace: nginx-example
spec:
 storageClassName: cinder
 accessModes:
   - ReadWriteOnce
 resources:
   requests:
     storage: 3Gi


---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deployment
 namespace: nginx-example
spec:
 replicas: 1
 selector:
   matchLabels:
     app: nginx
 template:
   metadata:
     labels:
       app: nginx
   spec:
     volumes:
       - name: nginx-logs
         persistentVolumeClaim:
          claimName: mypvc
     containers:
     - image: nginx:1.21.3
       name: nginx
       ports:
       - containerPort: 80
       volumeMounts:
         - mountPath: "/var/log/nginx"
           name: nginx-logs
           readOnly: false

---
apiVersion: v1
kind: Service
metadata:
 labels:
   app: nginx
 name: my-nginx
 namespace: nginx-example
spec:
 ports:
 - port: 80
   targetPort: 80
 selector:
   app: nginx
 type: LoadBalancer

Примените манифест:

kubectl apply -f nginx-app.yml

В кластере появится неймспейс nginx-example с работающим nginx сервером. Посмотрите какой IP-адрес выдаст сервису nginx loadbalancer kubernetes и перейдите по этому IP в браузере:

kubectl get svc -n nginx-example
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-nginx   LoadBalancer   10.254.244.134   95.163.250.147     80:31545/TCP   2m54s

Убедитесь, что создался persistent volume:

kubectl get pv
NAME                                   	CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             	STORAGECLASS   REASON   AGE
pvc-47587acc-8ec0-413a-b0c0-9a1d3848672f   3Gi    	RWO        	Delete       	Bound	nginx-example/mypvc   cinder              	11s

kubectl describe  pv pvc-47587acc-8ec0-413a-b0c0-9a1d3848672f
Name:            pvc-47587acc-8ec0-413a-b0c0-9a1d3848672f
Labels:          <none>
Annotations:     pv.kubernetes.io/provisioned-by: cinder.csi.openstack.org
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    cinder
Status:          Bound
Claim:           nginx-example/mypvc
Reclaim Policy:  Delete
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        3Gi
Node Affinity:   <none>
Message:
Source:
  Type:       Cinder (a Persistent Disk resource in OpenStack)
  VolumeID:   76bcc859-dea5-4b44-ba8c-46c4bd664e97
  FSType:     ext4
  ReadOnly:   false
  SecretRef:  nil
Events:       <none>

Проверьте, что в блочном хранилище создался соответствующий диск:

openstack volume show 76bcc859-dea5-4b44-ba8c-46c4bd664e97

Velero предлагает широкую вариативность по выбору объектов для резервного копирования. Вы можете указать через selector объекты с конкретными лейблами, либо указать весь неймспейс целиком.

Создайте бэкап для всего неймспейса nginx-example, выполнив следующую команду:

velero backup create nginx-example --include-namespaces nginx-example

Для того, чтобы посмотреть существующие резервные копии, у velero есть команда velero get backups:

velero get backups
NAME            STATUS      CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
nginx-example   Completed   2020-02-07 16:02:26 +0300 MSK   29d       default            <none>

Также есть возможность более подробно изучить содержание бэкапа командой describe:

velero backup describe nginx-example --details

Name:         nginx-example

Namespace:    velero

Labels:       velero.io/storage-location=default
Annotations:  <none>

Phase:  Completed

Namespaces:
 Included:  nginx-example
 Excluded:  <none>
Resources:
 Included:        \*
 Excluded:        <none>
 Cluster-scoped:  auto

Label selector:  <none>

Storage Location:  default

Snapshot PVs:  auto

TTL:  720h0m0s

Hooks:  <none>

Backup Format Version:  1

Started:    2020-02-07 16:02:26 +0300 MSK
Completed:  2020-02-07 16:02:27 +0300 MSK

Expiration:  2020-03-08 16:02:26 +0300 MSK

Resource List:
 apps/v1/Deployment:
    - nginx-example/nginx-deployment
 apps/v1/ReplicaSet:
    - nginx-example/nginx-deployment-5754944d6c
    - nginx-example/nginx-deployment-7bfb85948d
 v1/Endpoints:
    - nginx-example/my-nginx
 v1/Namespace:
    - nginx-example
 v1/Pod:
    - nginx-example/nginx-deployment-7bfb85948d-jfzh9
    - nginx-example/nginx-deployment-7bfb85948d-x7h7t
 v1/Secret:
    - nginx-example/default-token-9svxb
 v1/Service:
    - nginx-example/my-nginx
 v1/ServiceAccount:
    - nginx-example/default

Persistent Volumes: <none included>

Список ресурсов отражает каждый из объектов Kubernetes, которые попали в бэкап. Сначала убедитесь в наличии бэкапа в S3-хранилище, затем, что в блочном хранилище также создался бэкап:

openstack volume backup list

 

Восстановление из бэкапа

Сэмулируйте катастрофу и удалите неймспейс с тестовым приложением:

kubectl delete ns nginx-example

Убедитесь, что неймспейс удален:

kubectl get ns
NAME              STATUS   AGE
default           Active   21h
ingress-nginx     Active   21h
kube-node-lease   Active   21h
kube-public       Active   21h
kube-system       Active   21h
magnum-tiller     Active   21h
velero            Active   3h16m

Теперь приступите к восстановлению из бэкапа. Задайте команду:

velero restore create --from-backup nginx-example
Restore request "nginx-example-20200207171734" submitted successfully.
Run \`velero restore describe nginx-example-20200207171734\` or \`velero restore logs nginx-example-20200207171734\` for more details.

Неймспейс со всеми ресурсами успешно восстановлен. Убедитесь в этом, выполнив следующую команду:

kubectl get pods -n nginx-example
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-7bfb85948d-jfzh9   1/1     Running   0          62s
nginx-deployment-7bfb85948d-x7h7t   1/1     Running   0          62s

Видно, что неймспейс и поды веб-сервера восстановлены. Также убедимся, что диск в блочном хранилище был восстановлен:

openstack volume list

Если восстановление производится в другой кластер, то перед восстановлением из бекапа необходимо заново повторить настройку Velero для нового кластера (повторить пункты: установка Velero в кластер Kubernetes, установка плагина Linx Cloud). Бакет и ключи доступа к бакету используются уже существующие.

 

Удаление бэкапа

Для удаления бэкапа применим команду:

velero backup delete nginx-example

Бэкап в velero и бэкап в блочном хранилище будут удалены.

 

Создание бэкапа по расписанию

У Velero существует механизм создания резервных копий по расписанию. За это отвечает планировщик, схожий по своему функционалу с сron.

Создайте расписание для ежечасного бэкапа тестового неймспейса nginx-example. Для этого выполните команду:

velero schedule create daily --schedule="@every 1h" --include-namespaces nginx-example --ttl 24h0m0s
Schedule "daily" created successfully.

На этапе создания расписания нужно задать имя расписания — в нашем случае daily и через аргументы передать параметры:

  • —schedule=»@every 1h» — создавать 1 раз в час. Этот параметр в качестве аргументов может принимать различные варианты задания расписания, в том числе и по cron схеме, например,—schedule=»0 */6 * * *». Подробности использования можно посмотреть в справочной информации:
    velero --help
    
  • —include-namespaces nginx-example — какой неймспейс включаем в бэкап.
  • —ttl — как долго будет жить версия бэкапа до удаления.

Чтобы посмотреть какие есть расписания, выполните команду:

velero get schedule
NAME STATUS CREATED SCHEDULE BACKUP TTL LAST BACKUP SELECTOR
daily   Enabled   2020-04-14 11:43:46 +0000 UTC   @every 1h   24h0m0s      2m ago        <none>

В списке бэкапов резервная копия по расписанию будет иметь префикс с названием расписания:

velero get backups
NAME STATUS CREATED EXPIRES STORAGE LOCATION SELECTOR
daily-20200414114346 Completed 2020-04-14 11:43:46 +0000 UTC 23h default
nginx-example          Completed   2020-04-14 11:25:46 +0000 UTC   29d       default            <none>

 

Удаление Velero из кластера Kubernetes

Если Velero больше не нужен, то удаление производится следующей командой:

kubectl delete namespace/velero clusterrolebinding/velero

Velero, а также все созданные бэкапы будут удалены.

Что вас интересует?
Получить демо-доступ

Спасибо за ваш запрос, мы свяжемся с вами в ближайшее время!