第 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 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;
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.