第 7 章 备份和恢复由 Red Hat Quay Operator 管理的 Red Hat Quay
当由 OpenShift Container Platform 上的 Red Hat Quay Operator 管理时,请使用本节中的内容备份和恢复 Red Hat Quay。
7.1. 可选:在 OpenShift Container Platform 中为 Red Hat Quay 启用只读模式
在 OpenShift Container Platform 部署中为 Red Hat Quay 启用只读模式,您可以管理 registry 的操作。管理员可以启用只读模式来限制对 registry 的写入访问,这有助于确保数据完整性,降低维护窗口期间的风险,并提供对 registry 数据的意外修改的保护。它还有助于确保您的 Red Hat Quay registry 保持在线状态,并可供用户使用。
在备份和恢复时,您需要在 OpenShift Container Platform 部署中缩减 Red Hat Quay。这会导致在备份期间服务不可用,这在某些情况下可能无法接受。启用只读模式可确保在 OpenShift Container Platform 部署中的 Red Hat Quay 的备份和恢复过程中服务可用性。
在某些情况下,无法进行 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
软件仓库。 -
已安装
oc
CLI。 -
您可以使用
cluster-admin
权限访问集群。
7.1.1. 在 OpenShift Container Platform 上为 Red Hat Quay 创建服务密钥
Red Hat Quay 使用服务密钥与各种组件进行通信。这些密钥用于签署已完成的请求,如请求扫描镜像、登录、存储访问等。
步骤
输入以下命令获取 Red Hat Quay pod 列表:
$ oc get pods -n <namespace>
输出示例
example-registry-clair-app-7dc7ff5844-4skw5 0/1 Error 0 70d example-registry-clair-app-7dc7ff5844-nvn4f 1/1 Running 0 31d example-registry-clair-app-7dc7ff5844-x4smw 0/1 ContainerStatusUnknown 6 (70d ago) 70d example-registry-clair-app-7dc7ff5844-xjnvt 1/1 Running 0 60d example-registry-clair-postgres-547d75759-75c49 1/1 Running 0 70d example-registry-quay-app-76c8f55467-52wjz 1/1 Running 0 70d example-registry-quay-app-76c8f55467-hwz4c 1/1 Running 0 70d example-registry-quay-app-upgrade-57ghs 0/1 Completed 1 70d example-registry-quay-database-7c55899f89-hmnm6 1/1 Running 0 70d example-registry-quay-mirror-6cccbd76d-btsnb 1/1 Running 0 70d example-registry-quay-mirror-6cccbd76d-x8g42 1/1 Running 0 70d example-registry-quay-redis-85cbdf96bf-4vk5m 1/1 Running 0 70d
输入以下命令打开到
Quay
容器的远程 shell 会话:$ oc rsh example-registry-quay-app-76c8f55467-52wjz
输入以下命令来创建所需的服务密钥:
sh-4.4$ python3 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
7.1.2. 在 PostgreSQL 数据库中添加密钥
使用以下步骤将服务密钥添加到 PostgreSQL 数据库中。
先决条件
- 您已创建了服务密钥。
步骤
输入以下命令输入 Red Hat Quay 数据库环境:
$ oc rsh example-registry-quay-app-76c8f55467-52wjz psql -U <database_username> -d <database_name>
输入以下命令显示
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
7.1.3. 在 OpenShift Container Platform 中配置只读模式 Red Hat Quay
创建服务密钥并添加到 PostgreSQL 数据库后,您必须在 OpenShift Container Platform 部署中重启 Quay
容器。
以只读模式在 OpenShift Container Platform 上部署 Red Hat Quay 需要修改存储在 OpenShift Container Platform 集群中的 secret。强烈建议您在更改 secret 前创建 secret 的备份。
先决条件
- 您已创建了服务密钥,并将它们添加到 PostgreSQL 数据库中。
步骤
输入以下命令在 OpenShift Container Platform 部署中读取 Red Hat Quay 的 secret 名称:
$ oc get deployment -o yaml <quay_main_app_deployment_name>
使用
base64
命令对quay-readonly.kid
和quay-readonly.pem
文件进行编码:$ base64 -w0 quay-readonly.kid
输出示例
ZjUyNDFm...
$ base64 -w0 quay-readonly.pem
输出示例
LS0tLS1CRUdJTiBSU0E...
输入以下命令来获取当前的配置捆绑包和 secret:
$ oc get secret quay-config-secret-name -o json | jq '.data."config.yaml"' | cut -d '"' -f2 | base64 -d -w0 > config.yaml
编辑
config.yaml
文件并添加以下信息:# ... REGISTRY_STATE: readonly INSTANCE_SERVICE_KEY_KID_LOCATION: 'conf/stack/quay-readonly.kid' INSTANCE_SERVICE_KEY_LOCATION: 'conf/stack/quay-readonly.pem' # ...
运行以下命令保存文件和
base64
编码:$ base64 -w0 quay-config.yaml
将 Red Hat Quay Operator pod 缩减为
0。
这样可确保 Operator 在编辑后不会协调 secret。$ oc scale --replicas=0 deployment quay-operator -n openshift-operators
编辑 secret 使其包含新内容:
$ oc edit secret quay-config-secret-name -n quay-namespace
# ... data: "quay-readonly.kid": "ZjUyNDFm..." "quay-readonly.pem": "LS0tLS1CRUdJTiBSU0E..." "config.yaml": "QUNUSU9OX0xPR19..." # ...
在 OpenShift Container Platform 以只读模式部署 Red Hat Quay 时,您可以安全地管理 registry 的操作并执行如备份和恢复等操作。
7.1.3.1. 从只读部署扩展 OpenShift Container Platform 上的 Red Hat Quay
当您不再希望 OpenShift Container Platform 上的 Red Hat Quay 处于只读模式时,您可以扩展部署,并从 secret 中删除添加的内容。
步骤
编辑
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 Operator:
oc scale --replicas=1 deployment quay-operator -n openshift-operators