Перейти к содержимому

Резервное копирование кластера в Object Storage

Вы можете создавать резервные копии данных кластера Managed Kubernetes с помощью инструмента Velero. Резервные копии можно использовать как для восстановления существующего кластера, так и для создания нового. Для хранения резервных копий используется бакет Object Storage.

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

Чтобы начать работу с Velero:

  1. Подготовьте виртуальную машину — на нее будет установлен набор утилит для работы с кластером и резервными копиями.
  2. Создайте тестовый дейплоймент с набором внутренних ресурсов Kubernetes и томом постоянного хранилища.
  3. Настройте File System Backup — он понадобится для создания резервных копий постоянного хранилища.
  4. Создайте резервные копии кластера и постоянного хранилища.

Если вам больше не нужны созданные ресурсы, удалите их.

  1. Создайте сервисные аккаунты:

    • C именем sa-k8s и ролью registry.puller — для работы группы узлов Managed Kubernetes.
    • С именем sa-storage без назначенной роли — для выгрузки резервных копий в бакет Object Storage. Нужная роль для сервисного аккаунта будет назначена позже.
  2. Для сервисного аккаунт sa-storage:

    • Создайте HMAC-ключ — для выгрузки резервных копий в бакет Object Storage. Сохраните значения Access key и Secret key.
    • Создайте API-ключ — для авторизации в Artifact Registry и скачивания Helm-чарта velero. Сохраните API-ключ.
    • Access key73emukr12Ju59osMFRy7
    • Secret keytfaJ3QHMZ7gxoklISA2/UNuJBnDxTaZVUdAbvv2cJ
    • API-ключ — v1.-8t7UxUbJlJiGOFVoAsblQt75--qyacasda7YBtUIYp1lBLOaV0MEox_a8sMUe_NHBWoNWA4V7P-wZiSZgHzKabhakcbPSMOEQyArgv5h82ZH_M6FI-PxhLwCKbgNFbHXx
  3. Создайте кластер Managed Kubernetes и группу узлов для него. При создании группы используйте сервисный аккаунт sa-k8s.

  4. Создайте NAT-шлюз для подсети, в которой будет развернут кластер Managed Kubernetes.

  5. Создайте виртуальную машину в той же сети, где развернут кластер Managed Kubernetes.

  6. Создайте бакет Object Storage с именем velero-bucket.

  7. Настройте права доступа на бакет velero-bucket для сервисного аккаунта sa-storage:

    1. В веб-консоли выберите нужный проект.
    2. В списке сервисов выберите Object StorageБакеты и выберите velero-bucket.
    3. Перейдите на вкладку Права доступа. В блоке Управление ролями нажмите кнопку Добавить.
    4. В открывшемся меню выберите тип аккаунта — Сервисный, после чего в строке поиска введите sa-storage.
    5. В списке ролей выберите storage.bucket.objectEditor.
    6. Нажмите кнопку Добавить.

Для работы с Velero установите набор утилит на виртуальную машину:

  1. Установите и настройте утилиту MWS CLI:

  2. Установите утилиту командной строки kubectl.

  3. Получите kubeconfig:

    bash
    mws mk8s get-kubeconfig --name <имя кластера>
  4. Убедитесь, что кластер доступен:

    bash
    kubectl cluster-info

    Если конфигурация настроена правильно, вы получите такой ответ:

    bash
    Kubernetes control plane is running at https://<IP-адрес кластера>
    KubeDNS is running at https://<IP-адрес кластера>/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Примечание

Все последующие шаги руководства выполняйте на виртуальной машине.

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

  • постоянное хранилище с именем тома test-storage;
  • секрет Kubernetes с именем test-secret;
  • метка (selector) для секрета.

Эти ресурсы потребуются для демонстрации различных сценариев восстановления из резервной копии.

Чтобы создать деплоймент:

  1. Создайте файл myapp.yaml, содержащий манифест деплоймента.

    yaml
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: test-pvc
    namespace: default
    spec:
    accessModes:
    - ReadWriteOnce
    storageClassName: mws
    resources:
    requests:
    storage: 1Gi
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: test-app
    namespace: default
    labels:
    app: test-app
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: test-app
    template:
    metadata:
    labels:
    app: test-app
    annotations:
    backup.velero.io/backup-volumes: "test-storage"
    spec:
    containers:
    - name: myapp
    image: registry.mwsapis.ru/mws-mk8s-images/customer/busybox:1.28
    command: ["sleep", "3600"]
    volumeMounts:
    - name: test-storage
    mountPath: /data
    volumes:
    - name: test-storage
    persistentVolumeClaim:
    claimName: test-pvc
    Примечание

    В манифест добавлена аннотация backup.velero.io/backup-volumes. File System Backup будет создавать резервные копии только тех томов, для которых добавлена эта аннотация.

  2. Создайте деплоймент:

    bash
    kubectl apply -f myapp.yaml
  3. Убедитесь, что приложение и его Persistent Volume Claim успешно созданы:

    bash
    kubectl get pods -l app=test-app && \
    kubectl get pvc test-pvc

    Ожидаемый результат:

    bash
    NAME READY STATUS RESTARTS AGE
    test-app-7bf57b58b8-jnxqf 1/1 Running 0 2m30s
    NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
    test-pvc Bound pvc-c81a3ea4-cfe6-4703-bd00-ddb349a977f3 1Gi RWO mws <unset> 2m31s
  4. Добавьте секрет Kubernetes:

    bash
    kubectl create secret generic test-secret \
    --namespace default \
    --from-literal=username=admin \
    --from-literal=password=password123
  5. Добавьте метку (selector) на созданный секрет:

    bash
    kubectl label secret test-secret -n default secret=my-test-secret
  6. Убедитесь, что секрет успешно создан:

    bash
    kubectl get secrets -n default

В этой части руководства вы установите серверную часть Velero в кластер Managed Kubernetes.

  1. Аутентифицируйтесь в Artifact Registry:

    Примечание

    Значение параметра -u apikey предустановлено, изменять его не нужно. Укажите только значение для API-ключа.

    bash
    helm registry login -u apikey -p <API-ключ> registry.mwsapis.ru
  2. Скачайте Helm-чарт velero на ВМ:

    bash
    helm pull oci://registry.mwsapis.ru/mws-mk8s-images/customer/charts/velero \
    --version 12.0.0 \
    --untar
  3. Создайте файл с ключами:

    bash
    cat << EOF > credentials-velero.txt
    [default]
    aws_access_key_id=<значение Access key HMAC-ключа>
    aws_secret_access_key=<значение Secret key HMAC-ключа>
    EOF
  4. Установите Velero:

    bash
    helm install --namespace velero \
    --create-namespace \
    --generate-name \
    --set backupStorageLocationCustomRepo.bucket=velero-bucket \
    --set-file credentials.secretContents.cloud=credentials-velero.txt \
    ./velero/
  5. Проверьте успешность установки:

    bash
    helm list -n velero

    Ожидаемый результат:

    bash
    NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
    velero-1774353057 velero 1 2026-03-24 14:50:59.258129131 +0300 MSK deployed velero-12.0.0 1.18.0
  6. Проверьте доступность бакета и работоспособность пода Velero:

    bash
    kubectl get -n velero backupstoragelocations.velero.io && \
    kubectl get -n velero deployment

    Ожидаемый результат:

    bash
    NAME PHASE LAST VALIDATED AGE DEFAULT
    velero-s3-backup Available 35s 55m true
    NAME READY UP-TO-DATE AVAILABLE AGE
    velero 1/1 1 1 55m

Механизм File System Backup позволяет создавать резервные копии данных, находящихся в томах постоянного хранилища. Создание резервных копий постоянных хранилищ с помощью снапшотов CSI не поддерживается.

Включите механизм File System Backup в вашем кластере Managed Kubernetes:

  1. Внесите изменения в файл ./velero/values.yaml, с помощью которого ранее был установлен Velero. Удалите символ # перед следующими строками:

    yaml
    ...
    deployNodeAgent: true
    nodeAgent:
    disableHostPath: false
    resources:
    requests:
    cpu: 500m
    memory: 512Mi
    limits:
    cpu: 1000m
    memory: 1024Mi
    useScratchEmptyDir: true
    ...
  2. Узнайте имя деплоймента Velero:

    bash
    helm list -n velero

    Ожидаемый результат:

    bash
    NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
    <имя деплоймента> velero 1 2026-03-24 14:50:59.258129131 +0300 MSK deployed velero-12.0.0 1.18.0
  3. Обновите деплоймент:

    bash
    helm upgrade <имя деплоймента> \
    --namespace velero \
    --set backupStorageLocationCustomRepo.bucket=velero-bucket \
    -f ./velero/values.yaml \
    ./velero/ \
    --reset-values
  4. Убедитесь, что агенты Velero расположены на каждом узле кластера:

    bash
    kubectl get pods -n velero -l "name=node-agent"

    Ожидаемый результат:

    bash
    NAME READY STATUS RESTARTS AGE
    node-agent-xlknx 1/1 Running 0 64m

    Теперь Velero может создавать резервные копии данных из постоянного хранилища этого пода.

5. Настройте расписание резервного копирования

Заголовок раздела «5. Настройте расписание резервного копирования»

В этой части руководства вы создадите расписание резервного копирования. Копия будет создаваться ежедневно в 12:00 и включать в себя все объекты кластера.

  1. Подготовьте манифест с расписанием резервного копирования:

    bash
    cat << EOF > schedule-velero.txt
    apiVersion: velero.io/v1
    kind: Schedule
    metadata:
    name: velero-main-schedule
    namespace: velero
    spec:
    schedule: 0 */12 * * *
    skipImmediately: false
    template:
    hooks: {}
    includeClusterResources: true
    includedNamespaces:
    - '*'
    storageLocation: velero-s3-backup
    ttl: 720h
    EOF

    Вы можете изменить некоторые параметры расписания:

    • schedule — расписание резервного копирования в формате crontab;
    • skipImmediately — резервное копирование будет запущено только в момент срабатывания расписания;
    • includeClusterResources — в резервную копию будут включены все объекты уровня кластера (cluster-scoped);
    • includedNamespaces со значением * — в резервную копию будут включены все пространства имен;
    • ttl — время жизни резервной копии (720 часов, 30 дней).
  2. Примените расписание:

    bash
    kubectl apply -f schedule-velero.txt
  3. Убедитесь, что расписание успешно создано и активировано:

    bash
    kubectl get schedules.velero.io -n velero

    Ожидаемый результат:

    bash
    NAME STATUS SCHEDULE LASTBACKUP AGE PAUSED
    velero-main-schedule Enabled 0 */12 * * * 9s

В этом разделе руководства вы вручную создадите резервную копию кластера и постоянного хранилища, используя правила из расписания.

  1. Выполните команду создания копии:

    bash
    velero backup create <имя резервной копии> \
    --from-schedule velero-main-schedule
  2. Дождитесь завершения создания резервной копии. Отслеживать создание копии можно с помощью запроса логов:

    bash
    velero backup logs <имя резервной копии>
  3. Для получения информации о созданной резервной копии используйте команду:

    bash
    velero describe backup <имя резервной копии>

6.2. Создайте резервную копию постоянного хранилища

Заголовок раздела «6.2. Создайте резервную копию постоянного хранилища»

Чтобы включить в резервную копию данные из тома test-storage:

  1. Выполните команду создания копии:

    bash
    velero backup create <имя резервной копии> \
    --from-schedule velero-main-schedule
  2. Дождитесь завершения создания резервной копии. Отслеживать создание копии можно с помощью запроса логов:

    bash
    velero backup logs <имя резервной копии>
  3. Убедитесь, что резервная копия включает в себя том test-storage:

    bash
    velero backup describe <имя резервной копии> --details

    В выводе команды будет информация о резервной копии тома:

    bash
    storage.k8s.io/v1/CSIDriver:
    - csi.mws.ru
    storage.k8s.io/v1/CSINode:
    - <имя группы узлов>
    storage.k8s.io/v1/StorageClass:
    - mws
    storage.k8s.io/v1/VolumeAttachment:
    - csi-d3ad5d912fec6d90044c3d288912316184324fc6a76f48231a3948e7d429f9f4
    Примечание

    Velero восстанавливает данные тома только вместе с ресурсами, которые используют эти данные (в этом руководстве — деплоймент и Persistent Volume Claim). Восстановление самих данных без пересоздания ресурсов не поддерживается.

Доступны несколько вариантов восстановления данных из резервной копии:

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

    1. Для проверки восстановления удалите тестовый секрет:

      bash
      kubectl delete secret test-secret
    2. Восстановите удаленный секрет из резервной копии:

      bash
      velero restore create --from-backup <имя резервной копии> \
      --include-namespaces=default \
      --include-resources=secrets
    3. Убедитесь, что секрет восстановлен:

      bash
      kubectl get secrets -n default
  • Чтобы восстановить ресурсы пространства имен на основе метки (selector):

    1. Для проверки восстановления удалите тестовый секрет:

      bash
      kubectl delete secret test-secret
    2. Восстановите удаленный секрет с помощью метки:

      bash
      velero restore create --from-backup <имя резервной копии> \
      --include-namespaces=default \
      --selector "secret=my-test-secret"
  • Чтобы восстановить все ресурсы пространства имен, выполните команду:

    bash
    velero restore create \
    --from-backup <имя резервной копии> \
    --include-namespaces=<пространство имен>
  • Чтобы восстановить все данные в кластере из резервной копии, выполните команду velero restore create --from-backup <имя резервной копии>.

  • Чтобы восстановить данные постоянного хранилища:

    1. Удалите деплоймент и его Persistent Volume Claim:

      bash
      kubectl delete deployment test-app -n default && \
      kubectl delete pvc test-pvc -n default
    2. Убедитесь, что ресурсы удалены:

      bash
      kubectl get deployments,pod,pvc -n default
    3. Восстановите деплоймент и его том из резервной копии:

      bash
      velero restore create test-restore-pv \
      --from-backup <имя резервной копии> \
      --restore-volumes=true
    4. Убедитесь, что ресурсы восстановлены:

      bash
      kubectl get deployments,pod,pvc -n default

Вы можете получить список созданных экземпляров восстановлений, логи и подробную информацию о восстановлении. Для этого используйте команды:

bash
velero get restore
bash
velero restore logs <имя экземпляра восстановления>
bash
velero describe restore <имя экземпляра восстановления>

Ресурсы, созданные в руководстве, тарифицируются. Если вы больше не планируете использовать их: