• Русский
  • Настройка аварийного восстановления для PersistentVolumeClaim

    Для обеспечения межкластерного аварийного восстановления для PVC приложения используйте Alauda Build of VolSync.

    Обзор

    Alauda Build of VolSync — это Operator, который выполняет асинхронную репликацию persistent volumes внутри кластера или между кластерами. Репликация, предоставляемая VolSync, не зависит от системы хранения. Это позволяет выполнять репликацию в хранилища и из хранилищ, которые обычно не поддерживают удаленную репликацию. Кроме того, она может работать между разными типами (и поставщиками) хранилищ.

    Терминология

    ТерминПояснение
    Primary ClusterАктивная production-среда.
    Secondary ClusterРезервная площадка для восстановления; остается в режиме ожидания и готова принять нагрузку во время аварии.
    Stateful ApplicationПриложения, использующие PVC для сохранения данных.
    ReplicationSourceReplicationSource — это ресурс VolSync, который можно использовать для определения исходного PVC и типа replication mover, что позволяет реплицировать или синхронизировать данные PVC в удаленное расположение.
    ReplicationDestinationReplicationDestination — это ресурс VolSync, который можно использовать для определения назначения репликации или синхронизации VolSync.
    Data MoversData movers в VolSync отвечают за копирование данных из одного расположения в другое.

    Поддерживаемые movers:
    • Rclone
    • Restic
    • Rsync

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

    • Скачайте установочный пакет Alauda Build of VolSync, соответствующий архитектуре вашей платформы.
    • Загрузите установочный пакет Alauda Build of VolSync с помощью механизма Upload Packages на оба кластера: Primary и Secondary.
    • На обоих кластерах — Primary и Secondary — развернут Alauda Container Platform Snapshot Management.
    • Хранилище, используемое PVC, должно быть предоставлено через CSI и поддерживать функциональность snapshot.

    Развертывание Alauda Build of VolSync

    1. Войдите в систему и перейдите на страницу Administrator.

    2. Нажмите Marketplace > OperatorHub, чтобы открыть страницу OperatorHub.

    3. Найдите Alauda Build of VolSync, нажмите Install и перейдите на страницу Install Alauda Build of VolSync.

      Параметры конфигурации:

      ParameterRecommended Configuration
      ChannelКанал по умолчанию — stable.
      Installation ModeCluster: Все namespace в кластере используют один экземпляр Operator для создания и управления, что приводит к меньшему потреблению ресурсов.
      Installation PlaceВыберите Recommended. Поддерживается только Namespace volsync-system.
      Upgrade StrategyManual: При появлении новой версии в Operator Hub для обновления Operator до последней версии требуется ручное подтверждение.

    Настройка запланированной синхронизации

    После настройки Scheduled Synchronization для PVC VolSync будет автоматически синхронизировать данные из ReplicationSource в ReplicationDestination с заданным интервалом.

    В этом разделе описаны шаги настройки синхронизации данных из primary-кластера в secondary-кластер. Для синхронизации из secondary в primary адаптируйте приведенный ниже пример, поменяв местами роли кластеров (primary и secondary)

    Создание Secret для Data Mover rsync-tls

    Создайте Secret на обоих кластерах — Primary и Secondary; пропустите этот шаг, если Secret уже существует.

    Команда
    Пример
    apiVersion: v1
    data:
      psk.txt: <psk>
    kind: Secret
    metadata:
      name: <name>
      namespace: <namespace>
    type: Opaque

    Параметры:

    ParameterExplanation
    nameИмя Secret
    namespaceNamespace Secret, должен совпадать с namespace приложения
    pskЭто поле должно соответствовать формату, ожидаемому stunnel: <id>:<не менее 32 шестнадцатеричных символов>.
    Например, 1:23b7395fafc3e842bd8ac0fe142e6ad1.

    Создание ресурса ReplicationDestination

    Создайте ReplicationDestination на кластере Secondary

    Команда
    Пример
    cat << EOF | kubectl create -f -
    apiVersion: volsync.backube/v1alpha1
    kind: ReplicationDestination
    metadata:
      name: rd-<pvc-name>
      namespace: <namespace>
    spec:
      rsyncTLS:
        copyMethod: Snapshot
        destinationPVC: <pvc-name>
        keySecret: <key-secret>
        serviceType: <service-type>
        storageClassName: <storageclass-name>
        volumeSnapshotClassName: <volumesnapshotclass-name>
        moverSecurityContext:
          fsGroup: 65534
          runAsGroup: 65534
          runAsNonRoot: true
          runAsUser: 65534
          seccompProfile:
            type: RuntimeDefault
    EOF

    Параметры:

    ParameterExplanation
    namespaceNamespace должен быть тем же, что и у приложения
    pvc-nameИмя существующего PVC, используемого приложением
    key-secretИмя Secret, содержащего ключ TLS-PSK для аутентификации соединения с источником. Создайте его на Шаге 1
    service-typeVolSync создает Service, чтобы источник мог подключиться к назначению. Это поле определяет тип этого Service. Допустимые значения: ClusterIP, LoadBalancer или NodePort.
    storageclass-nameИмя storageclass, используемого PVC приложения
    volumesnapshotclass-nameИмя volumesnapshotclass, соответствующего PVC приложения
    NOTE

    О типе Service

    Если указан ClusterIP, Service получит IP-адрес, выделенный из пула адресов “cluster network”. По умолчанию этот набор адресов недоступен извне кластера, поэтому он плохо подходит для межкластерной репликации. Однако различные сетевые дополнения, такие как Submariner, объединяют cluster network, что делает этот вариант подходящим.

    Если указан LoadBalancer, будет выделен внешний IP-адрес. Для этого требуется поддержка load balancer'ов на уровне кластера, например, реализованная различными облачными провайдерами, либо MetalLB в случае физических кластеров. Хотя это самый простой способ выделить доступный адрес в облачных средах, load balancer'ы обычно влекут за собой дополнительные расходы и имеют ограниченное количество.

    Создание ресурса ReplicationSource

    Создайте ReplicationSource на кластере Primary

    Команда
    Пример
    cat << EOF | kubectl create -f -
    apiVersion: volsync.backube/v1alpha1
    kind: ReplicationSource
    metadata:
      name: rs-<pvc-name>
      namespace: <namespace>
    spec:
      rsyncTLS:
        address: <address>
        copyMethod: Snapshot
        keySecret: <key-secret>
        port: <port>
        storageClassName: <storageclass-name>
        volumeSnapshotClassName: <volumesnapshotclass-name>
        moverSecurityContext:
          fsGroup: 65534
          runAsGroup: 65534
          runAsNonRoot: true
          runAsUser: 65534
          seccompProfile:
            type: RuntimeDefault
      sourcePVC: <pvc-name>
      trigger:
        schedule: <schedule>
    EOF

    Параметры:

    ParameterExplanation
    namespaceИмя Namespace, должно совпадать с приложением
    pvc-nameИмя PVC приложения
    key-secretИмя secret VolSync, созданного на Шаге 1
    addressУказывает адрес SSH-сервера назначения репликации. Его можно взять напрямую из поля .status.rsync.address ресурса ReplicationDestination.
    portПорт Service для подключения к назначению
    storageclass-nameИмя storageclass, используемого PVC приложения
    volumesnapshotclass-nameИмя volumesnapshotclass, соответствующего PVC приложения
    scheduleРасписание синхронизации, определяемое через cronspec, что делает его очень гибким. Можно указать как интервалы, так и конкретное время и/или дни.

    Проверка статуса синхронизации

    Проверьте синхронизацию из ReplicationSource

    Команда
    Пример
    kubectl -n <namespace> get ReplicationSource <rs-name> -o jsonpath='{.status}'

    Последняя синхронизация была завершена в .status.lastSyncTime и заняла .status.lastSyncDuration секунд.

    Следующая запланированная синхронизация будет в .status.nextSyncTime.

    Настройка однократной синхронизации

    One-Time Synchronization запускается вручную. Это управляется путем задания уникальной строки для поля manual в спецификации trigger ресурса ReplicationSource. Задача синхронизации выполняется один раз сразу после применения конфигурации.

    Создание ресурса ReplicationSource для однократной синхронизации

    Команда
    Пример
    cat << EOF | kubectl create -f -
    apiVersion: volsync.backube/v1alpha1
    kind: ReplicationSource
    metadata:
      name: rs-<pvc-name>-latest
      namespace: <namespace>
    spec:
      rsyncTLS:
        address: <address>
        copyMethod: Snapshot
        keySecret: <key-secret>
        port: <port>
        storageClassName: <storageclass-name>
        volumeSnapshotClassName: <volumesnapshotclass-name>
        moverSecurityContext:
          fsGroup: 65534
          runAsGroup: 65534
          runAsNonRoot: true
          runAsUser: 65534
          seccompProfile:
            type: RuntimeDefault
      sourcePVC: <pvc-name>
      trigger:
        manual: <manual-id>
    EOF

    Единственное отличие от Запланированной синхронизации состоит в том, что .spec.trigger следует установить в manual.

    Проверка статуса синхронизации

    Команда
    Пример
    kubectl -n <namespace> get ReplicationSource <rs-name> -o jsonpath='{.status.lastManualSync}'

    Если вывод совпадает с <manual-id>, синхронизация завершена.

    Включение аварийного восстановления для PVC приложения

    Развертывание stateful-приложения

    1. Разверните stateful-приложения на кластере Primary
    Нажмите, чтобы просмотреть
    cat << EOF | kubectl create -f -
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-01
      namespace: default
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      storageClassName: sc-cephfs
      volumeMode: Filesystem
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ubuntu
      namespace: default
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: ubuntu
      strategy:
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 1
        type: RollingUpdate
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: ubuntu
        spec:
          affinity: {}
          containers:
            - command:
                - sleep
                - infinity
              image: registry.alauda.cn:60070/ops/ubuntu:latest
              imagePullPolicy: Always
              name: ubuntu
              resources: {}
              securityContext:
                allowPrivilegeEscalation: false
                capabilities:
                  drop:
                    - ALL
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
              volumeMounts:
                - mountPath: /data
                  name: data
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext:
            runAsNonRoot: true
            seccompProfile:
              type: RuntimeDefault
          terminationGracePeriodSeconds: 30
          volumes:
            - name: data
              persistentVolumeClaim:
                claimName: pvc-01
    EOF
    1. Создайте PVC приложения на кластере Secondary

      cat << EOF | kubectl create -f -
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: pvc-01
        namespace: default
      spec:
        accessModes:
          - ReadWriteMany
        resources:
          requests:
            storage: 10Gi
        storageClassName: sc-cephfs
        volumeMode: Filesystem
      EOF

    Настройка аварийного восстановления PVC

    Настройте синхронизацию Primary-to-Secondary

    См. Настройка запланированной синхронизации

    Плановая миграция

    Сценарий использования:

    Перенос бизнес-сервисов с кластера Primary на кластер Secondary, пока оба кластера работают в штатном режиме.

    Процедуры

    1. Снизьте количество pod'ов приложения

      Снизьте количество всех pod'ов приложения, которые используют dr PVC, на кластере Primary.

    2. Удалите ресурс ReplicationSource

      Удалите ReplicationSource на кластере Primary

      Команда
      Пример
      kubectl -n <namespace> delete ReplicationSource <rs-name>
    3. Создайте однократную синхронизацию

      Запустите задачу синхронизации с кластера Primary, чтобы гарантировать, что данные на кластере Secondary находятся в состоянии up-to-date.

      Создайте ReplicationSource на кластере Primary

      См. Настройка однократной синхронизации

    4. Удалите однократную синхронизацию

      После завершения однократной синхронизации удалите ресурс One-Time ReplicationSource

      Команда
      Пример
      kubectl -n <namespace> delete ReplicationSource <rs-name>
    5. Удалите ресурс ReplicationDestination

      Удалите ReplicationDestination на кластере Secondary

      Команда
      Пример
      kubectl -n <namespace> delete ReplicationDestination <rd-name>
    6. Увеличьте количество pod'ов приложения

      Увеличьте количество всех pod'ов приложения, которые используют dr PVC, на кластере Secondary.

    7. Настройте синхронизацию secondary-to-primary

      Настройте синхронизацию PVC для аварийного восстановления Secondary-to-Primary, создав ReplicationDestination на кластере Primary и ReplicationSource на кластере Secondary.

      См. Настройка запланированной синхронизации

    Failover

    Сценарий использования:

    Переключение сервисов на кластер Secondary после внезапного отключения кластера Primary.

    Процедуры

    Чтобы обеспечить целостность данных (если в primary-кластере произойдет сбой во время синхронизации), выполните локальную синхронизацию на кластере Secondary. Используйте PVC, восстановленный из последнего snapshot PVC приложения, в качестве источника, а текущий PVC приложения — в качестве назначения для выполнения синхронизации данных.

    1. Восстановите PVC

      Восстановите PVC из ReplicationDestination на кластере Secondary

      Команда
      Пример
      cat << EOF | kubectl create -f -
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: restored-<pvc-name>
        namespace: <namespace>
      spec:
        accessModes: [<access-modes>]
        dataSourceRef:
          kind: ReplicationDestination
          apiGroup: volsync.backube
          name: <rd-name>
        resources:
          requests:
            storage: <pvc-size>
        storageClassName: <storageclass-name>
      EOF
    2. Создайте локальный ресурс ReplicationSource

      Создайте ресурс ReplicationSource на кластере Secondary

      Команда
      Пример
      cat << EOF | kubectl create -f -    
      apiVersion: volsync.backube/v1alpha1
      kind: ReplicationSource
      metadata:
        name: rs-<pvc-name>-local
        namespace: <namespace>
      spec:
        rsyncTLS:
          address: <address>
          copyMethod: Snapshot
          keySecret: <key-secret>
          port: <port>
          storageClassName: <storageclass-name>
          volumeSnapshotClassName: <volumesnapshotclass-name>
          moverSecurityContext:
            fsGroup: 65534
            runAsGroup: 65534
            runAsNonRoot: true
            runAsUser: 65534
            seccompProfile:
              type: RuntimeDefault
        sourcePVC: restored-<pvc-name>
        trigger:
          manual: <manual-id>
      EOF

      Параметры см. в Настройке однократной синхронизации

    3. Дождитесь завершения синхронизации

      Команда
      Пример
      kubectl -n <namespace> get ReplicationSource <rs-name> -o jsonpath='{.status.lastManualSync}'

      Если вывод совпадает с <manual-id>, синхронизация завершена.

    4. Удалите локальный ReplicationSource

      Удалите локальный ReplicationSource на кластере Secondary

      Команда
      Пример
      kubectl -n <namespace> delete ReplicationSource <rs-name>
    5. Удалите ReplicationDestination

      Удалите ReplicationDestination на кластере Secondary

      Команда
      Пример
      kubectl -n <namespace> delete ReplicationDestination <rd-name>
    6. Увеличьте количество pod'ов приложения

      Увеличьте количество всех pod'ов приложения на кластере Secondary.

    Failback (post-disaster recovery)

    Сценарий использования:

    Кластер Primary теперь восстановлен и работает, поэтому требуется возврат сервисов на него.

    Процедуры

    1. Снизьте количество pod'ов приложения на кластере Primary

      Когда кластер primary снова станет доступен, pod'ы приложения восстановятся автоматически. Однако сначала необходимо снизить количество экземпляров сервиса, чтобы остановить трафик. После синхронизации последних данных с кластера secondary на кластер primary приложение можно будет снова масштабировать вверх и возобновить нормальную работу.

    2. Удалите ReplicationSource на кластере Primary

      Сначала нужно удалить ReplicationSource, созданный до отказа кластера Primary.

      Команда
      Пример
      kubectl -n <namespace> delete ReplicationSource <rs-name>
    3. Синхронизация последних данных с кластера Secondary

      Настройте Secondary-to-Primary One-Time Synchronization.

      Создайте ReplicationDestination на кластере Primary, а затем создайте однократный ReplicationSource на кластере Secondary

      См. Настройка однократной синхронизации

    4. Удалите ReplicationDestination и ReplicationSource

      После синхронизации данных удалите однократные ресурсы

      Удалите ReplicationSource на кластере Secondary

      Команда
      Пример
      kubectl -n <namespace> delete ReplicationSource <rs-name>

      Удалите ReplicationDestination на кластере Primary

      Команда
      Пример
      kubectl -n <namespace> delete ReplicationDestination <rd-name>
    5. Миграция приложения

      Снизьте количество pod'ов приложения на кластере Secondary

      Увеличьте количество pod'ов приложения на кластере Primary

    6. Настройте синхронизацию Primary-to-Secondary

      См. Настройка запланированной синхронизации