Резервное копирование, восстановление кластеров рабочей нагрузки с помощью Velero

Область применения: AKS в Azure Stack HCI 22H2, AKS в Windows Server

В этой статье описывается, как установить и использовать Velero для резервного копирования и восстановления рабочей нагрузки и целевых кластеров с помощью Хранилище BLOB-объектов Azure или хранилища MinIO в AKS, включенном Azure Arc.

Velero — это стандартное средство сообщества с открытым кодом для резервного копирования и восстановления объектов кластера Kubernetes и постоянных томов. Он поддерживает различные поставщики хранилища для хранения своих резервных копий. Если целевой кластер AkS Arc Kubernetes аварийно завершает работу и не восстанавливается, вы можете использовать резервную копию Velero для восстановления содержимого и внутренних объектов API в новом кластере.

Если вы не хотите хранить резервные копии в Хранилище BLOB-объектов Azure, можно использовать MinIO с Velero. В этой статье описывается установка и настройка Velero для использования Хранилище BLOB-объектов Azure или установка и настройка Velero для использования хранилища MinIO.

Примечание

Velero официально не поддерживает Microsoft Windows. В ходе тестирования команда Velero смогла создавать резервные копии только приложений Windows без отслеживания состояния. Restic интеграция и резервное копирование приложений с отслеживанием состояния или постоянных томов не поддерживались.

Предварительные требования

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

Установка Velero с Хранилище BLOB-объектов Azure

В этом разделе описано, как установить Velero и использовать Хранилище BLOB-объектов Azure для резервного копирования. Если вы не хотите хранить резервные копии в Azure, перейдите к разделу Установка Velero с хранилищем MiniO.

  1. Откройте PowerShell от имени администратора.

  2. Войдите в Azure с помощью Azure CLI:

    az login --use-device-code   
    
  3. Установите Velero CLI , выполнив следующую команду:

Примечание

Флаг --use-restic больше не поддерживается в версии velero 1.10 и более поздних версий. Для использования флага версии 1.9.x требуется

choco install velero   
  1. При необходимости измените подписку Azure, которую вы хотите использовать для резервного копирования.

    По умолчанию Velero хранит резервные копии в той же подписке Azure, что и виртуальные машины и диски, и не позволяет восстанавливать резервные копии в группе ресурсов в другой подписке. Чтобы включить резервное копирование и восстановление между подписками, укажите подписку для резервного копирования. Этот шаг можно пропустить, если вы уже находитесь в подписке, которую вы хотите использовать для резервного копирования.

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

    1. Используйте имя подписки, чтобы найти идентификатор подписки:

      $AZURE_BACKUP_SUBSCRIPTION_NAME="<NAME_OF_TARGET_SUBSCRIPTION>"
      $AZURE_BACKUP_SUBSCRIPTION_ID=$(az account list --query="[?name=='$AZURE_BACKUP_SUBSCRIPTION_NAME'].id | [0]" -o tsv)
      
    2. Затем измените подписку:

      az account set -s $AZURE_BACKUP_SUBSCRIPTION_ID
      
  2. Создайте учетную запись хранения Azure и контейнер BLOB-объектов.

    При использовании Хранилище BLOB-объектов Azure для резервного копирования Velero требуется учетная запись хранения и контейнер BLOB-объектов для хранения резервных копий. В следующем примере показана учетная запись хранения, созданная в новой группе ресурсов Velero_Backups .

    Необходимо создать учетную запись хранения с глобально уникальным идентификатором, который можно использовать в DNS. Пример скрипта использует приложение для uuidgen случайного создания уникального имени. Вы можете использовать любой метод, если имя соответствует правилам именования Azure для учетных записей хранения.

    Учетная запись хранения создается с возможностями шифрования неактивных данных (с помощью ключей, управляемых Корпорацией Майкрософт), и настроена для разрешения доступа только через HTTPS-подключения.

    Чтобы создать учетную запись хранения и контейнер BLOB-объектов, выполните следующие действия.

    1. Создайте группу ресурсов для учетной записи хранения резервных копий. При необходимости измените каталоги на предпочитаемое расположение и выполните следующие команды:

      $AZURE_BACKUP_RESOURCE_GROUP="Velero_Backups"
      az group create -n $AZURE_BACKUP_RESOURCE_GROUP --location WestUS
      
    2. Создайте учетную запись хранения.

      $AZURE_STORAGE_ACCOUNT_ID="<NAME_OF_ACCOUNT_TO_ASSIGN>"
      
      az storage account create --name $AZURE_STORAGE_ACCOUNT_ID --resource-group $AZURE_BACKUP_RESOURCE_GROUP --sku Standard_GRS --encryption-services blob --https-only true --kind BlobStorage --access-tier Hot
      
    3. Создайте контейнер больших двоичных объектов:

      $BLOB_CONTAINER="velero"
      az storage container create -n $BLOB_CONTAINER --public-access off --account-name $AZURE_STORAGE_ACCOUNT_ID
      

      В примере используется контейнер больших двоичных объектов с именем velero. Можно использовать другое имя, предпочтительно уникальное для одного кластера Kubernetes.

  3. Создайте субъект-службу:

    1. Получите идентификатор подписки и идентификатор клиента для учетной записи Azure:

      $AZURE_SUBSCRIPTION_ID=(az account list --query '[?isDefault].id' -o tsv)
      $AZURE_TENANT_ID=(az account list --query '[?isDefault].tenantId' -o tsv) 
      
    2. Создайте субъект-службу с привилегиями участника.

      Вы можете создать субъект-службу с ролью Участника или использовать пользовательскую роль:

      • Роль участника: Роль Участник предоставляет доступ по всей подписке, поэтому обязательно защитите эти учетные данные, если вы назначите эту роль.
      • Настраиваемая роль: Если вам нужна более ограничительная роль, используйте пользовательскую роль.

      Назначьте роль участника:

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

      Чтобы создать субъект-службу с ролью Участника, используйте следующую команду. Замените собственный идентификатор подписки и, при необходимости, собственное имя субъекта-службы. Microsoft Entra ID создадут секрет.

      $AZURE_CLIENT_SECRET=(az ad sp create-for-rbac --name "velero" --role "Contributor" --query 'password' -o tsv --scopes  /subscriptions/$AZURE_SUBSCRIPTION_ID)
      

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

      • Если вы планируете использовать разные подписки для кластера рабочей нагрузки и файлов резервных копий Velero, укажите оба идентификатора подписки, как показано в следующем примере:

        $AZURE_CLIENT_SECRET=(az ad sp create-for-rbac --name "velero" --role "Contributor" --query 'password' -o tsv --scopes  /subscriptions/$AZURE_SUBSCRIPTION_ID /subscriptions/$AZURE_BACKUP_SUBSCRIPTION_ID)
        
      • Если вы не хотите использовать velero в качестве имени субъекта-службы, убедитесь, что --name выбранный элемент уникален в Microsoft Entra ID и не конфликтует с другими субъектами-службами или регистрацией приложений.

      Важно!

      Секрет отображается только на этом шаге при создании субъекта-службы. Обязательно запишите секрет для использования в последующих шагах.

      Используйте настраиваемую роль:

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

      1. Создайте файл с именем azure-role.json со следующим содержимым. Замените собственное имя пользовательской роли и идентификатор подписки.

        {
            "Name": <CUSTOM_ROLE_NAME>,
            "Id": null,
            "IsCustom": true,
            "Description": "Velero related permissions to perform backups, restores and deletions",
            "Actions": [
                "Microsoft.Compute/disks/read",
                "Microsoft.Compute/disks/write",
                "Microsoft.Compute/disks/endGetAccess/action",
                "Microsoft.Compute/disks/beginGetAccess/action",
                "Microsoft.Compute/snapshots/read",
                "Microsoft.Compute/snapshots/write",
                "Microsoft.Compute/snapshots/delete",
                "Microsoft.Storage/storageAccounts/listkeys/action",
                "Microsoft.Storage/storageAccounts/regeneratekey/action"
            ],
            "NotActions": [],
            "AssignableScopes": [
              "<SUBSCRIPTION_ID>"
            ]
        }
        
      2. Создайте пользовательскую роль и субъект-службу:

        az role definition create --role-definition azure-role.json
        
        $AZURE_CLIENT_SECRET=(az ad sp create-for-rbac --name "velero" --role "<CUSTOM_ROLE>" --query 'password' -o tsv --scopes  /subscriptions/$AZURE_SUBSCRIPTION_ID)
        

      Дополнительные сведения о создании пользовательских ролей см. в разделе Настройка разрешений для Velero.

  4. Получите имя субъекта-службы и назначьте его переменной AZURE_CLIENT_ID :

    $AZURE_CLIENT_ID=(az ad sp list --display-name "velero" --query '[0].appId' -o tsv)
    

    Примечание

    Срок действия субъектов-служб истекает. Чтобы узнать, когда истечет срок действия нового субъекта-службы, выполните следующую команду: az ad sp show --id $AZURE_CLIENT_ID.

  5. Создайте файл, содержащий переменные, необходимые для установки Velero. Команда выглядит примерно так:

    AZURE_SUBSCRIPTION_ID=${AZURE_SUBSCRIPTION_ID}
    AZURE_TENANT_ID=${AZURE_TENANT_ID}
    AZURE_CLIENT_ID=${AZURE_CLIENT_ID}
    AZURE_CLIENT_SECRET=${AZURE_CLIENT_SECRET}
    AZURE_RESOURCE_GROUP=${AZURE_BACKUP_RESOURCE_GROUP}
    AZURE_CLOUD_NAME=AzurePublicCloud" | Out-File -FilePath ./credentials-velero.txt
    

    Важно!

    Удалите этот файл после установки Velero. Секрет клиента находится в виде открытого текста, что может представлять угрозу безопасности.

    Прежде чем продолжить, убедитесь, что файл имеет правильный формат. Расширение имени файла не имеет значения.

    • Удалите все лишние пробелы или вкладки.
    • Убедитесь, что имена переменных правильные.
  6. Установите и запустите Velero.

    Установите Velero в кластере и запустите развертывание. Эта процедура создает пространство имен с именем velero и добавляет в это пространство имен развертывание velero .

    1. Установите Velero с помощью следующей команды. Вам потребуется настроить пример команды.

      velero install --provider azure --plugins velero/velero-plugin-for-microsoft-azure:v1.5.0 --bucket $BLOB_CONTAINER --secret-file ./credentials-velero.txt --backup-location-config resourceGroup=$AZURE_BACKUP_RESOURCE_GROUP,storageAccount=$AZURE_STORAGE_ACCOUNT_ID,subscriptionId=$AZURE_BACKUP_SUBSCRIPTION_ID --use-restic
      

      При необходимости задайте следующие переменные:

      • Команда устанавливает подключаемый модуль Microsoft Azure, который должен быть совместим с используемой версией Velero CLI. В примере команды используется подключаемый модуль Microsoft Azure версии 1.5.0, совместимый с последней версией Velero CLI 1.9.0. Чтобы узнать, какую версию подключаемого модуля Microsoft Azure следует установить с версией Valero CLI, см. матрицу совместимости.

      • Обязательно включите параметр , --use-restic чтобы включить резервное копирование томов Kubernetes на уровне файловой системы с помощью Restic. Restic можно использовать для резервного копирования любого типа тома Kubernetes. По умолчанию Velero поддерживает создание моментальных снимков постоянных томов для томов Amazon EBS, Azure Управляемые диски и постоянных дисков Google. В AKS Arc тома Kubernetes используют общие тома кластера для хранения данных. Следовательно, Restic требуется для включения постоянных моментальных снимков тома. AkS Arc в настоящее время не поддерживает моментальные снимки томов.

      • Аргумент subscriptionId=$AZURE_BACKUP_SUBSCRIPTION_ID является необязательным. Его нужно включать, только если Velero и кластер рабочей нагрузки имеют разные идентификаторы подписок. Если они используют ту же подписку Azure, вы можете удалить subscriptionId параметр, и файлcredentials-velero.txt предоставит эти сведения.

      Служба Velero запускается автоматически при установке.

    2. Проверьте, правильно ли работает служба Velero:

      kubectl -n velero get pods
      kubectl logs deployment/velero -n velero
      

      Команда get pods должна показать, что модули pod Velero запущены.

Установка Velero с хранилищем MinIO

В этом разделе описано, как установить Velero и использовать хранилище MinIO для резервного копирования. Если вы предпочитаете использовать Хранилище BLOB-объектов Azure для резервного копирования, перейдите к разделу Установка Velero с помощью Хранилище BLOB-объектов Azure.

Если вы не хотите хранить резервные копии в MinIO, перейдите к разделу Настройка Velero для использования Хранилище BLOB-объектов Azure.

  1. Установите интерфейс командной строки Velero, выполнив следующую команду. Установить Chocolately если вы еще не сделали.

    choco install velero
    
  2. Установите MinIO:

    1. Создайте постоянный том для хранения резервной копии MinIO. В примере создается постоянный том в классе хранения по умолчанию в AKS Arc, который уже существует.

      1. Создайте ФАЙЛ YAML с именем minio-pvc-storage.yaml со следующим содержимым:

        kind: PersistentVolumeClaim
        apiVersion: v1
        metadata: 
        name: minio-pv-claim 
        spec: 
        storageClassName: default 
        accessModes: 
           - ReadWriteOnce 
        resources: 
           requests: 
              storage: 100Gi 
        

        Создайте постоянный том, выполнив следующую команду:

        kubectl create -f minio-pvc-storage.yaml
        
      2. Создайте файл развертывания minio-deployment.yaml для запуска MinIO. Включите следующее содержимое. В развертывании будет использоваться созданный постоянный том.

        apiVersion: apps/v1
        kind: Deployment
        metadata:
        name: minio-deployment 
        spec: 
        selector: 
           matchLabels: 
              app: minio 
        strategy: 
           type: Recreate 
        template: 
           metadata: 
              labels: 
              app: minio 
           spec: 
              volumes: 
              - name: storage 
              persistentVolumeClaim: 
                 claimName: minio-pv-claim 
              containers: 
              - name: minio 
              image: minio/minio:latest 
              args: 
              - server 
              - /storage 
              env: 
              - name: MINIO_ACCESS_KEY 
                 value: "<you can define this>" 
              - name: MINIO_SECRET_KEY 
                 value: "<you can define this>" 
              ports: 
              - containerPort: 9000 
                 hostPort: 9000 
              volumeMounts: 
              - name: storage  
                 mountPath: "/storage" 
        

        Затем создайте развертывание:

        kubectl create -f minio-deployment.yaml
        
    2. Создайте службу Kubernetes с именем minio-service.yaml. Эта служба предоставит внешние IP-адреса для модуля Pod MinIO.

      Создайте ФАЙЛ YAML со следующими параметрами, чтобы настроить службу:

      apiVersion: v1 
      kind: Service 
      metadata: 
      name: minio-service 
      spec: 
      type: LoadBalancer 
      ports: 
         - port: 9000 
            targetPort: 9000 
            protocol: TCP 
      selector: 
         app: minio 
      

      Затем создайте службу:

      kubectl create -f mino-service.yaml
      
    3. Получите внешний IP-адрес модуля MinIO, выполнив следующую команду. Вы будете использовать этот адрес для установки Velero.

      kubectl get svc
      
    4. Чтобы проверка, работает ли MinIO, войдите на IP-адрес в браузере или используйте клиент MinIO, как описано ниже.

      Установите клиент MinIO и просмотрите файлы MinIO.

      Скачайте клиент MinIO:

      Invoke-WebRequest -Uri "https://dl.minio.io/client/mc/release/windows-amd64/mc.exe" -OutFile "C:\mc.exe
      

      Затем задайте псевдоним:

      mc alias set minio http://10.10.77.6:9000 "minio_access_key" "minio_secret_key" --api s3v4
      

      Наконец, просмотрите установку MinIO:

      mc ls minio
      
    5. Создайте контейнер для хранения файлов Velero. Этот контейнер будет использоваться в установке Velero.

      mc mb minio/velero-backup
      
    6. Создайте файл учетных данных MinIO со следующими сведениями:

      minio.credentials 
             [default] 
        aws_access_key_id=<minio_access_key> 
        aws_secret_access_key=<minio_secret_key> 
      
  3. Установка Velero:

    velero install --provider aws --bucket velero-backup --secret-file .\minio.credentials --backup-location-config region=minio,s3ForcePathStyle=true,s3Url=http://10.10.77.6:9000 --plugins velero/velero-plugin-for-aws:v1.1.0 --use-restic
    

    Перед выполнением этой команды проверка имя контейнера, учетные данные MinIO и внешний IP-адрес MinIO.

  4. Проверьте, правильно ли работает служба Velero:

    kubectl -n velero get pods
    kubectl logs deployment/velero -n Velero
    

    Команда get pods должна показать, что модули pod Velero запущены.

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

Вы можете создавать резервные копии или восстанавливать все объекты в кластере или фильтровать объекты по типу, пространству имен и (или) метке.

Создание резервной копии

Используйте команду Velero backup create , чтобы создать резервные копии в выбранном хранилище. В следующих примерах используется --default-volumes-to-restic флаг , который создает snapshot постоянных томов. Другие варианты резервного копирования см. в справочнике по резервному копированию Velero.

  • Резервное копирование по запросу всех пространств имен в кластере:

    velero backup create <BACKUP-NAME> --default-volumes-to-restic
    
  • Резервное копирование по запросу одного пространства имен в кластере:

    velero backup create <BACKUP-NAME> --include-namespaces <NAMESPACE1> --default-volumes-to-restic
    
  • Резервное копирование по запросу нескольких выбранных пространств имен в кластере:

    velero backup create <BACKUP-NAME> --include-namespaces <NAMESPACE-1>, <NAMESPACE-2> --default-volumes-to-restic
    

Проверка хода выполнения резервного копирования

  • Чтобы проверка ход выполнения резервного копирования, выполните следующую команду:

    velero backup describe <BACKUP-NAME>
    
  • Если вы используете Хранилище BLOB-объектов Azure для резервных копий, вы можете просмотреть резервную копию в учетной записи хранения Azure в созданном большом двоичном объекте или контейнере.

Восстановление кластера

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

Команда restore позволяет восстановить все объекты и постоянные тома из ранее созданной резервной копии. Вы также можете восстановить только отфильтрованное подмножество объектов и постоянных томов. Дополнительные параметры резервного копирования см. в разделе Фильтрация ресурсов.

В кластере, в который требуется восстановить резервную копию ( целевой кластер):

  1. Разверните Velero с помощью приведенных выше инструкций. Используйте те же учетные данные Azure, что и для исходного кластера.

  2. Убедитесь, что резервный объект Velero создан, выполнив следующую команду. Ресурсы Velero синхронизируются с файлами резервных копий в облачном хранилище.

    velero backup describe <BACKUP-NAME>
    
  3. Убедившись, что указана правильная резервная копия (BACKUP-NAME), восстановите все объекты в резервной копии:

    velero restore create --from-backup <BACKUP-NAME>
    

Справка по командам Velero

Чтобы просмотреть все параметры, связанные с определенной командой Velero, используйте --help флаг с командой . Например, отображаются все параметры, velero restore create --help связанные с командой velero restore create .

Например, чтобы получить список всех параметров velero restore, выполните velero restore --helpкоманду , которая возвращает следующие сведения:

  velero restore [command]
  Available Commands:
  create      Create a restore
  delete      Delete restores
  describe    Describe restores
  get         Get restores
  logs        Get restore logs

Удаление Velero

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

kubectl delete namespace/velero clusterrolebinding/velero 
kubectl delete crds -l component=velero

Дальнейшие действия