第 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 使用服务密钥与各种组件进行通信。这些密钥用于签署已完成的请求,如请求扫描镜像、登录、存储访问等。

流程

  1. 如果您的 Red Hat Quay registry 可用,您可以在 Quay registry 容器中生成服务密钥。

    1. 输入以下命令在 Quay 容器内生成密钥对:

      $ podman exec quay python3 tools/generatekeypair.py quay-readonly
  2. 如果您的 Red Hat Quay 不可用,您必须在虚拟环境中生成您的服务密钥。

    1. 进入 Red Hat Quay 部署的目录,并在该目录中创建虚拟环境:

      $ cd <$QUAY>/quay && virtualenv -v venv
    2. 输入以下命令激活虚拟环境:

      $ source venv/bin/activate
    3. 可选。安装 pip CLI 工具(如果没有安装它):

      $ venv/bin/pip install --upgrade pip
    4. 在 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
    5. 输入以下命令安装 requirements-generatekeys.txt 文件中定义的 Python 依赖项:

      $ venv/bin/pip install -r requirements-generatekeys.txt
    6. 输入以下命令来创建所需的服务密钥:

      $ 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
    7. 输入以下命令取消激活虚拟环境:

      $ deactivate

18.1.2. 在 PostgreSQL 数据库中添加密钥

使用以下步骤将服务密钥添加到 PostgreSQL 数据库中。

先决条件

  • 您已创建了服务密钥。

流程

  1. 输入以下命令输入 Red Hat Quay 数据库环境:

    $ podman exec -it postgresql-quay psql -U postgres -d quay
  2. 输入以下命令显示 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 |
    ...
  3. 输入以下查询在 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
  4. 接下来,使用以下查询添加密钥批准:

    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
  5. 将所创建的服务键行中的 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 数据库中。

流程

  1. 关闭所有虚拟机上的所有 Red Hat Quay 实例。例如:

    $ podman stop <quay_container_name_on_virtual_machine_a>
    $ podman stop <quay_container_name_on_virtual_machine_b>
  2. 输入以下命令将 quay-readonly.kid 文件的内容和 quay-readonly.pem 文件复制到保存 Red Hat Quay 配置捆绑包的目录中:

    $ cp quay-readonly.kid quay-readonly.pem $Quay/config
  3. 输入以下命令在配置捆绑包文件夹中的所有文件设置文件权限:

    $ setfacl -m user:1001:rw $Quay/config/*
  4. 修改 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'
    # ...
  5. 将新配置捆绑包分发到所有 Red Hat Quay 实例。
  6. 输入以下命令启动 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}
  7. 启动 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 的操作并执行此类操作,如备份和恢复。

  8. 可选。完成只读模式后,您可以通过从 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;
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.