第18章 スタンドアロンデプロイメントでの Red Hat Quay のバックアップと復元
このセクションの内容を使用して、スタンドアロンデプロイメントの Red Hat Quay をバックアップおよび復元します。
18.1. オプション: Red Hat Quay の読み取り専用モードの有効化
Red Hat Quay デプロイメントで読み取り専用モードを有効にすると、レジストリーの操作を管理できるようになります。Red Hat Quay 管理者は、読み取り専用モードを有効にしてレジストリーへの書き込みアクセスを制限できます。これは、データの整合性の確保、メンテナンス期間中のリスクの軽減、レジストリーデータへの意図しない変更に対する保護に役立ちます。また、Red Hat Quay レジストリーがオンライン状態を維持し、ユーザーにイメージを提供できるようにするのにも役立ちます。
場合によっては、サービスキーの挿入やその他の手動での設定変更が必要になるため、Red Hat Quay の読み取り専用オプションは使用できないことがあります。読み取り専用モードの代わりに、Red Hat Quay 管理者には DISABLE_PUSHES
機能の有効化を検討することを推奨します。このフィールドを true
に設定すると、ユーザーは CLI を使用するときにイメージまたはイメージタグをレジストリーにプッシュできなくなります。DISABLE_PUSHES
を有効にすることは、データベースが read-only
として設定されないため、read-only
モードとは異なります。
このフィールドは、Red Hat Quay 管理者がレジストリーのクォータを計算し、計算が完了するまでイメージのプッシュを無効にしたい場合など、一部の状況で役立つ場合があります。この方法を使用すると、管理者はレジストリー全体を read-only
モードにしてデータベースに影響を与えることを回避できるため、ほとんどの操作を引き続き実行できます。
この設定フィールドを有効にする方法の詳細は、その他の設定フィールド を参照してください。
前提条件
Red Hat Enterprise Linux (RHEL) 7.x を使用している場合:
- Red Hat Software Collections List (RHSCL) を有効にした。
- Python 3.6 をインストールした。
-
virtualenv
パッケージをダウンロードした。 -
git
CLI をインストールした。
Red Hat Enterprise Linux (RHEL) 8 を使用している場合:
- マシンに Python 3 をインストールした。
-
python3-virtualenv
パッケージをダウンロードした。 -
git
CLI をインストールした。
-
https://github.com/quay/quay.git
リポジトリーのクローンを作成した。
18.1.1. スタンドアロン Red Hat Quay のサービスキーの作成
Red Hat Quay はサービスキーを使用してさまざまなコンポーネントと通信します。サービスキーは、イメージのスキャン、ログイン、ストレージアクセスなどの要求など、完了した要求に署名するために使用されます。
手順
Red Hat Quay レジストリーがすぐに利用できる場合は、
Quay
レジストリーコンテナー内でサービスキーを生成できます。Quay
コンテナー内にキーペアを生成するには、次のコマンドを入力します。$ podman exec quay python3 tools/generatekeypair.py quay-readonly
Red Hat Quay がすぐに利用できない場合は、仮想環境内でサービスキーを生成する必要があります。
Red Hat Quay デプロイメントのディレクトリーに移動し、そのディレクトリー内に仮想環境を作成します。
$ cd <$QUAY>/quay && virtualenv -v venv
次のコマンドを入力して仮想環境をアクティブ化します。
$ source venv/bin/activate
オプション:
pip
CLI ツールがインストールされていない場合はインストールします。$ venv/bin/pip install --upgrade pip
Red Hat Quay ディレクトリーに、次の内容を含む
requirements-generatekeys.txt
ファイルを作成します。$ cat << EOF > requirements-generatekeys.txt cryptography==3.4.7 pycparser==2.19 pycryptodome==3.9.4 pycryptodomex==3.9.4 pyjwkest==1.4.2 PyJWT==1.7.1 Authlib==1.0.0a2 EOF
次のコマンドを入力して、
requirements-generatekeys.txt
ファイルで定義した Python 依存関係をインストールします。$ venv/bin/pip install -r requirements-generatekeys.txt
次のコマンドを入力して、必要なサービスキーを作成します。
$ PYTHONPATH=. venv/bin/python /<path_to_cloned_repo>/tools/generatekeypair.py quay-readonly
出力例
Writing public key to quay-readonly.jwk Writing key ID to quay-readonly.kid Writing private key to quay-readonly.pem
次のコマンドを入力して、仮想環境を非アクティブ化します。
$ deactivate
18.1.2. PostgreSQL データベースへのキーの追加
PostgreSQL データベースにサービスキーを追加するには、次の手順に従います。
前提条件
- サービスキーを作成した。
手順
次のコマンドを入力して、Red Hat Quay データベース環境に入ります。
$ podman exec -it postgresql-quay psql -U postgres -d quay
次のコマンドを入力して、
servicekeyapproval
の承認タイプと関連する注記を表示します。quay=# select * from servicekeyapproval;
出力例
id | approver_id | approval_type | approved_date | notes ----+-------------+----------------------------------+----------------------------+------- 1 | | ServiceKeyApprovalType.AUTOMATIC | 2024-05-07 03:47:48.181347 | 2 | | ServiceKeyApprovalType.AUTOMATIC | 2024-05-07 03:47:55.808087 | 3 | | ServiceKeyApprovalType.AUTOMATIC | 2024-05-07 03:49:04.27095 | 4 | | ServiceKeyApprovalType.AUTOMATIC | 2024-05-07 03:49:05.46235 | 5 | 1 | ServiceKeyApprovalType.SUPERUSER | 2024-05-07 04:05:10.296796 | ...
次のクエリーを入力して、Red Hat Quay データベースにサービスキーを追加します。
quay=# INSERT INTO servicekey (name, service, metadata, kid, jwk, created_date, expiration_date) VALUES ('quay-readonly', 'quay', '{}', '{<contents_of_.kid_file>}', '{<contents_of_.jwk_file>}', '{<created_date_of_read-only>}', '{<expiration_date_of_read-only>}');
出力例
INSERT 0 1
次のクエリーを使用してキー承認を追加します。
quay=# INSERT INTO servicekeyapproval ('approval_type', 'approved_date', 'notes') VALUES ("ServiceKeyApprovalType.SUPERUSER", "CURRENT_DATE", {include_notes_here_on_why_this_is_being_added});
出力例
INSERT 0 1
作成されたサービスキー行の
authorization_id
フィールドを、作成されたサービスキー承認のid
フィールドに設定します。必要な ID を取得するには、次のSELECT
ステートメントを使用できます。UPDATE servicekey SET approval_id = (SELECT id FROM servicekeyapproval WHERE approval_type = 'ServiceKeyApprovalType.SUPERUSER') WHERE name = 'quay-readonly';
UPDATE 1
18.1.3. スタンドアロン Red Hat Quay の読み取り専用モードの設定
サービスキーを作成し、PostgreSQL データベースに追加したら、スタンドアロンデプロイメントで Quay
コンテナーを再起動する必要があります。
前提条件
- サービスキーを作成し、PostgreSQL データベースに追加した。
手順
すべての仮想マシン上のすべての Red Hat Quay インスタンスをシャットダウンします。以下に例を示します。
$ podman stop <quay_container_name_on_virtual_machine_a>
$ podman stop <quay_container_name_on_virtual_machine_b>
次のコマンドを入力して、
quay-readonly.kid
ファイルとquay-readonly.pem
ファイルの内容を、Red Hat Quay 設定バンドルが格納されているディレクトリーにコピーします。$ cp quay-readonly.kid quay-readonly.pem $Quay/config
次のコマンドを入力して、設定バンドルフォルダー内のすべてのファイルに対するファイル権限を設定します。
$ setfacl -m user:1001:rw $Quay/config/*
Red Hat Quay
config.yaml
ファイルを変更し、次の情報を追加します。# ... REGISTRY_STATE: readonly INSTANCE_SERVICE_KEY_KID_LOCATION: 'conf/stack/quay-readonly.kid' INSTANCE_SERVICE_KEY_LOCATION: 'conf/stack/quay-readonly.pem' # ...
- 新しい設定バンドルをすべての Red Hat Quay インスタンスに配布します。
次のコマンドを入力して Red Hat Quay を起動します。
$ podman run -d --rm -p 80:8080 -p 443:8443 \ --name=quay-main-app \ -v $QUAY/config:/conf/stack:Z \ -v $QUAY/storage:/datastorage:Z \ {productrepo}/{quayimage}:{productminv}
Red Hat Quay を起動すると、インスタンス内のバナーによって、Red Hat Quay が読み取り専用モードで実行されていることがユーザーに通知されます。プッシュが拒否され、405 エラーがログに記録されるはずです。次のコマンドを実行してこれをテストできます。
$ podman push <quay-server.example.com>/quayadmin/busybox:test
出力例
613be09ab3c0: Preparing denied: System is currently read-only. Pulls will succeed but all write operations are currently suspended.
Red Hat Quay デプロイメントを読み取り専用モードで実行すると、レジストリーの操作を安全に管理しながら、バックアップや復元などのアクションを実行できます。
オプション: 読み取り専用モードでの作業が完了したら、
config.yaml
ファイルから次の情報を削除して、通常の運用に戻すことができます。削除したら、Red Hat Quay デプロイメントを再起動します。# ... REGISTRY_STATE: readonly INSTANCE_SERVICE_KEY_KID_LOCATION: 'conf/stack/quay-readonly.kid' INSTANCE_SERVICE_KEY_LOCATION: 'conf/stack/quay-readonly.pem' # ...
$ podman restart <container_id>
18.1.4. 読み取り専用の有効期限の更新
Red Hat Quay 読み取り専用キーには有効期限があり、その日付が過ぎるとキーは非アクティブ化されます。キーの有効期限が切れる前に、データベース内でその有効期限を更新できます。キーを更新するには、前述の方法を使用して Red Hat Quay の実稼働データベースに接続し、次のクエリーを発行します。
quay=# UPDATE servicekey SET expiration_date = 'new-date' WHERE id = servicekey_id;
サービスキー ID のリストは、次のクエリーを実行することで取得できます。
SELECT id, name, expiration_date FROM servicekey;