第 17 章 在独立部署中备份和恢复 Red Hat Quay


使用本节中的内容在独立部署中备份和恢复 Red Hat Quay。

17.1. 可选:为 Red Hat Quay 启用只读模式

通过为 Red Hat Quay 部署启用只读模式,您可以管理 registry 的操作。Red Hat Quay 管理员可以启用只读模式来限制对 registry 的写入访问,这有助于确保数据完整性,降低维护窗口期间的风险,并提供对 registry 数据的意外修改。它还可帮助您确保 Red Hat Quay 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 软件仓库。

17.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

17.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

17.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>

17.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.