第 17 章 在独立部署中备份和恢复 Red Hat Quay
使用本节中的内容在独立部署中备份和恢复 Red Hat Quay。
17.1. 可选:为 Red Hat Quay 启用只读模式
通过为 Red Hat Quay 部署启用只读模式,您可以管理 registry 的操作。Red Hat Quay 管理员可以启用只读模式来限制对 registry 的写入访问,这有助于确保数据完整性,降低维护窗口期间的风险,并提供对 registry 数据的意外修改。它还可帮助您确保 Red Hat Quay registry 保持在线状态,并可供用户提供镜像。
先决条件
如果您使用 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
软件仓库。
17.1.1. 为独立 Red Hat Quay 创建服务密钥
Red Hat Quay 使用服务密钥与各种组件通信。这些密钥用于签署已完成的请求,如请求扫描镜像、登录、存储访问等。
流程
如果您的 Red Hat Quay registry 可用,您可以在
Quay
registry 容器内生成服务密钥。输入以下命令在
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
17.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
将创建的服务键行中的
approval_
字段设置为创建的服务密钥批准中的 id 字段。您可以使用以下id
SELECT
语句来获取必要的 ID:UPDATE servicekey SET approval_id = (SELECT id FROM servicekeyapproval WHERE approval_type = 'ServiceKeyApprovalType.SUPERUSER') WHERE name = 'quay-readonly';
UPDATE 1
17.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 部署,您可以安全地管理 registry 的操作并执行此类操作,如备份和恢复。
可选。完成只读模式后,您可以通过从
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>
17.1.4. 更新只读过期时间
Red Hat Quay read-only 键具有过期日期,并在该日期通过密钥时停用。在密钥过期前,可以在数据库中更新其过期时间。要更新密钥,请使用前面描述的方法连接 Red Hat Quay production 数据库,并发出以下查询:
quay=# UPDATE servicekey SET expiration_date = 'new-date' WHERE id = servicekey_id;
可以通过运行以下查询来获取服务密钥 ID 列表:
SELECT id, name, expiration_date FROM servicekey;