Написать в техподдержку Позвонить нам
Админпанель Выход

Содержание статьи:

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

    Описание

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

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

    Как следствие, Velero может развернуть persistent volume из бэкапа в первозданном виде.

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

    Velero идеально подходит для плана аварийного восстановления и для подготовки кластера kubernetes к обновлению, путем создания снэпшотов состояния ресурсов кластера.

    В этом сценарии мы установим и настроим велеро для взаимодействия с кластером kubernetes от Mail.Ru Cloud Solutions и сделаем бэкап неймспейса со всем содержимым в облачное S3-хранилище.

    Установка Velero client

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

    Установим клиент Velero на Ubuntu 18.04 из списка релизов проекта на GitHub https://github.com/vmware-tanzu/velero/releases

    Мы будет использовать текущую стабильную версию проекта - 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 -xvf velero-v1.2.0-linux-amd64.tar.gz
    mv velero /usr/bin/

    Убедимся в работоспособности Velero - вызовем справочную информацию:

    velero --help

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

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

    Создадим бакет veleromail через Панель MCS в разделе "Объектное хранилище".

    Velero взаимодействует с s3 хранилищами через AWS S3 плагин, поэтому протокол взаимодействия будет оперировать понятиями объектного хранилища AWS.

    Так как нам понадобятся ключи для доступа к бакету, создадим в каталоге файл s3_creds со следующим содержанием:

    [default]
    aws_access_key_id=<AWS_ACCESS_KEY_ID>
    aws_secret_access_key=<AWS_SECRET_ACCESS_KEY>

    Ключи доступа можно получить при создании аккаунта в Панели MCS в разделе "Объектное хранилище".

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

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

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

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

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

    velero install \
    --plugins velero/velero-plugin-for-aws:v1.0.0 \
    --provider aws \
    --bucket veleromail \
    --secret-file ./s3_cred \
    --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 - плагин для взаимодействия с s3 хранилищем для бэкапов
    • --provaider aws - протокол взаимодействия с s3 хранилищем
    • --bucket veleromail - бакет для бэкапов
    • --secret-file ./s3_cred - файл с ключами подключения к s3 хранилищу
    • --use-volume-snapshots=false - мы не будем использовать снапшоты pv для текущего провайдера
    • --backup-location-config region=mail,s3ForcePathStyle="true",s3Url=https://hb.bizmrg.com:443 - конечная точка подключения к Объектному хранилищу MCS

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

    CustomResourceDefinition/backups.velero.io: attempting to create resource
    CustomResourceDefinition/backups.velero.io: created
    CustomResourceDefinition/backupstoragelocations.velero.io: attempting to create resource
    CustomResourceDefinition/backupstoragelocations.velero.io: created
    CustomResourceDefinition/deletebackuprequests.velero.io: attempting to create resource
    CustomResourceDefinition/deletebackuprequests.velero.io: created
    CustomResourceDefinition/downloadrequests.velero.io: attempting to create resource
    CustomResourceDefinition/downloadrequests.velero.io: created
    CustomResourceDefinition/podvolumebackups.velero.io: attempting to create resource
    CustomResourceDefinition/podvolumebackups.velero.io: created
    CustomResourceDefinition/podvolumerestores.velero.io: attempting to create resource
    CustomResourceDefinition/podvolumerestores.velero.io: created
    CustomResourceDefinition/resticrepositories.velero.io: attempting to create resource
    CustomResourceDefinition/resticrepositories.velero.io: created
    CustomResourceDefinition/restores.velero.io: attempting to create resource
    CustomResourceDefinition/restores.velero.io: created
    CustomResourceDefinition/schedules.velero.io: attempting to create resource
    CustomResourceDefinition/schedules.velero.io: created
    CustomResourceDefinition/serverstatusrequests.velero.io: attempting to create resource
    CustomResourceDefinition/serverstatusrequests.velero.io: created
    CustomResourceDefinition/volumesnapshotlocations.velero.io: attempting to create resource
    CustomResourceDefinition/volumesnapshotlocations.velero.io: created
    Waiting for resources to be ready in cluster...
    Namespace/velero: attempting to create resource
    Namespace/velero: created
    ClusterRoleBinding/velero: attempting to create resource
    ClusterRoleBinding/velero: created
    ServiceAccount/velero: attempting to create resource
    ServiceAccount/velero: created
    Secret/cloud-credentials: attempting to create resource
    Secret/cloud-credentials: created
    BackupStorageLocation/default: attempting to create resource
    BackupStorageLocation/default: created
    Deployment/velero: attempting to create resource
    Deployment/velero: created
    Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.

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

    kubectl logs deployment/velero -n velero

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

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

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

    Создадим файл nginx-app.yml со следующим содержанием:

    ---
    apiVersion: v1
    kind: Namespace
    metadata:
     name: nginx-example
     labels:
       app: nginx
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: nginx-deployment
     namespace: nginx-example
    spec:
     replicas: 2
     selector:
       matchLabels:
         app: nginx
     template:
       metadata:
         labels:
           app: nginx
       spec:
         containers:
         - image: nginx
           name: nginx
           ports:
           - containerPort: 80
    ---
    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.yaml

    В выводе команды мы должны увидеть следующее:

    namespace/nginx-example created
    deployment.apps/nginx-deploy created
    service/nginx-svc created    

    В нашем кластере появится неймспейс 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.3.81   95.163.208.41   80:32626/TCP   4h3m

    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-backup --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 хранилище

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

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

    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.

    Неймспейс со всеми ресурсами успешно восстановлен.

    Убедимся в этом, выполнив следующую команду:

    k get po -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

    Как видно, неймспейс и поды веб сервера восстановлены.

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

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

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

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

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

    --schedule="@every 1h"  - создавать 1 раз в час. Этот параметр в качестве аргументов может принимать различные варианты задания расписания - в том числе и по cron схеме. 

    Например, так выглядит справка по этому параметру:

    velero schedule create NAME --schedule [flags]
    Examples:
            # Create a backup every 6 hours
            velero create schedule NAME --schedule="0 */6 * * *"
    
    
            # Create a backup every 6 hours with the @every notation
            velero create schedule NAME --schedule="@every 6h"
    
    
            # Create a daily backup of the web namespace
            velero create schedule NAME --schedule="@every 24h" --include-namespaces web
    
    
            # Create a weekly backup, each living for 90 days (2160 hours)
            velero create schedule NAME --schedule="@every 168h" --ttl 2160h0m0s
    • --include-namespaces nginx-example - какой неймспейс мы включаем в бэкап
    • --ttl - как долго будет жить версия бэкапа до удаления

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

    velero get schedule 
    NAME    STATUS    CREATED                         SCHEDULE     BACKUP TTL   LAST BACKUP   SELECTOR
    daily   Enabled   2020-02-07 17:27:00 +0300 MSK   @every 1h   24h0m0s      8m ago        <none>

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

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


    Полезна ли была эта статья?