---
title: 'Мигрировать в Managed Kubernetes с помощью Velero'
sidebar_label: 'Мигрировать в Managed Kubernetes с помощью Velero'
sidebar_position: 6
description: 'Как перенести Kubernetes-кластер с приложениями и постоянными томами в Managed Kubernetes с помощью Velero'
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import { TabItemLabel } from '@selectel/docux/components';

# Мигрировать в Managed Kubernetes с помощью Velero

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

Velero — утилита для резервного копирования и восстановления Kubernetes-кластеров. Она создает резервную копию ресурсов кластера и данных постоянных томов (PVC), сохраняет ее в S3-совместимое хранилище и восстанавливает в другом кластере. С ее помощью можно перенести Kubernetes-кластер в Managed Kubernetes и заодно обновиться — например, перейти с Kubernetes 1.27 на 1.29 и поднять версии ingress-контроллера и cert-manager.

Установка Velero зависит от способа миграции постоянных томов. Тома можно перенести:

* через снапшоты дисков (CSI) - если кластеры находятся в одном пуле и сегменте пула облака. Это быстро, потому что данные не копируются через хранилище, снапшоты сразу доступны новому кластеру;
* File System Backup (Kopia) - при переносе между сегментами пула, регионами или дата-центрами. Данные томов копируются пофайлово через [S3](https://docs.selectel.ru/s3/). Работает в любом сценарии, но медленнее.

## Шаги миграции

1. [Подготовьте кластеры к миграции](#prepare-clusters-to-migration).
2. [Создайте хранилище для резервных копий](#create-backup-storage).
3. [Установите Velero](#install-velero).
4. [Перенесите кластер в Managed Kubernetes](#migrate-cluster-to-managed-kubernetes).
5. Опционально: [удалите Velero](#delete-velero).

### 1. Подготовить кластеры к миграции \{#prepare-clusters-to-migration}

1. [Создайте кластер Managed Kubernetes](/managed-kubernetes/create/) с нужными группами нод и метками.

2. Разверните системные компоненты — удобнее всего через ваш IaC-инструмент:

   * ingress-контроллер;
   * cert-manager и его ClusterIssuer;
   * PriorityClass;
   * StorageClass — имена объектов StorageClass должны совпадать в исходном и новом кластерах. В Selectel имя StorageClass по умолчанию содержит название пула, поэтому создайте в новом кластере StorageClass с тем же именем, что в исходном, и укажите в нем нужную локацию размещения томов;
   * нужные CRD (Custom Resource Definition) и операторы (например, RabbitMQ и Jaeger);
   * мониторинг.

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

3. Если вы ограничиваете копию параметрами `--include-namespaces` или `--exclude-namespaces`, перенесите ClusterRole вручную — они не относятся к пространствам имен и в копию не попадут.

4. Убедитесь, что правила размещения подов (affinity и nodeSelector) подходят для нового кластера — например, не ссылаются на конкретные зоны. Не правьте поды вручную во время восстановления: при File System Backup пересоздание пода удалит init-контейнер Velero, который ожидает окончания восстановления данных тома.

5. Исключите из копирования тома, подключенные вручную, например NFS, S3-бакеты в режиме ReadWriteMany и подобные. Для этого добавьте в шаблон пода аннотацию с именами таких томов из его спецификации. Например:

   ```bash
   backup.velero.io/backup-volumes-excludes=VOLUME_NAME
   ```

6. Если ваши Ingress используют аннотации со сниппетами, убедитесь, что включен параметр `allowSnippetAnnotations` — иначе манифесты не пройдут валидацию при восстановлении. В новых версиях ingress-nginx параметр `allowSnippetAnnotations` по умолчанию выключен.

### 2. Создать хранилище для резервных копий \{#create-backup-storage}

Настроить доступ к S3 может [Владелец аккаунта](/access-control/user-types.mdx#account-owner) или пользователь с ролью [`iam.admin`](/access-control/role-reference.mdx#iam-admin).

1. [Создайте бакет в S3 Selectel](/s3/buckets/create-bucket.mdx).

2. [Создайте сервисного пользователя](/access-control/manage/add-user.mdx#add-service-user) с [ролью с доступом в S3](/s3/about/manage-access.mdx#access-within-roles).
   Если вы используете сервисного пользователя с ролью [`s3.user`](/access-control/role-reference.mdx#s3-user), [`object_storage_user`](/access-control/role-reference.mdx#object-storage-user) или [`s3.bucket.user`](/access-control/role-reference.mdx#s3-bucket-user), в бакете должна быть настроена [политика доступа](/s3/buckets/bucket-policy/) и ее [правила](/s3/buckets/bucket-policy/about-bucket-policy.mdx#rules) должны разрешать доступ этому пользователю.

3. [Выдайте пользователю S3-ключ](/access-control/manage/edit-user-data-or-role.mdx#issue-s3-key).

4. Откройте CLI.

5. Сохраните ключи сервисного пользователя в файл `s3creds`:

   ```
   [default]
   aws_access_key_id=<access_key>
   aws_secret_access_key=<secret_key>
   ```

   Укажите:

   * `<access_key>` — значение поля **Access key** из [S3-ключа](/access-control/manage/edit-user-data-or-role/#issue-s3-key);
   * `<secret_key` — значение поля **Secret key** из S3-ключа.

### 3. Установите Velero \{#install-velero}

Velero устанавливается в оба кластера с одинаковой конфигурацией. Переключаться между кластерами можно через контексты kubectl (`kubectl config use-context`) или параметр `--kubecontext` в командах Velero.

Способ установки зависит от того, как вы будете переносить постоянные тома: через снапшоты или File System Backup. Подробнее о разнице между способами переноса в подразделе Как устроена миграция.

<Tabs queryString="install-velero">
  <TabItem value="snapshots" default>
    <TabItemLabel>
      Через снапшоты
    </TabItemLabel>

    1. Откройте CLI.

    2. Установите Velero:

       ```bash
       velero install \
           --features=EnableCSI \
           --plugins velero/velero-plugin-for-aws:v1.11.1,openebs/velero-plugin:3.6.0 \
           --provider aws \
           --bucket <bucket_name> \
           --velero-pod-mem-limit=1024Mi \
           --secret-file s3creds \
           --backup-location-config \
           region=<pool>,s3ForcePathStyle="true",s3Url="<url>",checksumAlgorithm="" \
           --snapshot-location-config \
           region=<pool>,s3ForcePathStyle="true",s3Url="<url>",checksumAlgorithm="",restoreAllIncrementalSnapshots="false",autoSetTargetIP="true",bucket="<bucket_name>"
       ```

       Укажите:

       * `<bucket_name>` — имя бакета, созданного на шаге 2 при [создании хранилища для резервных копий](#create-backup-storage);
       * `<pool>` — [пул](/infrastructure/locations/#pool), в котором находятся кластеры, например `ru-6`;
       * `<url>` — [домен S3 API](/s3/manage/domains/#s3-api-domains), зависит от [пула](/infrastructure/locations/#pool), в котором находится S3.

    3. В созданном ресурсе VolumeSnapshotLocation смените провайдера на `openebs.io/cstor-blockstore`.

    4. В исходном кластере настройте работу со снапшотами томов, чтобы Velero мог сам создавать снапшоты дисков и разворачивать из них тома. Подробнее — в инструкции [документации Selectel о снапшотах томов](/managed-kubernetes/volumes/volume-snapshots.mdx).
  </TabItem>

  <TabItem value="file-system-backup">
    <TabItemLabel>
      Через File System Backup
    </TabItemLabel>

    1. Откройте CLI.

    2. Установите Velero — снапшоты будут отключены, данные томов скопируются через хранилище:

       ```bash
       velero install \
           --use-node-agent \
           --default-volumes-to-fs-backup \
           --use-volume-snapshots=false \
           --plugins velero/velero-plugin-for-aws:v1.11.1 \
           --provider aws \
           --bucket <bucket_name> \
           --velero-pod-mem-limit=1024Mi \
           --secret-file s3creds \
           --backup-location-config \
           region=<pool>,s3ForcePathStyle="true",s3Url="<url>",checksumAlgorithm=""
       ```

       Укажите:

       * `<bucket_name>` — имя бакета, созданного при [создании хранилища для резервных копий](#create-backup-storage);
       * `<pool>` — [пул](/infrastructure/locations/#pool), в котором находятся кластеры, например `ru-6`;
       * `<url>` — [домен S3 API](/s3/manage/domains/#s3-api-domains), зависит от [пула](/infrastructure/locations/#pool), в котором находится S3.
  </TabItem>
</Tabs>

### 4. Перенести кластер в Managed Kubernetes \{#migrate-cluster-to-managed-kubernetes}

1. Откройте CLI.

2. Остановите внесение изменений. В исходном кластере уменьшите до нуля реплики сервисов, через которые меняются конфигурация или данные приложений, - например, CI/CD-раннеров и админок. В новый кластер они переедут выключенными:

   ```bash
   kubectl -n NAMESPACE scale deployment DEPLOYMENT_NAME --replicas=0
   ```

3. Cнимите дампы баз данных, которые работают вне кластера. Базы данных на PVC внутри кластера Velero перенесет вместе с томами.

4. Создайте резервную копию в исходном кластере. Исключите пространства имен компонентов, которые уже развернуты в новом кластере на этапе 1 при подготовке кластеров к миграции. Например:

   ```bash
   velero backup create backup-cluster --exclude-namespaces ingress-nginx,cert-manager,monitoring
   ```

5. Дождитесь, когда статус копии станет `Completed`. Например:

   ```bash
   velero backup describe backup-cluster --details
   ```

6. Переключитесь на новый кластер и запустите восстановление. Например:

   ```bash
   velero restore create restore-cluster --from-backup backup-cluster
   ```

7. Следите за восстановлением и состоянием подов. Например:

   ```bash
   velero restore describe restore-cluster --details
   kubectl get pods -A
   ```

8. Когда все приложения поднялись, переключите трафик на новый кластер. Например, по схеме blue-green: обновите DNS-записи или конфигурацию внешнего балансировщика так, чтобы трафик шел на ноды нового кластера.

9. Включите сервисы, остановленные на шаге 2. Например:

   ```bash
   kubectl -n NAMESPACE scale deployment DEPLOYMENT_NAME --replicas=1
   ```

### 5. Опционально: удалить Velero \{#delete-velero}

Если Velero не нужен для регулярного резервного копирования, удалите его из обоих кластеров:

```bash
velero uninstall
```

Команда снимет финализаторы Velero с ресурсов и удалит его CRD. На восстановленных ресурсах временно останутся метки с именем резервной копии - они уйдут при следующем штатном развертывании приложения.

<Formbricks />
