第 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 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..." # ...
在只读模式下使用 Red Hat Quay on OpenShift Container Platform 部署,您可以安全地管理 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