OpenSearch

OpenSearchのバックアップとリストア

Verrazzanoは、プラットフォームで実行されている様々なマイクロサービスからのすべてのログ・メッセージにアクセスできるようにする、すぐに使用できるOpenSearchデプロイメントを提供します。OpenSearchデータをバックアップし、リストアするシナリオがあります。

Verrazzanoは、Veleroを使用してOpenSearchデータのバックアップとリストアを容易にします。

ノート: アップグレード時には、アップグレード先のバージョンではなく、既存のVerrazzanoバージョンのバックアップ・ドキュメントに従ってください。

Veleroオペレータの前提条件

OpenSearchのバックアップまたはリストア操作に進む前に、次の詳細が役立ちます:

  • オブジェクト・ストアのバケット名。
    • Amazon S3互換のオブジェクト・ストレージ・バケット。これには、Oracle Cloudテナンシの任意のコンパートメント内のOracle Cloud Object Storageバケットを使用できます。
      • 参照できるように、バケット名とテナンシ名を書き留めておきます。
      • オブジェクト・ストレージを使用したバケットの作成の詳細は、「バケットの管理」を参照してください。
    • プライベート・クラウド、エンタープライズ・ネットワークまたはエアギャップ環境では、MinIOまたは同等のオブジェクト・ストア・ソリューションを使用できます。
  • オブジェクト・ストアの接頭辞名。これは、バックアップ・コンポーネントによって作成されるバケット内の子フォルダになります。
  • オブジェクト・ストアのリージョン名。
  • オブジェクト・ストアの署名キー。
    • Amazon S3互換オブジェクト・ストアの認証に必要な署名キー。これはアクセス・キー/秘密キーのペアです。
    • Oracle Cloud Infrastructureでは、ユーザーまたは管理者が顧客秘密キーを作成します。
      • 関連するアクセス・キーが秘密キーに対して生成されます。
      • 顧客秘密キーを作成するには、顧客秘密キーに関する項を参照してください。

OpenSearchをバックアップまたはリストアするには、まずVeleroを有効にする必要があります。

  1. 次の構成は、prodインストール・プロファイルを使用してveleroを有効にする方法を示しています。
      $ kubectl apply -f -<<EOF
        apiVersion: install.verrazzano.io/v1beta1
        kind: Verrazzano
        metadata:
          name: example-verrazzano
        spec:
          profile: prod
          components:    
            velero:
              enabled: true
    EOF
    

ノート: OpenSearchのバックアップおよびリストア操作は、マルチノードOpenSearch構成を持つprodインストール・プロファイルでのみサポートされます。

  1. Veleroが有効になったら、Veleroポッドがverrazzano-backupネームスペースで実行されていることを確認します。

    # Sample of pods running after enabling the velero component
    $ kubectl get pod -n verrazzano-backup
    NAME                      READY   STATUS    RESTARTS   AGE
    restic-ndxfk              1/1     Running   0          21h
    velero-5ff8766fd4-xbn4z   1/1     Running   0          21h
    

  2. Veleroでは、S3互換オブジェクト・ストアと通信するためにシークレットが必要であるため、オブジェクト・ストア資格証明を保持するbackup-secret.txtファイルを作成します。

    [default]
    aws_access_key_id=<object store access key>
    aws_secret_access_key=<object store secret key>
    

  3. ネームスペースverrazzano-backupに、verrazzano-backup-credsなどのKubernetesシークレットを作成します。

    $ kubectl create secret generic -n <backup-namespace> <secret-name> --from-file=<key>=<full_path_to_creds_file>
    

    次に、例を示します。

    $ kubectl create secret generic -n verrazzano-backup verrazzano-backup-creds --from-file=cloud=backup-secret.txt
    

    ノート: 機密データの誤用を避けるため、Kubernetesシークレットを作成した後でbackup-secret.txtファイルが削除されていることを確認してください。

  4. バックアップ・コンポーネントが後続のバックアップで参照するBackupStorageLocationリソースを作成します。次のBackupStorageLocationの例を参照してください。詳細は、Veleroのドキュメントの「Backup Storage Location」を参照してください。

     $ kubectl apply -f -<<EOF
     apiVersion: velero.io/v1
     kind: BackupStorageLocation
     metadata:
       name: verrazzano-backup-location
       namespace: verrazzano-backup
     spec:
       provider: aws
       objectStorage:
         bucket: example-verrazzano
         prefix: backup-demo
       credential:
         name: verrazzano-backup-creds
         key: cloud
       config:
         region: us-phoenix-1
         s3ForcePathStyle: "true"
         s3Url: https://mytenancy.compat.objectstorage.us-phoenix-1.oraclecloud.com
    EOF
    

Veleroを使用したOpenSearchバックアップ

OpenSearchの場合は、Verrazzanoによってカスタム・フックが用意されており、バックアップの起動中にそれをVeleroで使用できます。OpenSearchによって処理される一時データの性質のため、フックがOpenSearchスナップショットAPIを起動して、データ・ストリームを適切にバックアップします。これによって、データの損失がなくなり、データ破損も回避されます。

次の例は、OpenSearchバックアップを開始するために作成できるサンプルのVelero Backup APIリソースを示しています。

  $ kubectl apply -f - <<EOF
  apiVersion: velero.io/v1
  kind: Backup
  metadata:
    name: verrazzano-opensearch-backup
    namespace: verrazzano-backup
  spec:
    includedNamespaces:
      - verrazzano-logging
    labelSelector:
      matchLabels:
        opster.io/opensearch-cluster: opensearch
    defaultVolumesToRestic: false
    storageLocation:  verrazzano-backup-location
    hooks:
      resources:
        - name: opensearch-backup-test
          includedNamespaces:
            - verrazzano-logging
          labelSelector:
            matchLabels:
              statefulset.kubernetes.io/pod-name: opensearch-es-master-0
          post:                           
            - exec:
                container: opensearch
                command:
                  - /usr/share/opensearch/bin/verrazzano-backup-hook
                  - -operation
                  - backup
                  - -velero-backup-name
                  - verrazzano-opensearch-backup
                onError: Fail
                timeout: 10m
EOF

前述の例では、OpenSearchコンポーネントがバックアップされます:

  • このケースでは、PersistentVolumesを直接バックアップしていません。かわりにOpenSearch APIを呼び出すフックを実行して、データのスナップショットを取得します。
  • Veleroが関連するPVCを無視するように、defaultVolumesToResticfalseに設定されます。
  • このケースで、フックはpreまたは postにする必要があります。
  • フックで使用されるコマンドには、operationフラグと、入力としてVeleroバックアップ名が必要です。
  • フックを実行する必要があるコンテナは、デフォルトでポッド内の最初のコンテナに設定されます。このケースでは、statefulset.kubernetes.io/pod-name: opensearch-es-master-0です。

バックアップが処理された後で、velero backup logsコマンドを使用してフック・ログを確認できます。また、フック・ログはポッドの/tmpフォルダに格納されます。

OpenSearchバックアップ・ログ
# To display the logs from the backup, run the following command
$ kubectl logs -n verrazzano-backup -l app.kubernetes.io/name=velero

# Fetch the log file name as shown
$ kubectl exec -it opensearch-es-master-0 -n verrazzano-logging -- ls -al /tmp | grep verrazzano-backup-hook | tail -n 1 | awk '{print $NF}'

# To examine the hook logs, exec into the pod as shown, and use the file name retrieved previously
$ kubectl exec -it opensearch-es-master-0 -n verrazzano-logging -- cat /tmp/<log-file-name>

OpenSearchスケジュール済バックアップ

VeleroではSchedule APIがサポートされます。これは、指定のcron表記のバックアップを実行するためにVeleroサーバーに送信される繰り返し可能なリクエストです。Scheduleオブジェクトが作成されると、Veleroサーバーがバックアップ・プロセスを開始します。その後、指定のcron式の次の有効なポイントまで待機し、バックアップ・プロセスを繰返し実行します。


Veleroを使用したOpenSearchリストア

OpenSearchの場合は、Verrazzanoによってカスタム・フックが用意されており、それをVeleroで使用してリストア操作を実行できます。OpenSearchによって処理される一時データの性質のため、フックがOpenSearchスナップショットAPIを起動して、データ・ストリームを適切にリストアします。これによって、データの損失がなくなり、データ破損も回避されます。

OpenSearchを別のクラスタにリストアする場合は、元のクラスタで構成された同じバックアップ記憶域の場所を指すVelero BackupStorageLocationリソースを新しいクラスタに作成します。これにより、元のクラスタのバックアップによって作成されたVeleroリソースが新しいクラスタに自動的に同期されます。同期が完了すると、新しいクラスタ上の元のクラスタからバックアップにアクセスできます。BackupStorageLocation仕様でaccessModeReadOnlyに設定して、新しいクラスタのBackupStorageLocationを読取り専用として構成することをお薦めします。これにより、オブジェクト・ストア内のバックアップが新しいクラスタから変更されなくなります。詳細は、Veleroのドキュメントの「Backup Storage Location」を参照してください。

OpenSearchリストア操作を開始するには、最初に、システムで実行されている既存のOpenSearchクラスタおよびすべての関連データを削除します。

  1. Verrazzanoモニタリング・オペレータをスケール・ダウンします。これが必要な理由は、オペレータがOpenSearchクラスタのライフ・サイクルを管理するため、ゼロにスケール・ダウンするとリストア操作を妨げないからです。また、リストア操作によって、この演算子がスケール・アップされ、システムが以前の状態に戻ります。

     $ kubectl scale deploy -n verrazzano-logging opensearch-operator-controller-manager --replicas=0
    

  2. OpenSearchコンポーネントを削除します。

    # These are sample commands to demonstrate the OpenSearch restore process
    $ kubectl delete sts -n verrazzano-logging -l opster.io/opensearch-cluster=opensearch
    $ kubectl delete deploy -n verrazzano-logging -l opster.io/opensearch-cluster=opensearch
    $ kubectl delete pvc -n verrazzano-logging -l opster.io/opensearch-cluster=opensearch
    

  3. OpenSearchリストア操作を実行するために、次のVelero Restore APIオブジェクトの例を呼び出すことができます。

      $ kubectl apply -f - <<EOF
      apiVersion: velero.io/v1
      kind: Restore
      metadata:
        name: verrazzano-opensearch-restore
        namespace: verrazzano-backup
      spec:
        backupName: verrazzano-opensearch-backup
        includedNamespaces:
          - verrazzano-logging
        labelSelector:
          matchLabels:
            opster.io/opensearch-cluster: opensearch
        restorePVs: false
        hooks:
          resources:
          - name: opensearch-test
            includedNamespaces:
            - verrazzano-logging
            labelSelector:
              matchLabels:            
                statefulset.kubernetes.io/pod-name: opensearch-es-master-0
            postHooks:
            - init:
              timeout: 30m
              initContainers:
                - args:
                    - /usr/share/opensearch/bin/verrazzano-backup-hook --operation=pre-restore --velero-backup-name=verrazzano-opensearch-backup
                  command:
                    - sh
                    - -c
                  image: ghcr.io/verrazzano/opensearch:2.3.0-20230928071551-b6247ad8ac8
                  imagePullPolicy: Always
                  name: pre-hook
            - exec:
                container: opensearch
                command:
                - /usr/share/opensearch/bin/verrazzano-backup-hook
                - -operation
                - restore
                - -velero-backup-name
                - verrazzano-opensearch-backup
                waitTimeout: 30m
                execTimeout: 30m
                onError: Fail
    EOF
    

    前述の例では、既存のバックアップからOpenSearchクラスタをリストアします。

    • このケースでは、PersistentVolumesを直接リストアしていません。かわりにOpenSearch APIを呼び出すフックを実行して、データの既存のスナップショットからリストアします。
    • VeleroがPVCのリストアを無視するように、restorePVsfalseに設定されます。
    • フックで使用されるコマンドには、-operationフラグと、入力としてVeleroバックアップ名が必要です。
    • pre-hookは、OpenSearch APIを呼び出す前に、OpenSearchクラスタのブートストラップに必要なステップを実行します。
    • postHookは、スナップショット・データをリストアするOpenSearch APIを呼び出します。
    • フックを実行する必要があるコンテナは、デフォルトでポッド内の最初のコンテナに設定されます。このケースでは、statefulset.kubernetes.io/pod-name: opensearch-es-master-0です。

    ノート: フックは、Kubernetesオブジェクトのリストア後に適用する必要があるため、postHookである必要があります。

  4. すべてのOpenSearchポッドがRUNNING状態になるまで待ちます。

      $ kubectl wait -n verrazzano-logging --for=condition=ready pod -l opster.io/opensearch-cluster=opensearch --timeout=600s
        pod/opensearch-es-data-0 condition met
        pod/opensearch-es-data-1 condition met
        pod/opensearch-es-data-2 condition met
        pod/opensearch-es-ingest-0 condition met
        pod/opensearch-es-ingest-1 condition met
        pod/opensearch-es-master-0 condition met
        pod/opensearch-es-master-1 condition met
        pod/opensearch-es-master-2 condition met
    

リストア操作が処理された後で、velero restore logsコマンドを使用してフック・ログを確認できます。また、フック・ログはポッドの/tmpフォルダに格納されます。

OpenSearchリストア・ログ
# To display the logs from the restore, run the following command
$ kubectl logs -n verrazzano-backup -l app.kubernetes.io/name=velero

# Fetch the log file name as shown
$ kubectl exec -it opensearch-es-master-0 -n verrazzano-logging -- ls -al /tmp | grep verrazzano-restore-hook | tail -n 1 | awk '{print $NF}'

# To examine the hook logs, exec into the pod as shown, and use the file name retrieved previously
$ kubectl exec -it opensearch-es-master-0 -n verrazzano-logging -- cat /tmp/<log-file-name>

OpenSearch APIを使用した既存のクラスタでのOpenSearchリストア

通常、Veleroを使用したOpenSearchリストアは、クラスタ全体のリストアが必要な障害時リカバリのシナリオに使用されます。ただし、既存のクラスタ内にあるOpenSearchデータをリストアする場合は、OpenSearch APIを使用できます。

これまでにVeleroを使用して、リポジトリの登録が完了しているのと同じクラスタ内にバックアップを作成したことがあると仮定し、その特定のバックアップからOpenSearchデータのみをリストアする場合は、次のコマンドを実行します。

登録済リポジトリを取得するには:

# To see all snapshot repositories
$ GET _snapshot/_all

登録済リポジトリ内のすべてのスナップショットを取得するには:

# To see all snapshots in a repository
$ GET _snapshot/<backup_repository_name>/_all

特定のスナップショットをリストアするには:

# To restore the existing snapshot, run the following command
$ POST _snapshot/<backup_repository_name>/<snapshot-name>/_restore

  • <backup_repository_name>: OpenSearchスナップショットが格納されているバックアップ・リポジトリの名前。<backup_repository_name>をバックアップ・リポジトリの名前に置き換えます。

  • <snapshot-name>: リストアするOpenSearchスナップショットの名前。<snapshot-name>をスナップショットの名前に置き換えます。

詳細は、OpenSearchのドキュメントの「OpenSearch Restore」を参照してください。