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

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

    Экспорт и импорт кластера

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

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

    • Развёрнутый в MCS кластер Kubernetes
    • Velero клиент
    • Плагин OpenStack

    Описание

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

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

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

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

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

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

    Установка 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 -zxvf velero-v1.2.0-linux-amd64.tar.gz
    sudo cp velero-v1.2.0-linux-amd64/velero /usr/local/bin
    velero version

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

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

    Создадим бакет velero в сервисе "Объектное хранилище", используя Панель MCS.

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

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

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

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

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

    velero install --plugins velero/velero-plugin-for-aws:v1.0.0 --provider aws --bucket my_velero_backup --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-хранилищем для бэкапов
    • --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 - ссылка на S3-хранилище Mail.ru Cloud Storage.

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

    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.

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

    kubectl logs deployment/velero -n velero

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

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

    Теперь необходимо установить плагин openstack для работы с хранилищем openstack cinder.

    Первым делом необходимо получить openstack rc файл, содержащий в себе переменные окружения, необходимые для доступа к API Openstack.

    Получить файл можно в меню "Настройки проекта" в личном кабинете MCS

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

    . openrc.sh

    Необходимо ввести пароль от своего аккаунта MCS. После этого в переменных окружения будут выставлены параметры доступа к 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_DOMAIN_ID=$OS_USER_DOMAIN_ID --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_PROJECT_DOMAIN_ID=$OS_PROJECT_DOMAIN_ID --from-literal OS_FILE_OPERATION_TIMEOUT=$OS_FILE_OPERATION_TIMEOUT -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

    Отредактируем деплоймент 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

    Сохраним деплоймент.

    Выполним инсталляцию плагина:

    velero plugin add registry.infra.mail.ru:5010/test/velero-plugin-openstack:cinder

    Создадим локацию для хранения снапшотов:

    velero snapshot-location create default --provider openstack \
    > --config region=mail,s3ForcePathStyle="true",s3Url=https://hb.bizmrg.com:443,bucket=my_velero_backup,secret-file=./s3_cred

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

    velero get snapshot-locations

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

    kubectl rollout restart 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

    В кластере появится неймспейс 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

    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-04-14 11:25:46 +0000 UTC   29d       default            <none>

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

    velero describe backups
    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-04-14 11:25:46 +0000 UTC
    Completed: 2020-04-14 11:25:52 +0000 UTC
    
    Expiration: 2020-05-14 11:25:46 +0000 UTC
    
    Persistent Volumes: <none included>

    Список ресурсов отражает каждый из объектов Kubernetes, которые попали в бэкап.

    Убедимся в наличии бэкапа в S3-хранилище

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

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

    kubectl delete ns nginx-example

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

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

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

    kubectl get pods -n nginx-example
    NAME READY STATUS RESTARTS AGE
    nginx-deployment-85ff79dd56-qchn9 1/1 Running 0 95s
    nginx-deployment-85ff79dd56-vgwwn   1/1     Running   0          95s
    Как видим, неймспейс и поды веб сервера восстановлены.

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

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

    У 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 * * *". Подробности использования можно посмотреть в справке.
    •  --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 <none>
    nginx-example          Completed   2020-04-14 11:25:46 +0000 UTC   29d       default            <none>

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

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

    kubectl delete namespace/velero clusterrolebinding/velero

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