第 18 章 在独立部署中备份和恢复 Red Hat Quay
使用本节中的内容在独立部署中备份和恢复 Red Hat Quay。
18.1. 可选:为 Red Hat Quay 启用只读模式
为 Red Hat Quay 部署启用只读模式允许您管理 registry 操作。Red Hat Quay 管理员可以启用只读模式来限制对 registry 的写访问,这有助于确保数据完整性,降低维护窗口期间的风险,并对 registry 数据提供不必要的修改。它还有助于确保您的 Red Hat Quay registry 保持在线状态,并可供用户使用。
在某些情况下,无法进行 Red Hat Quay 的只读选项,因为它需要插入服务密钥和其他手动配置更改。作为只读模式的替代选择,Red Hat Quay 管理员可能会考虑启用 DISABLE_PUSHES
功能。当此字段设置为 true
时,用户无法在使用 CLI 时将镜像或镜像标签推送到 registry。启用 DISABLE_PUSHES
与 只读模式
不同,因为数据库在启用时没有 设置为只读
。
在某些情况下,此字段可能很有用,如 Red Hat Quay 管理员想要计算其 registry 配额和禁用镜像推送,直到计算完成后为止。使用这个方法,管理员可以避免将整个 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
软件仓库。
18.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
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
将所创建的服务键行中的
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
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,您可以安全地管理 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>
18.1.4. 更新只读过期时间
Red Hat Quay 只读密钥具有过期日期,当该日期通过密钥时,会停用该密钥。在密钥过期前,可以在数据库中更新其过期时间。要更新密钥,请使用前面描述的方法连接 Red Hat Quay production 数据库,并发出以下查询:
quay=# UPDATE servicekey SET expiration_date = 'new-date' WHERE id = servicekey_id;
可以通过运行以下查询来获取服务密钥 ID 列表:
SELECT id, name, expiration_date FROM servicekey;