15.2. Geo レプリケーションの要件と制約

  • geo レプリケーション設定では、Red Hat Quay で、すべてのリージョンが他の全リージョンのオブジェクトストレージに対して読み取りと書き込みができるようにする必要があります。オブジェクトストレージは、他のすべてのリージョンから地理的にアクセスできる必要があります。
  • 1 つの geo レプリケーションサイトでオブジェクトストレージシステムに障害が発生した場合に、そのサイトの Red Hat Quay デプロイメントをシャットダウンして、クライアントがグローバルロードバランサーにより、ストレージシステムで問題のない残りのサイトにリダイレクトされるようにする必要があります。そうしないと、クライアントでプルとプッシュの失敗が発生します。
  • Red Hat Quay は、接続されたオブジェクトストレージシステムの健全性や可用性を内部的に認識しません。分散システムの健全性を監視し、ストレージのステータスに基づいてトラフィックを別のサイトにルーティングするには、ユーザーがグローバルロードバランサー (LB) を設定する必要があります。
  • Geo レプリケーションデプロイメントのステータスを確認するには、/health/endtoend チェックポイントを使用する必要があります。このチェックポイントは全体的な健全性の監視に使用されます。/health/endtoend エンドポイントを使用してリダイレクトを手動で設定する必要があります。/health/instance エンドポイントは、ローカルインスタンスの健全性のみをチェックします。
  • 1 つのサイトのオブジェクトストレージシステムが利用できなくなった場合に、残りのサイトの残りのストレージシステム (複数可) に自動的にリダイレクトされません。
  • Geo レプリケーションは非同期です。サイトが完全に失われると、そのサイトのオブジェクトストレージシステムに保存されていても、障害発生時に残りのサイトに複製されていないデータが失われます。
  • 単一のデータベース、つまりすべてのメタデータと Red Hat Quay 設定がすべてのリージョンで共有されます。

    Geo レプリケーションはデータベースをレプリケートしません。障害が発生すると、Geo レプリケーションが有効になっている Red Hat Quay は別のデータベースにフェイルオーバーしません。

  • 1 つの Redis キャッシュは Red Hat Quay のセットアップ全体で共有され、すべての Red Hat Quay Pod からアクセスできる必要があります。
  • ストレージバックエンド以外のすべてのリージョンで同じ設定を使用する必要があります。これは、QUAY_DISTRIBUTED_STORAGE_PREFERENCE 環境変数を使用して明示的に設定できます。
  • Geo レプリケーションでは、各リージョンにオブジェクトストレージが必要です。ローカルストレージでは機能しません。
  • 各リージョンは、ネットワークパスを必要とする各リージョン内のすべてのストレージエンジンにアクセスできる必要があります。
  • また、ストレージプロキシーオプションを使用することもできます。
  • ストレージバックエンド全体 (たとえば、すべての BLOB) がレプリケートされます。対照的に、リポジトリーミラーリングはリポジトリーまたはイメージに限定できます。
  • すべての Red Hat Quay インスタンスは、通常はロードバランサーを介して同じエントリーポイントを共有する必要があります。
  • すべての Red Hat Quay インスタンスは、共通の設定ファイル内で定義されているため、スーパーユーザーの同じセットが含まれる必要があります。
  • Geo レプリケーションでは、Clair 設定を unmanaged に設定する必要があります。アンマネージド Clair データベースにより、Red Hat Quay は geo-replicated environment で作業できます。この環境では、Red Hat Quay Operator の複数のインスタンスが同じデータベースと通信する必要があります。詳細は、Clair の詳細設定 を参照してください。
  • Geo レプリケーションには SSL/TLS 証明書とキーが必要です。詳細は、Red Hat Quay への接続を保護するための SSL/TSL の使用 を参照してください。

上記の要件を満たすことができない場合は、代わりに 2 つ以上の異なる Red Hat Quay のデプロイメントを使用し、リポジトリーミラーリング機能を利用する必要があります。

15.2.1. ストレージレプリケーションを有効にする - スタンドアロン Quay

以下の手順を使用して、Red Hat Quay でストレージのレプリケーションを有効にします。

手順

  1. Red Hat Quay 設定エディターで、Registry Storage セクションを見つけます。
  2. Enable Storage Replication をクリックします。
  3. データを複製するストレージエンジンをそれぞれ追加します。使用するすべてのストレージエンジンをリストに載せる必要があります。
  4. すべてのイメージをすべてのストレージエンジンに完全に複製する必要がある場合は、各ストレージエンジン設定の下にある Replicate to storage engine by default をクリックします。これにより、すべてのイメージがそのストレージエンジンにレプリケートされます。

    注記

    名前空間ごとのレプリケーションを有効にするには、Red Hat Quay サポートにお問い合わせください。

  5. 完了したら、Save Configuration Changes をクリックします。設定の変更は、Red Hat Quay の再起動後に有効になります。
  6. ストレージを追加して Geo レプリケーションの Replicate to storage engine by default を有効にした後、すべてのストレージで既存のイメージデータを同期する必要があります。これを行うには、コンテナーに対して oc exec (または docker exec または kubectl exec) を実行し、次のコマンドを入力する必要があります。

    # scl enable python27 bash
    # python -m util.backfillreplication
    注記

    この操作は、新しいストレージを追加した後にコンテンツを同期するための 1 回限りの操作です。

15.2.2. ストレージの環境設定による Red Hat Quay の実行

  1. config.yaml を Red Hat Quay を実行しているすべてのマシンにコピーします。
  2. 各リージョンの各マシンは、マシンが稼働しているリージョンの優先ストレージエンジンを持つ QUAY_DISTRIBUTED_STORAGE_PREFERENCE 環境変数を追加します。

    たとえば、ヨーロッパで稼働しているマシンで、ホスト上の config ディレクトリーが $QUAY/config から利用できる場合です。

    $ sudo podman run -d --rm -p 80:8080 -p 443:8443  \
       --name=quay \
       -v $QUAY/config:/conf/stack:Z \
       -e QUAY_DISTRIBUTED_STORAGE_PREFERENCE=europestorage \
       registry.redhat.io/quay/quay-rhel8:v3.10.3
    注記

    指定された環境変数の値は、コンフィグパネルで定義されたロケーション ID の名前と一致する必要があります。

  3. すべての Red Hat Quay コンテナーを再起動します。

15.2.3. スタンドアロン Red Hat Quay デプロイメントから geo レプリケートされたサイトを削除する

以下の手順を使用すると、Red Hat Quay 管理者は geo レプリケートされたセットアップ内のサイトを削除できます。

前提条件

  • 少なくとも 2 つのサイト (例: usstorageeustorage) を使用して Red Hat Quay geo レプリケーションを設定している。
  • 各サイトに、独自の組織、リポジトリー、およびイメージタグがある。

手順

  1. 次のコマンドを実行して、定義されたすべてのサイト間で BLOB を同期します。

    $ python -m util.backfillreplication
    警告

    Red Hat Quay config.yaml ファイルからストレージエンジンを削除する前に、定義されているすべてのサイト間ですべての BLOB が同期されていることを確認する 必要があります。続行する前に、この手順を完了してください。

  2. サイト usstorage の Red Hat Quay config.yaml ファイルで、eustorage サイトの DISTRIBUTED_STORAGE_CONFIG エントリーを削除します。
  3. 次のコマンドを入力して、実行中のコンテナーのリストを取得します。

    $ podman ps

    出力例

    CONTAINER ID  IMAGE                                                                     COMMAND         CREATED         STATUS             PORTS                                        NAMES
    92c5321cde38  registry.redhat.io/rhel8/redis-5:1                                        run-redis       11 days ago     Up 11 days ago     0.0.0.0:6379->6379/tcp                       redis
    4e6d1ecd3811  registry.redhat.io/rhel8/postgresql-13:1-109                              run-postgresql  33 seconds ago  Up 34 seconds ago  0.0.0.0:5432->5432/tcp                       postgresql-quay
    d2eadac74fda  registry-proxy.engineering.redhat.com/rh-osbs/quay-quay-rhel8:v3.9.0-131  registry        4 seconds ago   Up 4 seconds ago   0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp  quay

  4. 次のコマンドを入力して、PostgreSQL コンテナー内でシェルを実行します。

    $ podman exec -it postgresql-quay -- /bin/bash
  5. 次のコマンドを実行して psql を入力します。

    bash-4.4$ psql
  6. 次のコマンドを入力して、geo レプリケートされたデプロイメント内のサイトのリストを表示します。

    quay=# select * from imagestoragelocation;

    出力例

     id |       name
    ----+-------------------
      1 | usstorage
      2 | eustorage

  7. 次のコマンドを入力して postgres CLI を終了し、bash-4.4 に再度入ります。

    \q
  8. 次のコマンドを入力して、eustorage サイトを完全に削除します。

    重要

    次の操作は元に戻すことができません。注意して使用してください。

    bash-4.4$ python -m util.removelocation eustorage

    出力例

    WARNING: This is a destructive operation. Are you sure you want to remove eustorage from your storage locations? [y/n] y
    Deleted placement 30
    Deleted placement 31
    Deleted placement 32
    Deleted placement 33
    Deleted location eustorage

15.2.4. OpenShift Container Platform での Geo レプリケーションのセットアップ

OpenShift Container Platform で Geo レプリケーションを設定するには、次の手順を実行します。

手順

  1. Red Hat Quay の postgres インスタンスをデプロイします。
  2. 次のコマンドを入力してデータベースにログインします。

    psql -U <username> -h <hostname> -p <port> -d <database_name>
  3. quay という名前で Red Hat Quay のデータベースを作成します。以下に例を示します。

    CREATE DATABASE quay;
  4. データベース内で pg_trm 拡張機能を有効にします。

    \c quay;
    CREATE EXTENSION IF NOT EXISTS pg_trgm;
  5. Redis インスタンスをデプロイします。

    注記
    • クラウドプロバイダーに独自のサービスが含まれている場合は、Redis インスタンスをデプロイする必要がない可能性があります。
    • Builder を利用している場合は、Redis インスタンスをデプロイする必要があります。
    1. Redis 用の VM をデプロイします。
    2. Red Hat Quay が実行されているクラスターからアクセスできることを確認します。
    3. ポート 6379/TCP が開いている必要があります。
    4. インスタンス内で Redis を実行します。

      sudo dnf install -y podman
      podman run -d --name redis -p 6379:6379 redis
  6. クラスターごとに 1 つずつ、2 つのオブジェクトストレージバックエンドを作成します。1 つのオブジェクトストレージバケットが最初のクラスター (プライマリークラスター) の近くにあり、もう 1 つが 2 番目のクラスター (セカンダリークラスター) の近くにあると理想的です。
  7. 環境変数のオーバーライドを使用して、同じ設定バンドルでクラスターをデプロイし、個々のクラスターに適切なストレージバックエンドを選択します。
  8. クラスターへの単一のエントリーポイントを提供するように、ロードバランサーを設定します。

15.2.4.1. OpenShift Container Platform 上の Red Hat Quay での Geo レプリケーションの設定

OpenShift Container Platform 上の Red Hat Quay の Geo レプリケーションを設定するには、次の手順を使用します。

手順

  1. クラスター間で共有される config.yaml ファイルを作成します。この config.yaml ファイルには、一般的な PostgreSQL、Redis、ストレージバックエンドの詳細が含まれています。

    Geo レプリケーションの config.yaml ファイル

    SERVER_HOSTNAME: <georep.quayteam.org or any other name> 1
    DB_CONNECTION_ARGS:
      autorollback: true
      threadlocals: true
    DB_URI: postgresql://postgres:password@10.19.0.1:5432/quay 2
    BUILDLOGS_REDIS:
      host: 10.19.0.2
      port: 6379
    USER_EVENTS_REDIS:
      host: 10.19.0.2
      port: 6379
    DISTRIBUTED_STORAGE_CONFIG:
      usstorage:
        - GoogleCloudStorage
        - access_key: GOOGQGPGVMASAAMQABCDEFG
          bucket_name: georep-test-bucket-0
          secret_key: AYWfEaxX/u84XRA2vUX5C987654321
          storage_path: /quaygcp
      eustorage:
        - GoogleCloudStorage
        - access_key: GOOGQGPGVMASAAMQWERTYUIOP
          bucket_name: georep-test-bucket-1
          secret_key: AYWfEaxX/u84XRA2vUX5Cuj12345678
          storage_path: /quaygcp
    DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS:
      - usstorage
      - eustorage
    DISTRIBUTED_STORAGE_PREFERENCE:
      - usstorage
      - eustorage
    FEATURE_STORAGE_REPLICATION: true

    1
    ルートには適切な SERVER_HOSTNAME を使用する必要があり、グローバルロードバランサーのホスト名と一致する必要があります。
    2
    OpenShift Container Platform Operator を使用してデプロイされた Clair インスタンスの設定ファイルを取得するには、Clair 設定の取得 を参照してください。
  2. 次のコマンドを入力して、configBundleSecret を作成します。

    $ oc create secret generic --from-file config.yaml=./config.yaml georep-config-bundle
  3. 各クラスターで、configBundleSecret を設定し、QUAY_DISTRIBUTED_STORAGE_PREFERENCE 環境変数のオーバーライドを使用して、そのクラスターに適切なストレージを設定します。以下に例を示します。

    注記

    両方のデプロイメント間の config.yaml ファイルは一致する必要があります。一方のクラスターに変更を加える場合は、もう一方のクラスターでも変更する必要があります。

    US クラスター QuayRegistry の例

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      name: example-registry
      namespace: quay-enterprise
    spec:
      configBundleSecret: georep-config-bundle
      components:
        - kind: objectstorage
          managed: false
        - kind: route
          managed: true
        - kind: tls
          managed: false
        - kind: postgres
          managed: false
        - kind: clairpostgres
          managed: false
        - kind: redis
          managed: false
        - kind: quay
          managed: true
          overrides:
            env:
            - name: QUAY_DISTRIBUTED_STORAGE_PREFERENCE
              value: usstorage
        - kind: mirror
          managed: true
          overrides:
            env:
            - name: QUAY_DISTRIBUTED_STORAGE_PREFERENCE
              value: usstorage

    注記

    SSL/TLS が管理対象であり、ルートが管理対象外であるため、証明書を設定バンドルで直接指定する必要があります。詳細は、TLS およびルートの設定 を参照してください。

    ヨーロッパのクラスター

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      name: example-registry
      namespace: quay-enterprise
    spec:
      configBundleSecret: georep-config-bundle
      components:
        - kind: objectstorage
          managed: false
        - kind: route
          managed: true
        - kind: tls
          managed: false
        - kind: postgres
          managed: false
        - kind: clairpostgres
          managed: false
        - kind: redis
          managed: false
        - kind: quay
          managed: true
          overrides:
            env:
            - name: QUAY_DISTRIBUTED_STORAGE_PREFERENCE
              value: eustorage
        - kind: mirror
          managed: true
          overrides:
            env:
            - name: QUAY_DISTRIBUTED_STORAGE_PREFERENCE
              value: eustorage

    注記

    SSL/TLS は管理されておらず、ルートは管理されているため、設定ツールを使用するか、設定バンドルで直接、証明書を提供する必要があります。詳細は、TLS およびルートの設定 を参照してください。

15.2.5. OpenShift Container Platform デプロイメント上の Red Hat Quay から geo レプリケートされたサイトを削除する

以下の手順を使用すると、Red Hat Quay 管理者は geo レプリケートされたセットアップ内のサイトを削除できます。

前提条件

  • OpenShift Container Platform にログインしている。
  • 少なくとも 2 つのサイト (例: usstorageeustorage) を使用して Red Hat Quay geo レプリケーションを設定している。
  • 各サイトに、独自の組織、リポジトリー、およびイメージタグがある。

手順

  1. 次のコマンドを実行して、定義されたすべてのサイト間で BLOB を同期します。

    $ python -m util.backfillreplication
    警告

    Red Hat Quay config.yaml ファイルからストレージエンジンを削除する前に、定義されているすべてのサイト間ですべての BLOB が同期されていることを確認する 必要があります

    このコマンドを実行すると、レプリケーションワーカーによって取得されるレプリケーションジョブが作成されます。レプリケートする必要がある Blob がある場合、スクリプトはレプリケートされる Blob の UUID を返します。このコマンドを複数回実行したときに、スクリプトから返された出力が空であっても、レプリケーションプロセスが完了したことを意味するわけではありません。それはレプリケーションのためにキューに入れる Blob が残っていないことを意味します。レプリケーションにかかる割り当て時間は検出された Blob の数によって異なるため、次のステップに進む前に適切に評価してください。

    または、Microsoft Azure などのサードパーティーのクラウドツールを使用して、同期ステータスを確認することもできます。

    このステップは次に進む前に完了する必要があります。

  2. サイト usstorage の Red Hat Quay config.yaml ファイルで、eustorage サイトの DISTRIBUTED_STORAGE_CONFIG エントリーを削除します。
  3. 次のコマンドを入力して、Quay アプリケーション Pod を識別します。

    $ oc get pod -n <quay_namespace>

    出力例

    quay390usstorage-quay-app-5779ddc886-2drh2
    quay390eustorage-quay-app-66969cd859-n2ssm

  4. 以下のコマンドを入力して、usstorage Pod でインタラクティブシェルセッションを開きます。

    $ oc rsh quay390usstorage-quay-app-5779ddc886-2drh2
  5. 次のコマンドを入力して、eustorage サイトを完全に削除します。

    重要

    次の操作は元に戻すことができません。注意して使用してください。

    sh-4.4$ python -m util.removelocation eustorage

    出力例

    WARNING: This is a destructive operation. Are you sure you want to remove eustorage from your storage locations? [y/n] y
    Deleted placement 30
    Deleted placement 31
    Deleted placement 32
    Deleted placement 33
    Deleted location eustorage