管理 Red Hat Quay

Red Hat Quay 3.8

管理 Red Hat Quay

摘要

管理 Red Hat Quay

前言

部署 Red Hat Quay registry 后,可以通过多种方式来进一步配置和管理该部署。这里涵盖的主题包括:

  • 高级 Red Hat Quay 配置
  • 设置通知以提醒您新的 Red Hat Quay 发行版本
  • 使用 SSL 和 TLS 证书保护连接安全
  • 将存储定向到 Elasticsearch
  • 使用 Clair 配置镜像安全扫描
  • 使用 Container Security Operator 扫描 pod 镜像
  • 将 Red Hat Quay 与 Quay Bridge Operator 集成
  • 使用存储库镜像(mirror)镜像(mirror)镜像
  • 使用 BitTorrent 服务共享 Quay 镜像
  • 使用 LDAP 验证用户
  • 为 Prometheus 和 Grafana 指标启用 Quay
  • 设置 geo-replication
  • Quay 故障排除

第 1 章 高级 Red Hat Quay 配置

您可以使用以下接口之一在初始部署后配置 Red Hat Quay:

  • Red Hat Quay Config Tool。使用这个工具,在以配置模式运行 Quay 容器时,提供了一个基于 Web 的界面来配置 Red Hat Quay 集群。建议使用此方法配置 Red Hat Quay 服务。
  • 编辑 config.yamlconfig.yaml 文件包含 Red Hat Quay 集群的大部分配置信息。可以直接编辑 config.yaml 文件,但建议只建议通过配置工具来提供的高级调优和性能功能。
  • Red Hat Quay API。可以通过 API 配置一些 Red Hat Quay 功能。

本节中的此内容论述了如何使用上述每个接口,以及如何使用高级功能配置部署。

1.1. 使用 Red Hat Quay Config Tool 修改 Red Hat Quay

Red Hat Quay Config Tool 通过在配置模式下运行 Quay 容器以及常规 Red Hat Quay 服务来提供。

使用以下部分从 Red Hat Quay Operator 运行 Config Tool,或者从 CLI 在主机系统上运行 Config Tool。

1.1.1. 从 Red Hat Quay Operator 运行 Config Tool

在 OpenShift Container Platform 上运行 Red Hat Quay Operator 时,可使用 Config Tool。使用以下步骤访问 Red Hat Quay Config 工具。

前提条件

  1. 您已在 OpenShift Container Platform 上部署了 Red Hat Quay Operator。

流程.

  1. 在 OpenShift 控制台中,选择 Red Hat Quay 项目,如 quay-enterprise
  2. 在导航窗格中,选择 NetworkingRoutes。您应该看到到 Red Hat Quay 应用程序和 Config Tool 的路由,如下所示:

    View the route to the Red Hat Quay Config Tool

  3. 选择到 Config Tool 的路由,如 example-quayecosystem-quay-config。Config Tool UI 应该在您的浏览器中打开。
  4. 选择 Modify configuration for this cluster to up the Config Tool setup,例如:

    Modify Red Hat Quay cluster settings from the Config Tool

  5. 进行所需的更改,然后选择 Save Configuration Changes
  6. 单击 Continue Editing,或者选择 Next 以继续所有更正。
  7. 出现提示时,选择 Download Configuration。这将下载新 config.yaml 的 tarball,以及 Red Hat Quay 设置中使用的任何证书和密钥。config.yaml 可用于对您的配置进行高级更改,或用作未来参考。
  8. 选择 Go to deployment rollout → Populate configuration to deployments。等待 Red Hat Quay Pod 重启以使更改生效。

1.1.2. 从命令行运行配置工具

如果您从主机系统运行 Red Hat Quay,您可以使用以下步骤在初始部署后更改您的配置。

  1. 前提条件

    • 已安装 podmandocker
  2. 以配置模式启动 Red Hat Quay。
  3. 在第一个 Quay 节点上,输入以下命令:

    $ podman run --rm -it --name quay_config -p 8080:8080 \
        -v path/to/config-bundle:/conf/stack \
        {productrepo}/{quayimage}:{productminv} config <my_secret_password>
    注意

    要修改现有配置捆绑包,您可以将配置目录挂载到 Quay 容器中。

  4. 当 Red Hat Quay 配置工具启动时,打开浏览器并导航到您的配置文件中使用的 URL 和端口,如 quay-server.example.com:8080
  5. 输入您的用户名和密码。
  6. 根据需要修改 Red Hat Quay 集群。

1.1.3. 使用 TLS 证书部署配置工具

您可以通过将环境变量传递给 runtime 变量来部署配置工具。这样可确保保护对数据库和存储后端的凭据等敏感数据。

公钥和私钥必须包含您在其上部署配置工具的路由的有效主题备用名称(SAN)。

可以使用 CONFIG_TOOL_PRIVATE_KEYCONFIG_TOOL_PUBLIC_KEY 来指定路径。

如果您从容器运行部署,CONFIG_TOOL_PRIVATE_KEYCONFIG_TOOL_PUBLIC_KEY 将证书的位置值在容器中的值。例如:

$ podman run --rm -it --name quay_config -p 7070:8080 \

-v ${PRIVATE_KEY_PATH}:/tls/localhost.key \
-v ${PUBLIC_KEY_PATH}:/tls/localhost.crt \
-e CONFIG_TOOL_PRIVATE_KEY=/tls/localhost.key \
-e CONFIG_TOOL_PUBLIC_KEY=/tls/localhost.crt \
-e DEBUGLOG=true \
-ti config-app:dev

1.2. 使用 API 修改 Red Hat Quay

有关如何访问 Red Hat Quay API 的信息,请参阅 Red Hat Quay API 指南

1.3. 编辑 config.yaml 文件以修改 Red Hat Quay

可以通过直接编辑 config.yaml 文件来实现一些无法通过 Config Tool 提供的高级配置功能。Red Hat Quay 配置的 Schema 描述了可用的设置

以下示例是您可以在 config.yaml 文件中直接更改的设置。

1.3.1. 将名称和公司添加到 Red Hat Quay 登录中

通过设置以下字段,在用户第一次登录时,系统将提示用户输入其名称和公司。这是一个可选字段,但可以为您的 Red Hat Quay 用户提供额外数据。

---
FEATURE_USER_METADATA: true
---

1.3.2. 禁用 TLS 协议

您可以更改 SSL_PROTOCOLS 设置,以删除不想在 Red Hat Quay 实例中支持的 SSL 协议。例如,要从默认的 SSL_PROTOCOLS:['TLSv1','TLSv1.1','TLSv1.2'] 中删除 TLS v1 支持,请将其改为:

---
SSL_PROTOCOLS : ['TLSv1.1','TLSv1.2']
---

1.3.3. 速率限制 API 调用

config.yaml 文件中添加 FEATURE_RATE_LIMITS 参数会导致 nginx 将特定的 API 调用限制为 30-per-second。如果没有设置 FEATURE_RATE_LIMITS,API 调用将限制为 300-per-second,则有效地使其无限。

如果您必须确保可用资源不在流量,则速率限制很重要。

有些命名空间可能需要无限访问,例如,它们对 CI/CD 并优先考虑。在这种情况下,这些命名空间可能会放置在使用 NON_RATE_LIMITED_NAMESPACESconfig.yaml 文件中的列表中。

1.3.4. 调整数据库连接池

Red Hat Quay 由多个不同进程组成,它们都在同一个容器中运行。这些进程中的很多进程与数据库交互。

使用 DB_CONNECTION_POOLING 参数时,与数据库交互的每个进程都将包含一个连接池。这些每个进程连接池配置为维护最多 20 个连接。在负载非常重时,可以为 Red Hat Quay 容器中的每个进程填充连接池。在某些部署和负载下,可能需要分析以确保 Red Hat Quay 没有超过数据库配置的最大连接数。

随着时间的推移,连接池将释放闲置连接。要立即发布所有连接,必须重启 Red Hat Quay。

通过将 DB_CONNECTION_POOLING 设置为 truefalse 可切换数据库连接池。例如:

---
DB_CONNECTION_POOLING: true
---

当启用 DB_CONNECTION_POOLING 时,您可以使用 config.yaml 中的 DB_CONNECTION_ARGS 更改连接池的最大大小。例如:

---
DB_CONNECTION_ARGS:
  max_connections: 10
---

1.3.4.1. 数据库连接参数

您可以在 config.yaml 文件中自定义 Red Hat Quay 数据库连接设置。它们取决于您的部署的数据库驱动程序,例如 psycopg2 for Postgres 和 pymysql for MySQL。您也可以传递 Peewee 的连接池机制使用的参数。例如:

---
DB_CONNECTION_ARGS:
  max_connections: n  # Max Connection Pool size. (Connection Pooling only)
  timeout: n  # Time to hold on to connections. (Connection Pooling only)
  stale_timeout: n  # Number of seconds to block when the pool is full. (Connection Pooling only)
---

1.3.4.2. 数据库 SSL 配置

DB_CONNECTION_ARGS 字段中定义的一些键值对是通用的,另一些则特定于数据库。特别是,SSL 配置取决于您部署的数据库。

1.3.4.2.1. PostgreSQL SSL 连接参数

以下 YAML 显示了一个 PostgreSQL SSL 配置示例:

---
DB_CONNECTION_ARGS:
  sslmode: verify-ca
  sslrootcert: /path/to/cacert
---

sslmode 参数确定是否带有哪些安全 SSL TCP/IP 连接将与服务器协商的 SSL TCP/IP 连接。sslmode 参数有六个模式:

  • 模糊: 仅尝试非 SSL 连接。
  • 允许 :首先尝试非 SSL 连接。失败时,尝试 SSL 连接。
  • 首选 :默认.首先尝试 SSL 连接。失败时,尝试非 SSL 连接。
  • 需要 :仅尝试 SSL 连接。如果存在 root CA 文件,请按照指定 verify-ca 的方式验证连接。
  • verify-ca :仅尝试 SSL 连接,并验证服务器证书是否由信任证书颁发机构(CA)发布。
  • verify-full: 只尝试 SSL 连接。验证服务器证书是否由信任 CA 发布,并且请求的服务器主机名与证书中的名称匹配。

有关 PostgreSQL 有效参数的更多信息,请参阅 Database Connection Control Functions

1.3.4.2.2. MySQL SSL 连接参数

以下 YAML 显示了一个 MySQL SSL 配置示例:

---
DB_CONNECTION_ARGS:
  ssl:
    ca: /path/to/cacert
---

有关 MySQL 的有效连接参数的更多信息,请参阅使用 URI-Like Strings 或 Key-Value Pairs 连接到服务器

1.3.4.3. HTTP 连接数

您可以使用环境变量指定同步 HTTP 连接的数量。环境变量可以作为一个整体指定,也可以指定用于特定组件。每个进程的默认值为 50 个并行连接。有关环境变量的以下 YAML 示例 ;

---
WORKER_CONNECTION_COUNT_REGISTRY=n
WORKER_CONNECTION_COUNT_WEB=n
WORKER_CONNECTION_COUNT_SECSCAN=n
WORKER_CONNECTION_COUNT=n
---
注意

为特定组件指定计数将覆盖 WORKER_CONNECTION_COUNT 配置字段中设置的任何值。

1.3.4.4. 动态进程计数

要估算动态大小的进程数量,默认使用以下计算:

注意

Red Hat Quay 从整个机器上查询可用的 CPU 计数。使用 kubernetes 或其他非虚拟化机制应用的任何限制都不会影响此行为。Red Hat Quay 根据节点上的处理器总数进行计算。列出的默认值只是目标,但不能超过最小值或低于最小值。

以下每个进程数量都可使用下面指定的环境变量覆盖:

  • Registry - 提供 HTTP 端点来处理 registry 操作

    • minimum: 8
    • 最大:64
    • 默认值:$CPU_COUNT x 4
    • 环境变量:WORKER_COUNT_REGISTRY
  • Web - 为基于 Web 的界面提供 HTTP 端点

    • 最小值: 2
    • 最大:32
    • 默认值:$CPU_COUNT x 2
    • environment_variable: WORKER_COUNT_WEB
  • secscan - 与 Clair 互动

    • 最小值: 2
    • 最大:4
    • 默认值:$CPU_COUNT x 2
    • 环境变量:WORKER_COUNT_SECSCAN

1.3.4.5. 环境变量

Red Hat Quay 允许使用环境变量覆盖默认行为。下表列出并描述了每个变量以及可以期望的值。

表 1.1. worker 数环境变量

变量Description

WORKER_COUNT_REGISTRY

指定在 Quay 容器中处理 registry 请求的进程数。

8 到 64 之间的整数

WORKER_COUNT_WEB

指定处理容器中的 UI/Web 请求的进程数量。

整数 2 到 32

WORKER_COUNT_SECSCAN

指定处理容器中安全扫描的进程数量(如 Clair)集成。

2 到 4 之间的整数

DB_CONNECTION_POOLING

切换数据库连接池。

"true" or "false"

1.3.4.6. 关闭连接池

具有大量用户活动的 Red Hat Quay 部署可定期点击 2k 最大数据库连接限制。在这样的情形中,Red Hat Quay 启用了连接池(默认为启用)可能会导致数据库连接数倍增加,并需要您关闭连接池。

如果关闭连接池不足以防止达到 2k 数据库连接限制,您需要执行额外的步骤来处理问题。如果发生这种情况,您可能需要增加最大数据库连接以更好地适合您的工作负载。

第 2 章 使用配置 API

配置工具会公开 4 个端点,可用于构建、验证、捆绑包和部署配置。config-tool API 记录在 https://github.com/quay/config-tool/blob/master/pkg/lib/editor/API.md 中。在本节中,您将了解如何使用 API 检索当前配置以及如何验证您所做的任何更改。

2.1. 检索默认配置

如果您首次运行配置工具,且没有现有配置,您可以检索默认配置。以配置模式启动容器:

$ sudo podman run --rm -it --name quay_config \
  -p 8080:8080 \
  registry.redhat.io/quay/quay-rhel8:v3.8.0 config secret

使用 配置 API 的配置端点获取默认值:

$ curl -X GET -u quayconfig:secret http://quay-server:8080/api/v1/config  | jq

返回的值是 JSON 格式的默认配置:

{
  "config.yaml": {
    "AUTHENTICATION_TYPE": "Database",
    "AVATAR_KIND": "local",
    "DB_CONNECTION_ARGS": {
      "autorollback": true,
      "threadlocals": true
    },
    "DEFAULT_TAG_EXPIRATION": "2w",
    "EXTERNAL_TLS_TERMINATION": false,
    "FEATURE_ACTION_LOG_ROTATION": false,
    "FEATURE_ANONYMOUS_ACCESS": true,
    "FEATURE_APP_SPECIFIC_TOKENS": true,
    ....
  }

}

2.2. 检索当前配置

如果您已经配置并部署了 Quay registry,请停止容器并在配置模式中重启它,将现有配置作为卷载入:

$ sudo podman run --rm -it --name quay_config \
  -p 8080:8080 \
  -v $QUAY/config:/conf/stack:Z \
  registry.redhat.io/quay/quay-rhel8:v3.8.0 config secret

使用 API 的配置端点获取当前的配置:

$ curl -X GET -u quayconfig:secret http://quay-server:8080/api/v1/config  | jq

返回的值是 JSON 格式的当前配置,包括数据库和 Redis 配置数据:

{
  "config.yaml": {
    ....
    "BROWSER_API_CALLS_XHR_ONLY": false,
    "BUILDLOGS_REDIS": {
      "host": "quay-server",
      "password": "strongpassword",
      "port": 6379
    },
    "DATABASE_SECRET_KEY": "4b1c5663-88c6-47ac-b4a8-bb594660f08b",
    "DB_CONNECTION_ARGS": {
      "autorollback": true,
      "threadlocals": true
    },
    "DB_URI": "postgresql://quayuser:quaypass@quay-server:5432/quay",
    "DEFAULT_TAG_EXPIRATION": "2w",
    ....


  }

}

2.3. 使用 API 验证配置

您可以通过将配置发布到 config/validate 端点来验证配置:

curl -u quayconfig:secret --header 'Content-Type: application/json' --request POST --data '
{
  "config.yaml": {
    ....
    "BROWSER_API_CALLS_XHR_ONLY": false,
    "BUILDLOGS_REDIS": {
      "host": "quay-server",
      "password": "strongpassword",
      "port": 6379
    },
    "DATABASE_SECRET_KEY": "4b1c5663-88c6-47ac-b4a8-bb594660f08b",
    "DB_CONNECTION_ARGS": {
      "autorollback": true,
      "threadlocals": true
    },
    "DB_URI": "postgresql://quayuser:quaypass@quay-server:5432/quay",
    "DEFAULT_TAG_EXPIRATION": "2w",
    ....

  }

} http://quay-server:8080/api/v1/config/validate | jq

返回的值是包含配置中找到的错误的数组。如果配置有效,则返回空数组 []

2.4. 确定必填字段

您可以通过将空配置结构发布到 config/validate 端点来确定必填字段:

curl -u quayconfig:secret --header 'Content-Type: application/json' --request POST --data '
{
  "config.yaml": {
  }

} http://quay-server:8080/api/v1/config/validate | jq

返回的值是指示需要哪些字段的数组:

[
  {
    "FieldGroup": "Database",
    "Tags": [
      "DB_URI"
    ],
    "Message": "DB_URI is required."
  },
  {
    "FieldGroup": "DistributedStorage",
    "Tags": [
      "DISTRIBUTED_STORAGE_CONFIG"
    ],
    "Message": "DISTRIBUTED_STORAGE_CONFIG must contain at least one storage location."
  },
  {
    "FieldGroup": "HostSettings",
    "Tags": [
      "SERVER_HOSTNAME"
    ],
    "Message": "SERVER_HOSTNAME is required"
  },
  {
    "FieldGroup": "HostSettings",
    "Tags": [
      "SERVER_HOSTNAME"
    ],
    "Message": "SERVER_HOSTNAME must be of type Hostname"
  },
  {
    "FieldGroup": "Redis",
    "Tags": [
      "BUILDLOGS_REDIS"
    ],
    "Message": "BUILDLOGS_REDIS is required"
  }
]

第 3 章 获取 Red Hat Quay 发行通知

要使用最新的 Red Hat Quay 发行版本和其他与 Red Hat Quay 相关的更改,您可以在 红帽客户门户网站 上注册以获取更新通知。注册通知后,您将收到通知,以便您知道何时有新的 Red Hat Quay 版本、更新的文档或其他 Red Hat Quay news。

  1. 使用您的红帽客户帐户凭证 登录红帽客户门户网站
  2. 选择您的用户名(上角)来查看红帽帐户和客户门户网站选择: View account and portal selections
  3. 选择通知。此时会出现您的配置集活动页面。
  4. 选择通知选项卡。
  5. 选择 Manage Notifications。
  6. 选择 Follow,然后从下拉菜单选择 Products。
  7. 从 Products 旁边的下拉框中,搜索并选择 Red Hat Quay: Select Products from notifications box
  8. 选择 SAVE NOTIFICATION 按钮。接下来,当对 Red Hat Quay 产品(如新版本)有变化时,您将收到通知。

第 4 章 使用 SSL 保护到 Red Hat Quay 的连接

4.1. 使用 SSL 简介

要使用 自签名证书 配置 Red Hat Quay,您需要创建一个证书颁发机构(CA),然后生成所需的密钥和证书文件。

以下示例假设您已使用 DNS 或其他命名机制配置了服务器主机名 quay-server.example.com,例如在 /etc/hosts 文件中添加条目:

$ cat /etc/hosts
...
192.168.1.112   quay-server.example.com

4.2. 创建证书颁发机构并签署证书

在这个步骤结束时,您将分别具有一个证书文件和名为 ssl.certssl.key 的主密钥文件。

4.2.1. 创建证书颁发机构

  1. 生成 root CA 密钥:

    $ openssl genrsa -out rootCA.key 2048
  2. 生成 root CA 证书:

    $ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem
  3. 输入将融入到证书请求中的信息,包括服务器主机名,例如:

    Country Name (2 letter code) [XX]:IE
    State or Province Name (full name) []:GALWAY
    Locality Name (eg, city) [Default City]:GALWAY
    Organization Name (eg, company) [Default Company Ltd]:QUAY
    Organizational Unit Name (eg, section) []:DOCS
    Common Name (eg, your name or your server's hostname) []:quay-server.example.com

4.2.2. 为证书签名

  1. 生成服务器密钥:

    $ openssl genrsa -out ssl.key 2048
  2. 生成签名请求:

    $ openssl req -new -key ssl.key -out ssl.csr
  3. 输入将融入到证书请求中的信息,包括服务器主机名,例如:

    Country Name (2 letter code) [XX]:IE
    State or Province Name (full name) []:GALWAY
    Locality Name (eg, city) [Default City]:GALWAY
    Organization Name (eg, company) [Default Company Ltd]:QUAY
    Organizational Unit Name (eg, section) []:DOCS
    Common Name (eg, your name or your server's hostname) []:quay-server.example.com
  4. 创建配置文件 openssl.cnf,指定服务器主机名,例如:

    openssl.cnf

    [req]
    req_extensions = v3_req
    distinguished_name = req_distinguished_name
    [req_distinguished_name]
    [ v3_req ]
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName = @alt_names
    [alt_names]
    DNS.1 = quay-server.example.com
    IP.1 = 192.168.1.112

  5. 使用配置文件生成证书 ssl.cert

    $ openssl x509 -req -in ssl.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out ssl.cert -days 356 -extensions v3_req -extfile openssl.cnf

4.3. 使用命令行配置 SSL

配置 SSL 时的另一个选项是使用 命令行界面。

  1. 将证书文件和主密钥文件复制到您的配置目录中,确保它们分别命名为 ssl.certssl.key

    $ cp ~/ssl.cert $QUAY/config
    $ cp ~/ssl.key $QUAY/config
    $ cd $QUAY/config
  2. 编辑 config.yaml 文件并指定您希望 Quay 处理 TLS:

    config.yaml

    ...
    SERVER_HOSTNAME: quay-server.example.com
    ...
    PREFERRED_URL_SCHEME: https
    ...

  3. 停止 Quay 容器并重启 registry:

    $ sudo podman rm -f quay
    $ sudo podman run -d --rm -p 80:8080 -p 443:8443 \
      --name=quay \
      -v $QUAY/config:/conf/stack:Z \
      -v $QUAY/storage:/datastorage:Z \
      registry.redhat.io/quay/quay-rhel8:v3.8.0

4.4. 使用 UI 配置 SSL

本节使用 Quay UI 配置 SSL。要使用命令行界面配置 SSL,请查看以下部分。

  1. 以配置模式启动 Quay 容器:

    $ sudo podman run --rm -it --name quay_config -p 80:8080 -p 443:8443 registry.redhat.io/quay/quay-rhel8:v3.8.0 config secret
  2. 在 Server Configuration 部分中,选择 Red Hat Quay 为 TLS 处理 TLS。上传之前创建的证书文件和私钥文件,确保服务器主机名与创建证书时使用的值匹配。验证并下载更新的配置。
  3. 停止 Quay 容器,然后重新启动 registry:

    $ sudo podman rm -f quay
    $ sudo podman run -d --rm -p 80:8080 -p 443:8443 \
    --name=quay \
    -v $QUAY/config:/conf/stack:Z \
    -v $QUAY/storage:/datastorage:Z \
    registry.redhat.io/quay/quay-rhel8:v3.8.0

4.5. 使用命令行测试 SSL 配置

  • 使用 podman login 命令,尝试使用启用 SSL 登录 Quay registry:

    $ sudo podman login quay-server.example.com
    Username: quayadmin
    Password:
    
    Error: error authenticating creds for "quay-server.example.com": error pinging docker registry quay-server.example.com: Get "https://quay-server.example.com/v2/": x509: certificate signed by unknown authority
  • Podman 不信任自签名证书。作为临时解决方案,使用 --tls-verify 选项:

    $ sudo podman login --tls-verify=false quay-server.example.com
    Username: quayadmin
    Password:
    
    Login Succeeded!

后续小节中介绍了如何将 Podman 配置为信任根证书颁发机构(CA)。

4.6. 使用浏览器测试 SSL 配置

当您尝试访问 Quay registry 时,本例中为 https://quay-server.example.com,浏览器会警告潜在的风险:

Potential risk

继续进行登录屏幕,浏览器会通知您连接不安全:

Connection not secure

后续小节中介绍了如何将系统配置为信任根证书颁发机构(CA)。

4.7. 配置 podman 以信任证书颁发机构

Podman 使用两个路径来查找 CA 文件,即 /etc/containers/certs.d//etc/docker/certs.d/

  • 将 root CA 文件复制到这些位置之一,使用服务器主机名确定的确切路径命名文件 ca.crt

    $ sudo cp rootCA.pem /etc/containers/certs.d/quay-server.example.com/ca.crt
  • 或者,如果使用 Docker,您可以将 root CA 文件复制到等效的 Docker 目录中:

    $ sudo cp rootCA.pem /etc/docker/certs.d/quay-server.example.com/ca.crt

在登录到 registry 时,您应该不再需要使用 --tls-verify=false 选项:

$ sudo podman login quay-server.example.com

Username: quayadmin
Password:
Login Succeeded!

4.8. 将系统配置为信任证书颁发机构

  1. 将 root CA 文件复制到合并系统范围的信任存储中:

    $ sudo cp rootCA.pem /etc/pki/ca-trust/source/anchors/
  2. 更新系统范围的信任存储配置:

    $ sudo update-ca-trust extract
  3. 您可以使用 trust list 命令来确保已经配置了 Quay 服务器:

    $ trust list | grep quay
        label: quay-server.example.com

    现在,当您浏览 https://quay-server.example.com 中的 registry 时,锁定图标会显示连接是安全的:

    Connection not secure

  4. 要从系统范围的信任中删除 root CA,请删除该文件并更新配置:

    $ sudo rm /etc/pki/ca-trust/source/anchors/rootCA.pem
    $ sudo update-ca-trust extract
    $ trust list | grep quay
    $

如需更多信息,请参阅《 使用共享系统证书 》中的 RHEL 8 文档。

第 5 章 在 Red Hat Quay Container 中添加 TLS 证书

要将自定义 TLS 证书添加到 Red Hat Quay,在 Red Hat Quay 配置目录下创建一个名为 extra_ca_certs/ 的新目录。将所需的任何特定于站点的 TLS 证书复制到这个新目录中。

5.1. 将 TLS 证书添加到 Red Hat Quay

  1. 查看要添加到容器的证书

    $ cat storage.crt
    -----BEGIN CERTIFICATE-----
    MIIDTTCCAjWgAwIBAgIJAMVr9ngjJhzbMA0GCSqGSIb3DQEBCwUAMD0xCzAJBgNV
    [...]
    -----END CERTIFICATE-----
  2. 创建 certs 目录并复制证书

    $ mkdir -p quay/config/extra_ca_certs
    $ cp storage.crt quay/config/extra_ca_certs/
    $ tree quay/config/
    ├── config.yaml
    ├── extra_ca_certs
    │   ├── storage.crt
  3. 使用 podman ps 获取 Quay 容器的 CONTAINER ID

    $ sudo podman ps
    CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS              PORTS
    5a3e82c4a75f        <registry>/<repo>/quay:v3.8.0 "/sbin/my_init"          24 hours ago        Up 18 hours         0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 443/tcp   grave_keller
  4. 使用该 ID 重启容器:

    $ sudo podman restart 5a3e82c4a75f
  5. 检查复制到容器命名空间中的证书:

    $ sudo podman exec -it 5a3e82c4a75f cat /etc/ssl/certs/storage.pem
    -----BEGIN CERTIFICATE-----
    MIIDTTCCAjWgAwIBAgIJAMVr9ngjJhzbMA0GCSqGSIb3DQEBCwUAMD0xCzAJBgNV

5.2. 在 Kubernetes 上部署时添加证书

在 Kubernetes 上部署时,Red Hat Quay 将 secret 中的挂载为卷,以存储配置资产。不幸的是,这目前会破坏超级用户面板的上传证书功能。

要遇到此错误,可在部署 Red Hat Quay 将 base64 编码的证书添加到 secret 中。以下是如何:

  1. 从 base64 编码证书内容开始:

    $ cat ca.crt
    -----BEGIN CERTIFICATE-----
    MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQsFADA5MRcwFQYDVQQKDA5MQUIu
    TElCQ09SRS5TTzEeMBwGA1UEAwwVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTE2
    MDExMjA2NTkxMFoXDTM2MDExMjA2NTkxMFowOTEXMBUGA1UECgwOTEFCLkxJQkNP
    UkUuU08xHjAcBgNVBAMMFUNlcnRpZmljYXRlIEF1dGhvcml0eTCCASIwDQYJKoZI
    [...]
    -----END CERTIFICATE-----
    
    $ cat ca.crt | base64 -w 0
    [...]
    c1psWGpqeGlPQmNEWkJPMjJ5d0pDemVnR2QNCnRsbW9JdEF4YnFSdVd3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
  2. 使用 kubectl 工具编辑 quay-enterprise-config-secret。

    $ kubectl --namespace quay-enterprise edit secret/quay-enterprise-config-secret
  3. 为证书添加一个条目,并在条目下粘贴完整的 base64 编码字符串:

      custom-cert.crt:
    c1psWGpqeGlPQmNEWkJPMjJ5d0pDemVnR2QNCnRsbW9JdEF4YnFSdVd3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
  4. 最后,回收所有 Red Hat Quay Pod。使用 kubectl delete 删除所有 Red Hat Quay pod。Red Hat Quay Deployment 会自动使用新证书数据调度替换 pod。

第 6 章 为 Elasticsearch 配置操作日志存储

默认情况下,过去三个月的用量日志存储在 Red Hat Quay 数据库中,并通过 web UI 在机构和存储库级别公开。需要适当的管理特权才能查看日志条目。对于具有大量日志操作的部署,您现在可以将使用日志存储在 Elasticsearch 中,而不是 Red Hat Quay 数据库后端。要做到这一点,您需要提供自己的 Elasticsearch 堆栈,因为它没有包括在 Red Hat Quay 中作为可自定义组件。

启用 Elasticsearch 日志记录可以在 Red Hat Quay 部署或部署后使用 Red Hat Quay Config Tool 进行。生成的配置存储在 config.yaml 文件中。配置后,通过 Web UI (存储库和组织)通过 Web UI 提供使用日志访问权限。

以下是如何配置操作日志存储,使其从默认 Red Hat Quay 数据库更改为使用 Elasticsearch:

  1. 获取 Elasticsearch 帐户。
  2. 打开 Red Hat Quay Config Tool (在 Red Hat Quay 部署过程中或之后)。
  3. 滚动到 Action Log Storage Configuration 设置,然后选择 Elasticsearch 而不是 Database。下图显示了以下显示的 Elasticsearch 设置:

    Choose Elasticsearch to view settings to store logs

  4. 填写 Elasticsearch 实例的以下信息:

    • Elasticsearch 主机名 :提供 Elasticsearch 服务的系统的主机名或 IP 地址。
    • Elasticsearch 端口 :在您刚刚输入的主机上提供 Elasticsearch 服务的端口号。请注意,该端口必须从运行 Red Hat Quay registry 的所有系统访问。默认值为 TCP 端口 9200。
    • Elasticsearch 访问密钥 :根据需要获取 Elastic 搜索服务所需的访问密钥。
    • Elasticsearch secret key :获取 Elastic search 服务所需的 secret 密钥(如果需要)。
    • AWS 区域 :如果您在 AWS 上运行,请设置 AWS 区域(否则,请留空)。
    • 索引前缀 :选择附加到日志条目的前缀。
    • logs Producer :选择 Elasticsearch (默认)或 Kinesis 将日志定向到 AWS 上的中间 Kinesis 流。您需要设置自己的管道,以便将日志从 Kinesis 发送到 Elasticsearch (如 Logstash)。下图显示了您需要填写 Kinesis 的其他字段:

      On AWS optionally set up an intermediate Kinesis stream

  5. 如果您选择 Elasticsearch 作为 Logs Producer,则不需要进一步的配置。如果您选择了 Kinesis,请填写以下内容:

    • 流名称 :Kinesis 流的名称。
    • AWS 访问密钥 :所需的 AWS 访问密钥的名称(如果需要)。
    • AWS secret key :获取 Kinesis 流所需的 AWS secret 密钥名称(如果需要)。
    • AWS 区域 :AWS 区域。
  6. 完成后,保存配置。配置工具检查您的设置。如果连接到 Elasticsearch 或 Kinesis 服务时遇到问题,您会看到一个错误,并有机会继续编辑。否则,在集群使用新配置重启后,日志将开始定向到 Elasticsearch 配置。

第 7 章 Clair 安全扫描

Clair 是一组可用于 Red Hat Quay 的微服务,可用于对与一组 Linux 操作系统关联的容器镜像进行漏洞扫描。Clair 的微服务设计使其适合在高度可扩展的配置中运行,组件可根据企业环境单独扩展。

Clair 使用以下漏洞数据库扫描镜像中的问题:

  • alpine SecDB 数据库
  • AWS UpdateInfo
  • Debian Oval 数据库
  • Oracle Oval 数据库
  • RHEL Oval 数据库
  • SUSE Oval 数据库
  • Ubuntu Oval 数据库
  • Pyup.io (python)数据库

如需有关 Clair 如何使用不同数据库进行安全映射的信息,请参阅 ClairCore Mapping

注意

在 Red Hat Quay 3.4 发行版本中,新的 Clair V4 (镜像 registry.redhat.io/quay/clair-rhel8 完全替换了前面的 Clair V2 (image quay.io/redhat/clair-jwt)。参阅以下内容,了解如何在 V4 更新时以只读模式运行 V2。

7.1. 在 Red Hat Quay OpenShift 部署上设置 Up Clair

7.1.1. 部署 Quay Operator

要在 OpenShift 上的新 Red Hat Quay 部署上设置 Clair V4,强烈建议您使用 Quay Operator。默认情况下,Quay Operator 将安装或升级 Clair 部署以及您的 Red Hat Quay 部署并配置 Clair 安全扫描。

7.1.2. 手动部署 Clair

要在运行 Clair V2 的现有 Red Hat Quay OpenShift 部署中配置 Clair V4,首先确保 Red Hat Quay 已升级到至少版本 3.4.0。然后,按照以下步骤手动设置 Clair V4 和 Clair V2。

  1. 将当前项目设置为运行 Red Hat Quay 的项目的名称。例如:

    $ oc project quay-enterprise
  2. 为 Clair v4 创建 Postgres 部署文件(例如,cl airv4-postgres.yaml),如下所示:

    clairv4-postgres.yaml

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: clairv4-postgres
      namespace: quay-enterprise
      labels:
        quay-component: clairv4-postgres
    spec:
      replicas: 1
      selector:
        matchLabels:
          quay-component: clairv4-postgres
      template:
        metadata:
          labels:
            quay-component: clairv4-postgres
        spec:
          volumes:
            - name: postgres-data
              persistentVolumeClaim:
                claimName: clairv4-postgres
          containers:
            - name: postgres
              image: postgres:11.5
              imagePullPolicy: "IfNotPresent"
              ports:
                - containerPort: 5432
              env:
                - name: POSTGRES_USER
                  value: "postgres"
                - name: POSTGRES_DB
                  value: "clair"
                - name: POSTGRES_PASSWORD
                  value: "postgres"
                - name: PGDATA
                  value: "/etc/postgres/data"
              volumeMounts:
                - name: postgres-data
                  mountPath: "/etc/postgres"
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: clairv4-postgres
      labels:
        quay-component: clairv4-postgres
    spec:
      accessModes:
        - "ReadWriteOnce"
      resources:
        requests:
          storage: "5Gi"
        volumeName: "clairv4-postgres"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: clairv4-postgres
      labels:
        quay-component: clairv4-postgres
    spec:
      type: ClusterIP
      ports:
        - port: 5432
          protocol: TCP
          name: postgres
          targetPort: 5432
      selector:
        quay-component: clairv4-postgres

  3. 部署 postgres 数据库,如下所示:

    $ oc create -f ./clairv4-postgres.yaml
  4. 创建一个 Clair config.yaml 文件,以用于 Clair v4。例如:

    config.yaml

    introspection_addr: :8089
    http_listen_addr: :8080
    log_level: debug
    indexer:
      connstring: host=clairv4-postgres port=5432 dbname=clair user=postgres password=postgres sslmode=disable
      scanlock_retry: 10
      layer_scan_concurrency: 5
      migrations: true
    matcher:
      connstring: host=clairv4-postgres port=5432 dbname=clair user=postgres password=postgres sslmode=disable
      max_conn_pool: 100
      run: ""
      migrations: true
      indexer_addr: clair-indexer
    notifier:
      connstring: host=clairv4-postgres port=5432 dbname=clair user=postgres password=postgres sslmode=disable
      delivery: 1m
      poll_interval: 5m
      migrations: true
    auth:
      psk:
        key: MTU5YzA4Y2ZkNzJoMQ== 1
        iss: ["quay"]
    # tracing and metrics
    trace:
      name: "jaeger"
      probability: 1
      jaeger:
        agent_endpoint: "localhost:6831"
        service_name: "clair"
    metrics:
      name: "prometheus"

    1
    要生成 Clair pre-shared key (PSK),请在用户界面的 安全扫描器部分启用扫描,然后点击 Generate PSK

有关 Clair 的配置格式的更多信息,请参见 上游 Clair 文档

  1. 从 Clair config.yaml 创建 secret:

    $ oc create secret generic clairv4-config-secret --from-file=./config.yaml
  2. 创建 Clair v4 部署文件(例如,cl air-combo.yaml),并根据需要进行修改:

    clair-combo.yaml

    ---
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      labels:
        quay-component: clair-combo
      name: clair-combo
    spec:
      replicas: 1
      selector:
        matchLabels:
          quay-component: clair-combo
      template:
        metadata:
          labels:
            quay-component: clair-combo
        spec:
          containers:
            - image: registry.redhat.io/quay/clair-rhel8:v3.8.0  1
              imagePullPolicy: IfNotPresent
              name: clair-combo
              env:
                - name: CLAIR_CONF
                  value: /clair/config.yaml
                - name: CLAIR_MODE
                  value: combo
              ports:
                - containerPort: 8080
                  name: clair-http
                  protocol: TCP
                - containerPort: 8089
                  name: clair-intro
                  protocol: TCP
              volumeMounts:
                - mountPath: /clair/
                  name: config
          imagePullSecrets:
            - name: redhat-pull-secret
          restartPolicy: Always
          volumes:
            - name: config
              secret:
                secretName: clairv4-config-secret
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: clairv4 2
      labels:
        quay-component: clair-combo
    spec:
      ports:
        - name: clair-http
          port: 80
          protocol: TCP
          targetPort: 8080
        - name: clair-introspection
          port: 8089
          protocol: TCP
          targetPort: 8089
      selector:
        quay-component: clair-combo
      type: ClusterIP

    1
    将镜像更改为最新的 clair 镜像名称和版本。
    2
    将 Service 设置为 clairv4 后,Clair v4 的扫描程序端点稍后会在 SECURITY_SCANNER_V4_ENDPOINT 中输入到 Red Hat Quay config.yaml 中。
  3. 创建 Clair v4 部署,如下所示:

    $ oc create -f ./clair-combo.yaml
  4. 为您的 Red Hat Quay 部署修改 config.yaml 文件,以便在末尾添加以下条目:

    FEATURE_SECURITY_NOTIFICATIONS: true
    FEATURE_SECURITY_SCANNER: true
    SECURITY_SCANNER_V4_ENDPOINT: http://clairv4 1
    1
    识别 Clair v4 服务端点
  5. 将修改后的 config.yaml 重新部署到包含该文件的 secret (如 quay-enterprise-config-secret:

    $ oc delete secret quay-enterprise-config-secret
    $ oc create secret generic quay-enterprise-config-secret --from-file=./config.yaml
  6. 要使新的 config.yaml 生效,您需要重启 Red Hat Quay Pod。只需删除 quay-app pod,则会导致部署有更新配置的 pod。

此时,命名空间白名单中标识的任何组织中的镜像将由 Clair v4 进行扫描。

7.2. 在非 OpenShift Red Hat Quay 部署上设置 Clair

对于没有在 OpenShift 上运行的 Red Hat Quay 部署,可以手动配置 Clair 安全扫描。已运行 Clair V2 的 Red Hat Quay 部署可以使用以下说明将 Clair V4 添加到其部署中。

  1. 部署(可能是容错)Postgres 数据库服务器。请注意,Clair 需要将 uuid-ossp 扩展添加到其 Postgres 数据库中。如果 Clair 的 config.yaml 中提供的用户具有创建扩展所需的特权,则它将自动由 Clair 本身添加。如果没有,必须在启动 Clair 前添加扩展。如果不存在扩展,则 Clair 尝试启动时将显示以下错误:

    ERROR: Please load the "uuid-ossp" extension. (SQLSTATE 42501)
  2. 在特定文件夹中创建一个 Clair 配置文件,如 /etc/clairv4/config/config.yaml

    config.yaml

    introspection_addr: :8089
    http_listen_addr: :8080
    log_level: debug
    indexer:
      connstring: host=clairv4-postgres port=5432 dbname=clair user=postgres password=postgres sslmode=disable
      scanlock_retry: 10
      layer_scan_concurrency: 5
      migrations: true
    matcher:
      connstring: host=clairv4-postgres port=5432 dbname=clair user=postgres password=postgres sslmode=disable
      max_conn_pool: 100
      run: ""
      migrations: true
      indexer_addr: clair-indexer
    notifier:
      connstring: host=clairv4-postgres port=5432 dbname=clair user=postgres password=postgres sslmode=disable
      delivery_interval: 1m
      poll_interval: 5m
      migrations: true
    
    # tracing and metrics
    trace:
      name: "jaeger"
      probability: 1
      jaeger:
        agent_endpoint: "localhost:6831"
        service_name: "clair"
    metrics:
      name: "prometheus"

有关 Clair 的配置格式的更多信息,请参见 上游 Clair 文档

  1. 通过容器镜像运行 Clair,从您创建的文件中挂载配置中。

    $ podman run -p 8080:8080 -p 8089:8089 -e CLAIR_CONF=/clair/config.yaml -e CLAIR_MODE=combo -v /etc/clair4/config:/clair -d registry.redhat.io/quay/clair-rhel8:v3.8.0
  2. 按照上一节中剩余的说明,将 Red Hat Quay 配置为使用新的 Clair V4 端点。

也可以以这种方式运行多个 Clair 容器,但对于单个容器以外部署场景,强烈建议使用 Kubernetes 或 OpenShift 等容器编排器。

7.3. 高级 Clair 配置

7.3.1. 非受管 Clair 配置

使用 Red Hat Quay 3.7 时,用户可以在 Red Hat Quay OpenShift Container Platform Operator 上运行非受管 Clair 配置。此功能允许用户创建非受管 Clair 数据库,或者在没有非受管数据库的情况下运行其自定义 Clair 配置。

7.3.1.1. 取消管理 Clair 数据库

一个非受管 Clair 数据库可让 Red Hat Quay Operator 在 geo-replicated 环境中工作,其中多个 Operator 实例必须与同一数据库通信。当用户需要集群外存在的高可用性(HA) Clair 数据库时,也可以使用非受管 Clair 数据库。

流程

  • 在 Quay Operator 中,将 QuayRegistry 自定义资源的 clairpostgres 组件设置为非受管状态:

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      name: quay370
    spec:
      configBundleSecret: config-bundle-secret
      components:
        - kind: objectstorage
          managed: false
        - kind: route
          managed: true
        - kind: tls
          managed: false
        - kind: clairpostgres
          managed: false

7.3.1.2. 配置自定义 Clair 数据库

Red Hat Quay Operator for OpenShift Container Platform 允许用户通过编辑 configBundleSecret 参数来提供自己的 Clair 配置。

流程

  1. 创建包含 clair-config.yaml 的 Quay 配置捆绑包 secret:

    $ oc create secret generic --from-file config.yaml=./config.yaml --from-file extra_ca_cert_rds-ca-2019-root.pem=./rds-ca-2019-root.pem --from-file clair-config.yaml=./clair-config.yaml --from-file ssl.cert=./ssl.cert --from-file ssl.key=./ssl.key config-bundle-secret

    clair-config.yaml 配置示例:

    indexer:
        connstring: host=quay-server.example.com port=5432 dbname=quay user=quayrdsdb password=quayrdsdb sslrootcert=/run/certs/rds-ca-2019-root.pem sslmode=verify-ca
        layer_scan_concurrency: 6
        migrations: true
        scanlock_retry: 11
    log_level: debug
    matcher:
        connstring: host=quay-server.example.com port=5432 dbname=quay user=quayrdsdb password=quayrdsdb sslrootcert=/run/certs/rds-ca-2019-root.pem sslmode=verify-ca
        migrations: true
    metrics:
        name: prometheus
    notifier:
        connstring: host=quay-server.example.com port=5432 dbname=quay user=quayrdsdb password=quayrdsdb sslrootcert=/run/certs/rds-ca-2019-root.pem sslmode=verify-ca
        migrations: true
    注意
  2. clair-config.yaml 添加到捆绑包 secret 中,名为 configBundleSecret

    apiVersion: v1
    kind: Secret
    metadata:
      name: config-bundle-secret
      namespace: quay-enterprise
    data:
      config.yaml: <base64 encoded Quay config>
      clair-config.yaml: <base64 encoded Clair config>
      extra_ca_cert_<name>: <base64 encoded ca cert>
      clair-ssl.crt: >-
      clair-ssl.key: >-
    注意

    更新后,提供的 clair-config.yaml 会被挂载到 Clair pod 中。任何未提供的字段都会使用 Clair 配置模块自动填充默认值。

正确配置后,Clair 应用 pod 应返回 Ready 状态。

7.3.2. 使用 管理 的数据库运行自定义 Clair 配置

在某些情况下,用户可能希望使用 受管 数据库运行自定义 Clair 配置。这在以下情况中很有用:

  • 当用户希望禁用更新器时。
  • 当用户在 air-gapped 环境中运行时。

    注意
    • 如果您在 air-gapped 环境中运行 Quay,则 clair-config.yamlairgap 参数必须设置为 true
    • 如果您在 air-gapped 环境中运行 Quay,您应该禁用所有更新器。

clairpostgres 设置为 managed 时,使用"配置自定义 Clair 数据库"中的步骤来配置您的数据库。

有关在 air-gapped 环境中运行 Clair 的更多信息,请参阅在 air-gapped OpenShift 集群中配置对 Clair 数据库的访问

7.4. Clair CRDA 配置

7.4.1. 启用 Clair CRDA

Java 扫描依赖于一个公共的、红帽提供的 API 服务,称为 Code Ready Dependency Analytics (CRDA)。CRDA 仅适用于互联网访问,默认情况下不启用。使用以下步骤将 CRDA 服务与自定义 API 密钥集成,并为 Java 和 Python 扫描启用 CRDA。

前提条件

  • Red Hat Quay 3.7 或更高版本

流程

  1. 提交 API 密钥请求表单,以获取特定于 Quay 的 CRDA 远程匹配器。
  2. clair-config.yaml 文件中设置 CRDA 配置:

    matchers:
      config:
        crda:
          url: https://gw.api.openshift.io/api/v2/
          key: <CRDA_API_KEY> 1
          source: <QUAY_SERVER_HOSTNAME> 2
    1
    2
    Quay 服务器的主机名。

7.5. 使用 Clair

  1. 登录到您的 Red Hat Quay 集群,然后选择已为其配置 Clair 扫描的组织。
  2. 从该机构中选择一个存储库,其中包含一些镜像,并从左侧导航中选择 Tags。下图显示了已扫描有两个镜像的存储库示例:

    Security scan information appears for scanned repository images

  3. 如果找到了漏洞,请选择镜像的 Security Scan 列下,以查看所有漏洞或可修复的漏洞。下图显示了所有发现的漏洞的信息:

    See all vulnerabilities or only those that are fixable

7.6. CVE 国家漏洞数据库中的评级

使用 Clair v4.2 时,在 Quay UI 中可以看到增强数据。另外,Clair v4.2 从国家漏洞数据库中添加 CVSS 分数。

在这个版本中,如果漏洞的 CVSS 分数在距离距离分数的两个级别内,Quay UI 默认存在距离的分数。例如:

Clair v4.2 data display

这与前面的接口不同,后者只显示以下信息:

Clair v4 data display

7.7. 为 Disconnected 环境配置 Clair

Clair 利用一组称为 Updaters 的组件来处理从各种漏洞数据库获取和解析数据。这些更新器默认设置为直接从互联网获取漏洞数据,并开箱即用。对于断开连接的环境中的客户,如果不能直接访问互联网,这会产生一个问题。Clair 支持这些环境,能够处理用于隔离不同类型的更新工作流。使用 clairctl 命令行实用程序,任何进程都可以通过开放的主机轻松从互联网获取更新器数据,安全地将数据传送到隔离的主机,然后将隔离主机上的 Updater 数据导入到 Clair 本身中。

这些步骤如下。

  1. 首先,请确保您的 Clair 配置已禁用自动 Updaters 运行。

    config.yaml

    matcher:
      disable_updaters: true

  2. 将最新的 Updater 数据导出到本地存档。这要求 clairctl 工具可以直接作为二进制文件运行,或者由 Clair 容器镜像运行。假设您的 Clair 配置在 /etc/clairv4/config/config.yaml 中,通过容器镜像运行:

    $ podman run -it --rm -v /etc/clairv4/config:/cfg:Z -v /path/to/output/directory:/updaters:Z --entrypoint /bin/clairctl registry.redhat.io/quay/clair-rhel8:v3.8.0 --config /cfg/config.yaml export-updaters  /updaters/updaters.gz

    请注意,您需要明确引用 Clair 配置。这将在 /etc/clairv4/updaters/updaters.gz 中创建 Updater 归档。如果要确保创建存档时从源数据库出现任何错误,则可以向 clairctl 提供 --strict 标志。该存档文件应通过 复制到可通过运行 Clair 的断开连接的主机访问的卷。现在,使用同样的步骤将存档导入到 Clair 中。

    $ podman run -it --rm -v /etc/clairv4/config:/cfg:Z -v /path/to/output/directory:/updaters:Z --entrypoint /bin/clairctl registry.redhat.io/quay/clair-rhel8:v3.8.0 --config /cfg/config.yaml import-updaters /updaters/updaters.gz

7.7.1. 将存储库映射到常见产品枚举(CPE)信息

Clair 的 RHEL 扫描程序依赖于通用产品枚举(CPE)文件,将 RPM 软件包正确映射到对应的安全数据,从而生成匹配结果。必须在存在此文件或访问文件的访问权限,才能使扫描程序正确处理 RPM。如果不存在该文件,则不会扫描容器镜像中安装的 RPM。

红帽发布位于 https://www.redhat.com/security/data/metrics/repository-to-cpe.json 的仓库2cep JSON 映射文件。

红帽在 https://access.redhat.com/security/data/metrics/container-name-repos-map.json中发布 name2repos JSON 映射文件

除了将 CVE 信息上传到断开连接的 Clair 的数据库外,还必须使映射文件在本地可用:

  • 对于单机 Quay 和 Clair 部署,映射文件必须加载到 Clair pod 中。
  • 对于基于 Operator 的部署,必须将 Clair 组件设置为 非受管。然后,手动部署 Clair,将配置设置为加载映射文件的本地副本。

使用 Clair 配置中的 repo2cpe_mapping_file 字段指定该文件:

indexer:
 scanner:
    repo:
      rhel-repository-scanner:
        repo2cpe_mapping_file: /data/cpe-map.json
    package:
      rhel_containerscanner:
        name2repos_mapping_file: /data/repo-map.json 1

如需更多信息,请参阅 Red Hat 如何准确匹配 OVAL 安全数据到已安装的 RPM

7.8. Clair updater URL

以下是 Clair 在默认配置中尝试对话的 HTTP 主机和路径。此列表不是奇怪的,因为某些服务器会发出重定向,并且一些请求 URL 被动态构建。

  • https://secdb.alpinelinux.org/
  • http://repo.us-west-2.amazonaws.com/2018.03/updates/x86_64/mirror.list
  • https://cdn.amazonlinux.com/2/core/latest/x86_64/mirror.list
  • https://www.debian.org/security/oval/
  • https://linux.oracle.com/security/oval/
  • https://packages.vmware.com/photon/photon_oval_definitions/
  • https://github.com/pyupio/safety-db/archive/
  • https://catalog.redhat.com/api/containers/
  • https://www.redhat.com/security/data/
  • https://support.novell.com/security/oval/
  • https://people.canonical.com/~ubuntu-security/oval/

7.9. 其它信息

有关 Clair 内部的详细信息,包括微服务的结构,请参阅 Upstream ClairClairCore 文档。

第 8 章 使用 Container Security Operator 扫描 pod 镜像

Container Security Operator (CSO)是 OpenShift Container Platform 和其他 Kubernetes 平台上的 Clair 安全扫描程序的附加组件。使用 CSO,用户可以扫描与活跃 pod 关联的容器镜像以了解已知的漏洞。

注意

在没有 Red Hat Quay 和 Clair 的情况下,CSO 无法工作。

Container Security Operator (CSO)执行以下功能:

  • 监视与指定或所有命名空间中的 pod 关联的容器。
  • 查询容器来自漏洞信息的容器 registry (提供镜像 registry 支持镜像扫描,如带有 Clair 扫描的 Red Hat Quay registry)。
  • 通过 Kubernetes API 中的 ImageManifestVuln 对象公开漏洞。
注意

要在 Kubernetes 上安装 CSO 的说明,请从 Container Security OperatorHub.io 页面中选择 Install 按钮。

8.1. 在 OpenShift Container Platform 中下载并运行 Container Security Operator

使用以下步骤下载 Container Security Operator。

注意

在以下步骤中,CSO 安装在 marketplace-operators 命名空间中。这允许在 OpenShift Container Platform 集群的所有命名空间中使用 CSO。

  1. 进入 Operators → OperatorHub (选择 Security)来查看可用的 Container Security Operator。
  2. 选择 Container Security Operator,然后选择 Install 进入 Create Operator Subscription 页面。
  3. 检查设置(默认为所有命名空间和自动批准策略),然后选择 Subscribe。在 Installed Operators 屏幕中几分钟后会出现 容器安全性
  4. 另外,您可以选择在 CSO 中添加自定义证书。在本例中,在当前目录中创建一个名为 quay.crt 的证书。然后,运行以下命令将证书添加到 CSO (重新启动 Operator pod 以使新证书生效):

    $ oc create secret generic container-security-operator-extra-certs --from-file=quay.crt -n openshift-operators
  5. 打开 OpenShift Dashboard (Home → Dashboards)。到镜像安全性的链接会出现在 status 部分,其中列出了目前发现的漏洞数量。选择该链接来查看安全分类,如下图所示:

    Access SCO scanning data from OpenShift dashboard

  6. 对于任何检测到的安全漏洞,您可以在此时进行两个操作之一:

    • 选择到这个漏洞的链接。您会进入容器 registry、Red Hat Quay 或其他容器来自的 registry,您可以在其中查看漏洞的信息。下图显示了从 Quay.io registry 中检测到的漏洞示例:

      The CSO points you to a registry containing the vulnerable image

    • 选择命名空间链接进入 ImageManifestVuln 屏幕,您可以在其中查看所选镜像的名称以及该镜像正在运行的所有命名空间。下图表示一个特定的漏洞镜像在两个命名空间中运行:

      View namespaces a vulnerable image is running in

此时,您知道哪些镜像存在这个安全漏洞,需要做什么来修复这些漏洞,以及镜像在中运行的每个命名空间。您可以:

  • 警告运行镜像的用户需要修正这个漏洞
  • 停止镜像正在运行(通过删除启动镜像所在 pod 的部署或其他对象)

请注意,如果您删除 pod,可能需要几分钟时间才能在仪表板上重置漏洞。

8.2. 通过 CLI 查询镜像漏洞

您可以从命令行查询安全性信息。要查询检测到的漏洞,请输入:

$ oc get vuln --all-namespaces
NAMESPACE     NAME              AGE
default       sha256.ca90...    6m56s
skynet        sha256.ca90...    9m37s

要显示特定漏洞的详情,请确定一个漏洞,及其命名空间和 describe 选项。本例演示了一个活跃的容器,其镜像包含存在漏洞的 RPM 软件包:

$ oc describe vuln --namespace mynamespace sha256.ac50e3752...
Name:         sha256.ac50e3752...
Namespace:    quay-enterprise
...
Spec:
  Features:
    Name:            nss-util
    Namespace Name:  centos:7
    Version:         3.44.0-3.el7
    Versionformat:   rpm
    Vulnerabilities:
      Description: Network Security Services (NSS) is a set of libraries...

第 9 章 将 Red Hat Quay 与 Quay Bridge Operator 集成

使用 Quay Bridge Operator,您可以将 OpenShift Container Platform 中的集成容器 registry 替换为 Red Hat Quay registry。这样一来,您的集成 OpenShift Container Platform registry 成为具有高可用性的、企业级 Red Hat Quay registry,并增强了基于角色的访问控制(RBAC)功能。

Quay Bridge Operator 的主要目标是在新的 Red Hat Quay registry 中复制集成的 OpenShift Container Platform registry 的功能。Quay Bridge Operator 启用的功能包括:

  • 将 OpenShift Container Platform 命名空间作为 Red Hat Quay 组织同步。
  • 为每个 default 命名空间服务帐户创建机器人帐户。
  • 为每个创建的机器人帐户创建 secret,并将每个机器人 secret 与可挂载和镜像 Pull Secret 的服务帐户关联。
  • 将 OpenShift Container Platform 镜像流作为 Red Hat Quay 存储库同步。
  • 自动重写新的构建,使用镜像流来输出到 Red Hat Quay。
  • 构建完成后自动导入镜像流标签。

通过使用以下步骤,您将启用 Red Hat Quay 和 OpenShift Container Platform 集群之间的双向通信。

9.1. 为 Quay Bridge Operator 设置 Red Hat Quay

在此过程中,您将创建一个专用的 Red Hat Quay 组织,并从该机构中创建的新应用程序中生成 OAuth 令牌,以用于 OpenShift Container Platform 中的 Quay Bridge Operator。

流程

  1. 通过 Web UI 登录 Red Hat Quay。
  2. 选择配置外部应用程序的组织。
  3. 在导航窗格中,选择 Applications
  4. 选择 Create New Application 并输入新应用程序的名称,如 openshift
  5. OAuth Applications 页面中,选择您的应用程序,如 openshift
  6. 在导航窗格中,选择 Generate Token
  7. 选择以下字段:

    • 管理机构
    • 管理软件仓库
    • 创建软件仓库
    • 查看所有可见的软件仓库
    • 对任何可访问的存储库进行读/写
    • 管理用户
    • 读取用户信息
  8. 检查分配的权限。
  9. 选择 Authorize Application,然后选择 Authorize Application 来确认授权。
  10. 保存生成的访问令牌。

    重要

    从 Red Hat Quay 3.7 开始,没有令牌管理。您无法列出令牌、删除令牌或修改令牌。生成的访问令牌仅显示一次,在关闭页面后无法重新获取。

9.2. 在 OpenShift Container Platform 上安装 Quay Bridge Operator

在此过程中,您将在 OpenShift Container Platform 上安装 Quay Bridge Operator。

先决条件

  • 您已设置 Red Hat Quay 并获取了一个 Access Token。
  • 具有集群管理员权限的 OpenShift Container Platform 4.6 或更高版本的环境。

流程

  1. 打开 Web 控制台的 Administrator 视角,进入导航窗格中的 OperatorsOperatorHub
  2. 搜索 Quay Bridge Operator,点 Quay Bridge Operator 标题,然后点 Install
  3. 选择要安装的版本,如 stable-3.7,然后单击 Install
  4. 安装完成后,点 View Operator 进入 Quay Bridge Operator 的 Details 页面。另外,您还可以点 Installed OperatorsRed Hat Quay Bridge Operator 进入 Details 页面。

9.3. 为 OAuth 令牌创建 OpenShift Container Platform secret

在此过程中,您将添加之前获取的访问令牌,以便与您的 Red Hat Quay 部署通信。访问令牌将作为 secret 存储在 OpenShift Container Platform 中。

前提条件

  • 您已设置 Red Hat Quay 并获取了访问令牌。
  • 您已在 OpenShift Container Platform 上部署了 Quay Bridge Operator。
  • 具有集群管理员权限的 OpenShift Container Platform 4.6 或更高版本的环境。
  • 已安装 OpenShift CLI(oc)。

流程

  • openshift-operators 命名空间中创建一个包含访问令牌的 secret:

    $ oc create secret -n openshift-operators generic <secret-name> --from-literal=token=<access_token>

9.4. 创建 QuayIntegration 自定义资源

在此过程中,您将创建一个 QuayIntegration 自定义资源,这些资源可以从 Web 控制台或命令行完成。

前提条件

  • 您已设置 Red Hat Quay 并获取了访问令牌。
  • 您已在 OpenShift Container Platform 上部署了 Quay Bridge Operator。
  • 具有集群管理员权限的 OpenShift Container Platform 4.6 或更高版本的环境。
  • 可选: 已安装 OpenShift CLI (oc)。

9.4.1. 可选:使用 CLI 创建 QuayIntegration 自定义资源

按照以下步骤使用命令行创建 QuayIntegration 自定义资源。

流程

  1. 创建 quay-integration.yaml

    $ touch quay-integration.yaml
  2. 将以下配置用于 QuayIntegration 自定义资源的最小部署:

      apiVersion: quay.redhat.com/v1
      kind: QuayIntegration
      metadata:
        name: example-quayintegration
      spec:
        clusterID: openshift  1
        credentialsSecret:
          namespace: openshift-operators
          name: quay-integration2
        quayHostname: https://<QUAY_URL>   3
        insecureRegistry: false 4
    1 1
    clusterID 值应该在整个生态系统中是唯一的。这个值是必需的,默认为 openshift
    2
    credentialsSecret 属性引用包含之前创建的令牌的 secret 的命名空间和名称。
    3
    QUAY_URL 替换为 Red Hat Quay 实例的主机名。
    4
    如果 Red Hat Quay 使用自签名证书,请将该属性设置为 insecureRegistry: true

    有关所有配置字段的列表,请参阅"QuayIntegration 配置字段"。

  3. 创建 QuayIntegration 自定义资源:

    $ oc create -f quay-integration.yaml

9.4.2. 可选:使用 Web 控制台创建 QuayIntegration 自定义资源

按照以下步骤,使用 Web 控制台创建 QuayIntegration 自定义资源。

流程

  1. 打开 Web 控制台的 Administrator 视角,进入 OperatorsInstalled Operators
  2. Red Hat Quay Bridge Operator
  3. 在 Quay Bridge Operator 的 Details 页面中,点 Quay Integration API 卡上的 Create Instance
  4. Create QuayIntegration 页面上,在 Form viewYAML view 中输入以下信息:

    • Name :引用 QuayIntegration 自定义资源对象的名称。
    • 集群 ID :与此集群关联的 ID。该值应该在整个生态系统中独一无二。如果未指定,则默认为 openshift
    • 凭证 secret :请参阅包含之前创建的令牌的 secret 的命名空间和名称。
    • Quay 主机名 :Quay registry 的主机名。

      有关所有配置字段的列表,请参阅"QuayIntegration 配置字段"。

创建 QuayIntegration 自定义资源后,您的 OpenShift Container Platform 集群将链接到您的 Red Hat Quay 实例。应该为 OpenShift Container Platform 环境的相关命名空间创建 Red Hat Quay registry 中的机构。

9.5. QuayIntegration 配置字段

QuayIntegration 自定义资源提供以下配置字段:

名称描述模式

allowlistNamespaces
(可选)

要包括的命名空间列表。

数组

clusterID
(必需)

与此集群关联的 ID。

字符串

credentialsSecret.key
(Required)

包含与 Quay 注册表通信的凭据的机密。

对象

denylistNamespaces
(可选)

要排除的命名空间列表。

数组

insecureRegistry
(Optional)

是否将 TLS 验证跳过到 Quay registry

布尔值

quayHostname
(必需)

Quay registry 的主机名。

字符串

scheduledImageStreamImport
(Optional)

是否启用镜像流导入。

布尔值

第 10 章 存储库镜像

10.1. 存储库镜像

Red Hat Quay 存储库镜像允许您将外部容器 registry (或其他本地 registry)镜像到 Red Hat Quay 集群中。使用存储库镜像功能,您可以根据存储库名称和标签将镜像同步到 Red Hat Quay。

在启用了存储库镜像的 Red Hat Quay 集群中,您可以:

  • 从外部 registry 中选择要镜像的存储库
  • 添加凭证以访问外部 registry
  • 识别要同步的特定容器镜像仓库名称和标签
  • 设置存储库同步的间隔
  • 检查同步的当前状态

要使用镜像功能,您需要:

  • 在 Red Hat Quay 配置中启用存储库镜像
  • 运行存储库镜像 worker
  • 创建已镜像的软件仓库

所有存储库镜像配置都可使用配置工具 UI 或 Red Hat Quay API 执行

10.2. 仓库镜像与 geo-replication

Red Hat Quay geo-replication 镜像 2 个或更多不同的存储后端之间的整个镜像存储后端数据,而数据库共享(一个带有两个不同的 blob 存储端点的 Red Hat Quay registry)。geo-replication 的主要用例包括:

  • 为地理位置分散设置加快对二进制 blob 的访问
  • 确保镜像内容在区域间相同

存储库镜像将所选存储库(或存储库的子集)从一个注册表同步到另一个存储库。registry 有所不同,每个 registry 都有单独的数据库和单独的镜像存储。镜像的主要用例是:

  • 不同数据中心或区域内的独立注册表部署,整个内容的某些子集应该跨数据中心/区域共享
  • 自动同步或镜像(whitelisted)上游存储库从外部注册表到本地 Red Hat Quay 部署
注意

可以同时使用存储库镜像和异地复制。

表 10.1. Red Hat Quay Repository mirror 与 geo-replication

功能/功能geo-replication存储库镜像

该功能旨在做什么?

共享的、全局 registry

不同的,不同的 registry

如果复制或镜像尚未完成,会发生什么情况?

使用远程副本(下半)

没有提供镜像

是否需要访问两个区域中的所有存储后端吗?

是(所有 Red Hat Quay 节点)

无(无效的存储)

用户能否将镜像从两个站点推送到同一存储库?

是所有 registry 内容,且在所有区域(共享数据库)之间是相同的配置。

用户可以选择要镜像的独立命名空间或存储库?

用户是否可以将过滤器应用到同步规则?

是每个区域允许的独立/不同的 RBAC 配置

10.3. 使用存储库镜像

以下是 Red Hat Quay 存储库镜像的一些功能和限制:

  • 使用存储库镜像,您可以镜像整个存储库或有选择性限制同步的镜像。过滤器可以基于以逗号分隔的标签列表、一系列标签,或者通过正则表达式来识别标签的其他方式。
  • 存储库设置为镜像后,将无法手动将其他镜像添加到该存储库。
  • 由于已镜像的存储库和标签基于您设置的存储库和标签,它只会包含存储库 / tag 对代表的内容。换句话说,如果您更改标签以使存储库中的一些镜像不再匹配,则这些镜像将被删除。
  • 只有指定人可以将镜像推送到已镜像的存储库,从而取代存储库上设置的任何基于角色的访问控制权限。
  • 使用已镜像的存储库,用户可以从存储库拉取镜像(授予读取权限),但不能将镜像推送到存储库。
  • 使用您创建的已镜像存储库的 Repositories → Mirrors 选项卡,可在 Red Hat Quay UI 中更改您镜像的存储库的设置。
  • 镜像在设定的时间间隔时同步,也可以根据需要同步。

10.4. 镜像配置 UI

  1. 以配置模式启动 Quay 容器,再选择 Enable Repository mirror 复选框。如果您要在镜像过程中需要 HTTPS 通信并验证证书,请选择 HTTPS 和证书验证复选框。

    Enable mirroring and require HTTPS and verified certificates

  2. 验证并下载 配置文件,然后使用更新的 配置文件在 registry 模式中重启 Quay。

10.5. 镜像配置字段

表 10.2. 镜像配置

字段类型Description

FEATURE_REPO_MIRROR

布尔值

启用或禁用存储库镜像

Default: false

REPO_MIRROR_INTERVAL

Number

检查存储库镜像候选者之间的秒数

Default: 30

REPO_MIRROR_SERVER_HOSTNAME

字符串

替换 SERVER_HOSTNAME 作为镜像的目的地。

默认值: None

示例:
openshift-quay-service

REPO_MIRROR_TLS_VERIFY

布尔值

在镜像过程中需要 HTTPS 并验证 Quay registry 的证书。

默认: false

REPO_MIRROR_ROLLBACK

布尔值

当设置为 true 时,存储库在镜像尝试失败后回滚。

默认false

10.6. 镜像 worker

使用以下步骤启动存储库镜像 worker。

流程

  • 如果您还没有使用 /root/ca.crt 证书配置 TLS 通信,请输入以下命令来使用 repomirror 选项启动 Quay pod:

    $ sudo podman run -d --name mirroring-worker \
      -v $QUAY/config:/conf/stack:Z \
      {productrepo}/{quayimage}:{productminv} repomirror
  • 如果您使用 /root/ca.crt 证书配置了 TLS 通信,请输入以下命令启动存储库镜像 worker:

    $ sudo podman run -d --name mirroring-worker \
      -v $QUAY/config:/conf/stack:Z \
      -v /root/ca.crt:/etc/pki/ca-trust/source/anchors/ca.crt:Z \
      {productrepo}/{quayimage}:{productminv} repomirror

10.7. 创建已镜像的存储库

本节所示的步骤假设您已在 Red Hat Quay 集群的配置中启用了存储库镜像,并且您已部署了镜像 worker。

从外部容器注册表镜像存储库时,请创建新的私有存储库。通常的名称与目标存储库相同,如 quay-rhel8

Create new Red Hat Quay repo

10.7.1. 存储库镜像设置

  1. 在 Settings 选项卡中,将 Repository State 设置为 Mirror

    Create a new Red Hat Quay repo mirror

  2. 在 Mirror 选项卡中,输入连接到外部 registry 的详情,以及标签、调度和访问信息:

    Repository mirroring

  3. 在以下字段中输入所需详情:

    • registry Location: 您要镜像的外部存储库,如 registry.redhat.io/quay/quay-rhel8
    • tags: 此字段是必需的。您可以输入以逗号分隔的单个标签或标签模式列表。(请参阅 标签模式 部分了解详细信息。)
    • 开始日期: 镜像开始的日期。默认使用当前的日期和时间。
    • 同步间隔: 默认每隔 24 小时同步一次。您可以按小时或天更改它。
    • 机器人用户: 创建新的机器人帐户或选择一个现有的机器人帐户来开展镜像。
    • Username: 用于访问包含您要镜像存储库的外部 registry 的用户名。
    • Password: 与 Username 关联的密码。请注意,密码不能包含需要转义字符(\)的字符。

10.7.2. 高级设置

  • 在 Advanced Settings 部分中,根据需要配置 TLS 和代理:
  • 验证 TLS: 如果需要 HTTPS,并在与目标远程 registry 通信时验证证书,请选中此复选框。
  • HTTP Proxy: 识别访问远程站点所需的 HTTP 代理服务器(如果需要)。
  • HTTPS Proxy: 识别访问远程站点所需的 HTTPS 代理服务器(如果需要)。
  • no Proxy: 不需要代理的位置列表

10.7.3. 现在同步

  • 要执行即时镜像操作,请按存储库镜像选项卡上的 Sync Now 按钮。日志位于 Usage Logs 选项卡上:

    Usage logs

    镜像完成后,镜像将显示在 Tags 选项卡中:

    Repository mirroring tags

    以下是完成的存储库镜像屏幕的示例:

    Repository mirroring details

10.8. 镜像的事件通知

存储库镜像有三个通知事件:

  • 存储库 Mirror 已启动
  • 仓库镜像成功
  • 仓库 Mirror Unsuccessful

可以在每个存储库的 Settings 选项卡中配置事件,以及所有现有的通知方法,如电子邮件、slack、Quay UI 和 webhook。

10.9. 镜像标签模式

必须至少输入一个标签。下表引用了可能的镜像标签模式。

10.9.1. 模式语法

pattern

Description

*

匹配所有字符

?

匹配任何单个字符

[seq]

匹配 seq中的任何字符

[!seq]

匹配不属于 seq的任何字符

10.9.2. 标签模式示例

Pattern 示例

匹配示例

v3*

v32, v3.1, v3.2, v3.2-4beta, v3.3

v3.*

v3.1, v3.2, v3.2-4beta

v3.?

v3.1, v3.2, v3.3

v3.[12]

v3.1, v3.2

v3.[12]*

v3.1, v3.2, v3.2-4beta

v3.[!1]*

v3.2, v3.2-4beta, v3.3

10.10. 使用已镜像存储库

创建了镜像存储库后,您可以使用以下几种方式与该存储库一起使用。从 Repositories 页面选择您的镜像存储库,并进行以下任意一项:

  • 启用/禁用存储库 :选择左列中的镜像按钮,然后切换 Enabled 复选框以临时启用或禁用存储库。
  • 检查镜像日志 :要确保已镜像的存储库正常工作,您可以检查镜像日志。为此,可在左列中选择 Usage Logs 按钮。例如:

    View logs for your Red Hat Quay repo mirror

  • 现在同步镜像 :要立即在存储库中同步镜像,请选择 Sync Now 按钮。
  • 更改凭证: 要更改用户名和密码,请从 Credentials 行中选择 DELETE。然后选择 None,然后在系统提示时,添加登录外部 registry 所需的用户名和密码。
  • 取消镜像 :若要停止镜像,它会保留当前镜像,但会停止同步新的镜像,请选择 CANCEL 按钮。
  • 设置机器人权限 :Red Hat Quay 机器人帐户的名称是令牌,用于存放用于访问外部存储库的凭据。通过将凭证分配给机器人,机器人可以在需要访问同一外部注册表的多个镜像仓库间使用。

    您可以通过转至帐户设置,然后选择左侧列中的 Robot Accounts 图标,为存储库分配现有机器人。对于机器人帐户,请选择 REPOSITORIES 列下的链接。在弹出窗口中,您可以:

    • 检查哪些存储库被分配到该机器人。
    • 从此图所示的 PERMISSION 字段中将读取、写入或管理特权分配到该机器: Assign a robot to mirrored repo
  • 更改机器凭证 :Robots 可以保存凭证,如 Kubernetes secret、Docker 登录信息和 Mesos 捆绑包。要更改机器凭证,请在 Robot Accounts 窗口上的机器帐户行中选择 Options gear,然后选择 View Credentials。为机器人需要访问的外部存储库添加适当的凭据。

    Assign permission to a robot

  • 选中并更改常规设置 :在已镜像存储库页面中的左侧列中选择 Settings 按钮(gear 图标)。在生成的页面中,您可以更改与已镜像存储库关联的设置。特别是,您可以更改 User 和 Robot Permissions,以指定哪些用户和机器人可从仓库读取或写入到存储库。

10.11. 存储库镜像建议

存储库镜像的最佳实践包括:

  • 存储库镜像 pod 可以在任何节点上运行。这意味着,即使在 Red Hat Quay 已在运行的节点上也可以运行镜像功能。
  • 存储库镜像在数据库中调度,并批量运行。因此,更多的工作程序应该意味着更快的镜像,因为处理更多批处理。
  • 镜像 pod 的最佳数量取决于:

    • 要镜像的存储库总数
    • 存储库中镜像和标签的数量以及更改频率
    • 并行批处理
  • 您应该在所有已镜像存储库间平衡镜像调度,以便它们不会同时启动。
  • 对于一个中型部署,有大约 1000 个用户和 1000 个存储库,且大约 100 个已镜像仓库,您希望使用 3-5 镜像 pod,根据需要最多扩展 10 个 pod。

第 11 章 IPv6 和双栈部署

现在,您的独立 Red Hat Quay 部署可以在只支持 IPv6 的位置(如 Telco 和 Edge 环境)提供。另外,还支持双栈网络,以便您的 Red Hat Quay 部署可以同时侦听 IPv4 和 IPv6。

有关已知限制列表,请参阅 IPv6 限制

11.1. 启用 IPv6 协议系列

使用以下步骤在独立 Red Hat Quay 部署中启用 IPv6 支持。

前提条件

  • 您已将 Red Hat Quay 更新至 3.8。
  • 您的主机和容器软件平台(Docker、Podman)必须配置为支持 IPv6。

流程

  1. 在部署的 config.yaml 文件中,添加 FEATURE_LISTEN_IP_VERSION 参数,并将它设置为 IPv6,例如:

    ---
    FEATURE_GOOGLE_LOGIN: false
    FEATURE_INVITE_ONLY_USER_CREATION: false
    FEATURE_LISTEN_IP_VERSION: IPv6
    FEATURE_MAILING: false
    FEATURE_NONSUPERUSER_TEAM_SYNCING_SETUP: false
    ---
  2. 启动或重启您的 Red Hat Quay 部署。
  3. 输入以下命令检查您的部署是否在侦听 IPv6:

    $ curl <quay_endpoint>/health/instance
    {"data":{"services":{"auth":true,"database":true,"disk_space":true,"registry_gunicorn":true,"service_key":true,"web_gunicorn":true}},"status_code":200}

在部署的 config.yaml 中启用 IPv6 后,所有 Red Hat Quay 功能都可以正常使用,只要您的环境配置为使用 IPv6,且不会受到 ipv6-limitations[current 的限制] 的限制。

警告

如果您的环境配置为 IPv4,但 FEATURE_LISTEN_IP_VERSION 配置字段被设置为 IPv6,Red Hat Quay 将无法部署。

11.2. 启用双栈协议系列

使用以下步骤在独立 Red Hat Quay 部署中启用双栈(IPv4 和 IPv6)支持。

前提条件

  • 您已将 Red Hat Quay 更新至 3.8。
  • 您的主机和容器软件平台(Docker、Podman)必须配置为支持 IPv6。

流程

  1. 在部署的 config.yaml 文件中,添加 FEATURE_LISTEN_IP_VERSION 参数,并将它设置为 双栈,例如:

    ---
    FEATURE_GOOGLE_LOGIN: false
    FEATURE_INVITE_ONLY_USER_CREATION: false
    FEATURE_LISTEN_IP_VERSION: dual-stack
    FEATURE_MAILING: false
    FEATURE_NONSUPERUSER_TEAM_SYNCING_SETUP: false
    ---
  2. 启动或重启您的 Red Hat Quay 部署。
  3. 输入以下命令检查您的部署是否在侦听这两个频道:

    1. 对于 IPv4,输入以下命令:

      $ curl --ipv4 <quay_endpoint>
      {"data":{"services":{"auth":true,"database":true,"disk_space":true,"registry_gunicorn":true,"service_key":true,"web_gunicorn":true}},"status_code":200}
    2. 对于 IPv6,输入以下命令:

      $ curl --ipv6 <quay_endpoint>
      {"data":{"services":{"auth":true,"database":true,"disk_space":true,"registry_gunicorn":true,"service_key":true,"web_gunicorn":true}},"status_code":200}

在部署的 config.yaml 中启用双栈后,所有 Red Hat Quay 功能都可以正常使用,只要您的环境针对双栈配置。

11.3. IPv6 和 dua-stack 限制

  • 目前,尝试使用通用的 Azure Blob Storage 配置 Red Hat Quay 部署将无法正常工作在 IPv6 单一堆栈环境中。因为 Azure Blob Storage 的端点不支持 IPv6,所以这个问题没有临时解决方案。

    如需更多信息,请参阅 PROJQUAY-4433

  • 目前,尝试使用 Amazon S3 CloudFront 配置 Red Hat Quay 部署将不能在 IPv6 单一堆栈环境中工作。因为 Amazon S3 CloudFront 的端点不支持 IPv6,因此这个问题没有临时解决方案。

    如需更多信息,请参阅 PROJQUAY-4470

  • 目前,当 Red Hat Quay 部署在 IPv6 单一堆栈环境中时,OpenShift Data Foundation (ODF)不被支持。因此,在 IPv6 环境中无法使用 ODF。此限制计划在以后的 OpenShift Data Foundation 版本中解决。

第 12 章 Red Hat Quay 的 LDAP 身份验证设置

轻量级目录访问协议(LDAP)是一个开放的、厂商中立、行业标准应用程序协议,用于通过互联网协议(IP)网络访问和维护分布式目录信息服务。Red Hat Quay 支持使用 LDAP 作为身份提供程序。

12.1. 启用 LDAP 前的注意事项

12.1.1. 现有 Quay 部署

当为已经配置的用户的现有 Quay 部署启用 LDAP 时,可能会出现用户名之间的冲突。考虑在启用 LDAP 之前在 Quay 中手动创建特定用户 alice 的场景。如果用户名 alice 也存在于 LDAP 目录中,则当 alice 使用 LDAP 登录时,Quay 将创建一个新用户 alice-1,并将 LDAP 凭据映射到此帐户。出于一致性的原因,这可能不是您需要的,建议您在启用 LDAP 前从 Quay 中删除任何有冲突的本地帐户名称。

12.1.2. 手动用户创建和 LDAP 身份验证

为 LDAP 配置 Quay 后,在第一次登录时在 Quay 的数据库中自动创建 LDAP-authenticated 用户(如果配置选项 FEATURE_USER_CREATION 设置为 true )。如果此选项被设置为 false,则 LDAP 用户的自动用户创建将失败,且不允许用户登录。在这种情况下,超级用户需要首先创建所需的用户帐户。相反,如果 FEATURE_USER_CREATION 设置为 true,这也意味着用户仍然可以从 Quay 登录屏幕中创建帐户,即使 LDAP 中具有同等的用户。

12.2. 设置 LDAP 配置

在配置工具中,找到 Authentication 部分,再从下拉菜单中选择"LDAP"。根据需要更新 LDAP 配置字段。

Fill in LDAP information

  • 以下是 config.yaml 文件中生成的条目的示例:
AUTHENTICATION_TYPE: LDAP

12.2.1. 完整的 LDAP URI

LDAP server URI LDAP server SSL

  • 完整的 LDAP URI,包括 ldap://ldaps:// 前缀。
  • ldaps:// 开头的 URI 将使用提供的 SSL 证书进行 TLS 设置。
  • 以下是 config.yaml 文件中生成的条目的示例:
LDAP_URI: ldaps://ldap.example.org

12.2.2. 团队同步

Team synchronization

  • 如果启用,则超级用户也可以将团队设置为与 LDAP 中后备组同步其成员资格的机构管理员。

Team synchronization

  • resynchronization 持续时间是必须重新同步团队的持续时间。必须以持续时间字符串形式表示:30m、1h、1d。
  • (可选)允许非超级用户在管理员的机构下启用和管理团队同步。
  • 以下是 config.yaml 文件中生成的条目的示例:
FEATURE_TEAM_SYNCING: true
TEAM_RESYNC_STALE_TIME: 60m
FEATURE_NONSUPERUSER_TEAM_SYNCING_SETUP: true

12.2.3. 基本名称及名称

Distinguished Names

  • 一个可辨识的名称路径,用于构成查找所有 LDAP 记录的基本路径。示例: dc=my,dc=domain,dc=com
  • 可选的可辨识名称路径列表,它组成了从属基础路径,用于查找所有用户 LDAP 记录(相对于以上定义的基本 DN)。如果没有通过主相对 DN 获得用户,则会尝试这些路径。
  • 用户相对 DN 相对于 BaseDN。示例: ou=NYC not ou=NYC,dc=example,dc=org
  • 如果存在多个机构单元所在的机构单元,则可以输入多个"第二个用户关系 DN"。只需在组织单位输入,然后单击添加按钮来添加多个 RDN。示例: ou=Users,ou=NYC 和 ou=Users,ou=SFO
  • "用户关系 DN"搜索子树范围。例如,如果您的机构在用户 OU 下具有机构单元 NYC 和 SFO (ou=SFO,ou=Users 和 ou=NYC, ou=NYC,ou=Users),Red Hat Quay 可以在 NYCSFO Organizational units 下验证用户(用户 Relative DN 为 Users (ou=Users))。
  • 以下是 config.yaml 文件中生成的条目的示例:
LDAP_BASE_DN:
- dc=example
- dc=com
LDAP_USER_RDN:
- ou=users
LDAP_SECONDARY_USER_RDNS:
- ou=bots
- ou=external

12.2.4. 其他用户过滤器

User filters

  • 如果指定,用于所有用户查找查询的附加过滤器。请注意,过滤器中使用的所有可辨识名称都必须是 完整路径 ;此处不自动添加基本 DN。必须以 准备的方式进行嵌套。示例:(& (someFirstField=someValue) (someOtherField=someOtherValue)
  • 以下是 config.yaml 文件中生成的条目的示例:
LDAP_USER_FILTER: (memberof=cn=developers,ou=groups,dc=example,dc=com)

12.2.4.1. 启用 LDAP_RESTRICTED_USER_FILTER 配置字段

LDAP_RESTRICTED_USER_FILTER 配置字段是 LDAP_USER_FILTER 配置字段的子集。配置后,Red Hat Quay 管理员能够在 Red Hat Quay 使用 LDAP 作为其身份验证提供程序时,将轻量级目录访问协议(LDAP)用户配置为受限用户。

使用以下步骤在 Red Hat Quay 部署中启用 LDAP 受限用户。

前提条件

  • 您的 Red Hat Quay 部署使用 LDAP 作为其身份验证供应商。
  • 您已在 config.yaml 文件中配置了 LDAP_USER_FILTER 字段。

流程

  1. 在部署的 config.yaml 文件中,添加 LDAP_RESTRICTED_USER_FILTER 参数并指定受限用户组,例如:

    ---
    AUTHENTICATION_TYPE: LDAP
    ---
    LDAP_ADMIN_DN: uid=<name>,ou=Users,o=<organization_id>,dc=<example_domain_component>,dc=com
    LDAP_ADMIN_PASSWD: ABC123
    LDAP_ALLOW_INSECURE_FALLBACK: false
    LDAP_BASE_DN:
        - o=<organization_id>
        - dc=<example_domain_component>
        - dc=com
    LDAP_EMAIL_ATTR: mail
    LDAP_UID_ATTR: uid
    LDAP_URI: ldap://<example_url>.com
    LDAP_USER_FILTER: (memberof=cn=developers,ou=Users,o=<example_organization_unit>,dc=<example_domain_component>,dc=com)
    LDAP_RESTRICTED_USER_FILTER: (<filterField>=<value>)
    LDAP_USER_RDN:
        - ou=<example_organization_unit>
        - o=<organization_id>
        - dc=<example_domain_component>
        - dc=com
  2. 启动或重启您的 Red Hat Quay 部署。

启用 LDAP_RESTRICTED_USER_FILTER 功能后,您的 LDAP Red Hat Quay 用户会被限制在读取和写入内容并创建机构。

12.2.5. 管理员 DN

Administrator DN

  • 管理员帐户的可辨识名称和密码。这个帐户必须能够登录并查看所有用户帐户的记录。Example: uid=admin,ou=employees,dc=my,dc=domain,dc=com
  • 密码存储在 config.yaml 中的 明文 中,因此强烈建议设置专用帐户或使用密码哈希。
  • 以下是 config.yaml 文件中生成的条目的示例:
LDAP_ADMIN_DN: cn=admin,dc=example,dc=com
LDAP_ADMIN_PASSWD: changeme

12.2.6. UID 和邮件属性

UID and Mail

  • UID 属性是 LDAP 用户记录中要用作 用户名 的 property 字段的名称。通常"uid"。
  • Mail 属性是 LDAP 用户记录中存储用户电子邮件地址(s)中的 property 字段的名称。通常"邮件"。
  • 在登录时可以使用其中任何一个。
  • 登录用户名必须存在于用户相对 DN 中。
  • sAMAccountName 是 Microsoft Active Directory 设置的 UID 属性。
  • 以下是 config.yaml 文件中生成的条目的示例:
LDAP_UID_ATTR: uid
LDAP_EMAIL_ATTR: mail

12.2.7. 验证

完成配置后,单击"保存配置更改"按钮以验证配置。

Fill in LDAP information

所有验证必须在继续之前成功,或者可以通过选择"继续编辑"按钮来执行其他配置。

12.3. 常见问题

无效的凭证

管理员 DN 或 Administrator DN 密码值不正确

对超级用户 %USERNAME% 失败进行验证:Username not found not found The user not exist in the remote authentication system or LDAP auth is errors.

Red Hat Quay 可以通过 Administrator DN 字段中指定的 Username/Password 连接到 LDAP 服务器,但无法在用户 Relative DN 路径中找到具有 UID Attribute 或 Mail Attribute 字段的当前登录属性字段。User Relative DN 路径中不存在当前登录的用户,或者管理员 DN 用户没有搜索/读取此 LDAP 路径的权限。

12.4. 以超级用户身份配置 LDAP 用户

配置 LDAP 后,您可以使用有效的 LDAP 用户名和密码登录 Red Hat Quay 实例。系统将提示您确认您的 Red Hat Quay 用户名,如下图所示:

Confirm LDAP username for Red Hat Quay

要为 LDAP 用户附加超级用户权限,请使用用户名修改 config.yaml 文件。例如:

SUPER_USERS:
- testadmin

使用更新的 config.yaml 文件重启 Red Hat Quay 容器。下次登录时,用户将具有超级用户权限。

12.5. 启用 LDAP_SUPERUSER_FILTER 配置字段

配置 LDAP_SUPERUSER_FILTER 字段后,Red Hat Quay 管理员可以将轻量级目录访问协议(LDAP)用户配置为超级用户(如果 Red Hat Quay 使用 LDAP 作为其身份验证提供程序)。

使用以下步骤在 Red Hat Quay 部署中启用 LDAP 超级用户。

前提条件

  • 您的 Red Hat Quay 部署使用 LDAP 作为其身份验证供应商。
  • 您已在 config.yaml 文件中配置了 LDAP_USER_FILTER 字段。

流程

  1. 在部署的 config.yaml 文件中,添加 LDAP_SUPERUSER_FILTER 参数并添加您要配置为超级用户的用户组,例如 root

    ---
    AUTHENTICATION_TYPE: LDAP
    ---
    LDAP_ADMIN_DN: uid=<name>,ou=Users,o=<organization_id>,dc=<example_domain_component>,dc=com
    LDAP_ADMIN_PASSWD: ABC123
    LDAP_ALLOW_INSECURE_FALLBACK: false
    LDAP_BASE_DN:
        - o=<organization_id>
        - dc=<example_domain_component>
        - dc=com
    LDAP_EMAIL_ATTR: mail
    LDAP_UID_ATTR: uid
    LDAP_URI: ldap://<example_url>.com
    LDAP_USER_FILTER: (memberof=cn=developers,ou=Users,o=<example_organization_unit>,dc=<example_domain_component>,dc=com)
    LDAP_SUPERUSER_FILTER: (<filterField>=<value>)
    LDAP_USER_RDN:
        - ou=<example_organization_unit>
        - o=<organization_id>
        - dc=<example_domain_component>
        - dc=com
  2. 启动或重启您的 Red Hat Quay 部署。

启用 LDAP_SUPERUSER_FILTER 功能后,您的 LDAP Red Hat Quay 用户具有超级用户权限。超级用户可使用以下选项:

  • 管理用户
  • 管理机构
  • 管理服务密钥
  • 查看更改日志
  • 查询用量日志
  • 创建全局可见的用户信息

第 13 章 Red Hat Quay 下的 Prometheus 和 Grafana 指标

Red Hat Quay 会导出每个实例上的 Prometheus- 和 Grafana 兼容的端点,以方便监控和警报。

13.1. 公开 Prometheus 端点

13.1.1. Standalone Red Hat Quay

使用 podman run 启动 Quay 容器时,公开指标端口 9091

$ sudo podman run -d --rm -p 80:8080 -p 443:8443  -p 9091:9091\
   --name=quay \
   -v $QUAY/config:/conf/stack:Z \
   -v $QUAY/storage:/datastorage:Z \
   registry.redhat.io/quay/quay-rhel8:v3.8.0

现在,指标将可用:

$ curl quay.example.com:9091/metrics

如需了解配置 Prometheus 和 Grafana 的详细信息,请参阅 使用 Prometheus 和 Grafana 监控 Quay 存储库计数。

13.1.2. Red Hat Quay Operator

确定 quay-metrics 服务的集群 IP:

$ oc get services -n quay-enterprise
NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                             AGE
example-registry-clair-app            ClusterIP   172.30.61.161    <none>        80/TCP,8089/TCP                     18h
example-registry-clair-postgres       ClusterIP   172.30.122.136   <none>        5432/TCP                            18h
example-registry-quay-app             ClusterIP   172.30.72.79     <none>        443/TCP,80/TCP,8081/TCP,55443/TCP   18h
example-registry-quay-config-editor   ClusterIP   172.30.185.61    <none>        80/TCP                              18h
example-registry-quay-database        ClusterIP   172.30.114.192   <none>        5432/TCP                            18h
example-registry-quay-metrics         ClusterIP   172.30.37.76     <none>        9091/TCP                            18h
example-registry-quay-redis           ClusterIP   172.30.157.248   <none>        6379/TCP                            18h

连接到集群,并使用 quay-metrics 服务的集群 IP 和端口访问指标:

$ oc debug node/master-0

sh-4.4# curl 172.30.37.76:9091/metrics

# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 4.0447e-05
go_gc_duration_seconds{quantile="0.25"} 6.2203e-05
...

13.1.3. 将 Prometheus 设置为消耗指标

Prometheus 需要一种方式来访问集群中运行的所有 Red Hat Quay 实例。在典型的设置中,通过在一个命名 DNS 条目中列出所有 Red Hat Quay 实例来完成,然后提供给 Prometheus。

13.1.4. Kubernetes 下的 DNS 配置

可以将简单的 Kubernetes 服务配置为 提供 Prometheus 的 DNS 条目。

13.1.5. 手动集群的 DNS 配置

SkyDNS 是不使用 Kubernetes 时管理此 DNS 记录的简单解决方案。SkyDNS 可以在 etcd 集群上运行。可在 etcd 存储中添加并移除集群中每个 Red Hat Quay 实例的条目。SkyDNS 将定期从那里读取它们,并相应地更新 DNS 记录中的 Quay 实例列表。

13.2. 指标简介

Red Hat Quay 提供了相关的指标来帮助监控 registry,包括常规 registry 使用情况、上传、下载、垃圾回收和身份验证的指标。

13.2.1. 常规 registry 统计

常规 registry 统计可指示 registry 的增长量。

指标名称Description

quay_user_rows

数据库中的用户数

quay_robot_rows

数据库中机器人帐户的数量

quay_org_rows

数据库中的组织数

quay_repository_rows

数据库中的软件仓库数

quay_security_scanning_unscanned_images_remaining_total

最新安全扫描程序未扫描的镜像数

指标输出示例

# HELP quay_user_rows number of users in the database
# TYPE quay_user_rows gauge
quay_user_rows{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="65",process_name="globalpromstats.py"} 3

# HELP quay_robot_rows number of robot accounts in the database
# TYPE quay_robot_rows gauge
quay_robot_rows{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="65",process_name="globalpromstats.py"} 2

# HELP quay_org_rows number of organizations in the database
# TYPE quay_org_rows gauge
quay_org_rows{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="65",process_name="globalpromstats.py"} 2

# HELP quay_repository_rows number of repositories in the database
# TYPE quay_repository_rows gauge
quay_repository_rows{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="65",process_name="globalpromstats.py"} 4

# HELP quay_security_scanning_unscanned_images_remaining number of images that are not scanned by the latest security scanner
# TYPE quay_security_scanning_unscanned_images_remaining gauge
quay_security_scanning_unscanned_images_remaining{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 5

13.2.2. 队列项

队列项目 指标提供有关 Quay 用于管理工作的多个队列的信息。

指标名称Description

quay_queue_items_available

特定队列中的项数

quay_queue_items_locked

正在运行的项目数

quay_queue_items_available_unlocked

等待处理的项目数

指标标签

  • queue_name: 队列的名称。其中之一:

    • exportactionlogs: 用于导出操作日志的队列请求。然后,处理这些日志并将其放置在存储中。然后,通过电子邮件将链接发送到请求者。
    • namespacegc: Queued namespace to被垃圾回收
    • notification: 要发出的存储库通知的队列
    • repositorygc: Queued 软件仓库被垃圾回收
    • secscanv4: 特定于 Clair V4 的通知队列
    • dockerfilebuild: Quay docker 构建队列
    • imagestoragereplication: Queued blob 在多个存储间复制
    • chunk_cleanup: 需要删除的 Queued blob 片段。这仅供部分存储实施使用,如 Swift。

例如,队列标记的 repositorygc 包含由存储库垃圾回收 worker 标记为删除的存储库。对于带有 repositorygcqueue_name 标签的指标:

  • quay_queue_items_locked 是当前被删除的存储库数量。
  • quay_queue_items_available_unlocked 是 worker 处理的存储库数量。

指标输出示例

# HELP quay_queue_items_available number of queue items that have not expired
# TYPE quay_queue_items_available gauge
quay_queue_items_available{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="63",process_name="exportactionlogsworker.py",queue_name="exportactionlogs"} 0
...

# HELP quay_queue_items_available_unlocked number of queue items that have not expired and are not locked
# TYPE quay_queue_items_available_unlocked gauge
quay_queue_items_available_unlocked{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="63",process_name="exportactionlogsworker.py",queue_name="exportactionlogs"} 0
...

# HELP quay_queue_items_locked number of queue items that have been acquired
# TYPE quay_queue_items_locked gauge
quay_queue_items_locked{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="63",process_name="exportactionlogsworker.py",queue_name="exportactionlogs"} 0

13.2.3. 垃圾回收指标

这些指标显示已从垃圾回收(gc)中删除了多少资源。它们显示 gc worker 运行的次数,以及删除多少个命名空间、存储库和 Blob。

指标名称Description

quay_gc_iterations_total

GCWorker 的迭代数

quay_gc_namespaces_purged_total

NamespaceGCWorker 清除的命名空间数量

quay_gc_repos_purged_total

RepositoryGCWorker 或 NamespaceGCWorker 清除的存储库数量

quay_gc_storage_blobs_deleted_total

删除的存储 Blob 数量

指标输出示例

# TYPE quay_gc_iterations_created gauge
quay_gc_iterations_created{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 1.6317823190189714e+09
...

# HELP quay_gc_iterations_total number of iterations by the GCWorker
# TYPE quay_gc_iterations_total counter
quay_gc_iterations_total{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 0
...

# TYPE quay_gc_namespaces_purged_created gauge
quay_gc_namespaces_purged_created{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 1.6317823190189433e+09
...

# HELP quay_gc_namespaces_purged_total number of namespaces purged by the NamespaceGCWorker
# TYPE quay_gc_namespaces_purged_total counter
quay_gc_namespaces_purged_total{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 0
....

# TYPE quay_gc_repos_purged_created gauge
quay_gc_repos_purged_created{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 1.631782319018925e+09
...

# HELP quay_gc_repos_purged_total number of repositories purged by the RepositoryGCWorker or NamespaceGCWorker
# TYPE quay_gc_repos_purged_total counter
quay_gc_repos_purged_total{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 0
...

# TYPE quay_gc_storage_blobs_deleted_created gauge
quay_gc_storage_blobs_deleted_created{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 1.6317823190189059e+09
...

# HELP quay_gc_storage_blobs_deleted_total number of storage blobs deleted
# TYPE quay_gc_storage_blobs_deleted_total counter
quay_gc_storage_blobs_deleted_total{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 0
...

13.2.3.1. multipart 上传指标

multipart 上传指标显示 blob 上传到存储的数量(S3、Ragdos、GoogleCloudStorage、RHOCS)。当 Quay 无法正确将 Blob 上传到存储时,它们可以帮助识别问题。

指标名称Description

quay_multipart_uploads_started_total

将多部分上传到启动的 Quay 存储数

quay_multipart_uploads_completed_total

将多部分上传到完成的 Quay 存储数

指标输出示例

# TYPE quay_multipart_uploads_completed_created gauge
quay_multipart_uploads_completed_created{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 1.6317823308284895e+09
...

# HELP quay_multipart_uploads_completed_total number of multipart uploads to Quay storage that completed
# TYPE quay_multipart_uploads_completed_total counter
quay_multipart_uploads_completed_total{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 0

# TYPE quay_multipart_uploads_started_created gauge
quay_multipart_uploads_started_created{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 1.6317823308284352e+09
...

# HELP quay_multipart_uploads_started_total number of multipart uploads to Quay storage that started
# TYPE quay_multipart_uploads_started_total counter
quay_multipart_uploads_started_total{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 0
...

13.2.4. 镜像拉取/拉取指标

有多个指标可用于推送和拉取镜像。

13.2.4.1. 镜像拉取(pull)总数

指标名称Description

quay_registry_image_pulls_total

从 registry 中下载的镜像数量。

指标标签

  • 协议: 所用的 registry 协议(应该总是为 v2)
  • ref: 用于拉取 - 标签、清单的 ref
  • status: 请求的 http 返回代码

13.2.4.2. 拉取(pull)的镜像字节

指标名称Description

quay_registry_image_pulled_estimated_bytes_total

从 registry 下载的字节数

指标标签

  • 协议: 所用的 registry 协议(应该总是为 v2)

13.2.4.3. 镜像推送总数

指标名称Description

quay_registry_image_pushes_total

从 registry 上传的镜像数量。

指标标签

  • 协议: 所用的 registry 协议(应该总是为 v2)
  • pstatus: http 返回代码
  • pmedia_type: 上传的清单类型

13.2.4.4. 推送的镜像字节

指标名称Description

quay_registry_image_pushed_bytes_total

上传到 registry 的字节数

指标输出示例

# HELP quay_registry_image_pushed_bytes_total number of bytes pushed to the registry
# TYPE quay_registry_image_pushed_bytes_total counter
quay_registry_image_pushed_bytes_total{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="221",process_name="registry:application"} 0
...

13.2.5. 身份验证指标

身份验证指标提供身份验证请求数,根据类型进行标记,以及是否成功。例如,可以利用此指标来监控失败的基本身份验证请求。

指标名称Description

quay_authentication_attempts_total

registry 和 API 中的身份验证尝试数

指标标签

  • auth_kind: 使用的 auth 类型,包括:

    • 基本的
    • oauth
    • credentials
  • success: true 或 false

指标输出示例

# TYPE quay_authentication_attempts_created gauge
quay_authentication_attempts_created{auth_kind="basic",host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="221",process_name="registry:application",success="True"} 1.6317843039374158e+09
...

# HELP quay_authentication_attempts_total number of authentication attempts across the registry and API
# TYPE quay_authentication_attempts_total counter
quay_authentication_attempts_total{auth_kind="basic",host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="221",process_name="registry:application",success="True"} 2
...

第 14 章 Red Hat Quay 配额管理和强制

使用 Red Hat Quay 3.7 时,用户可以通过建立配置的存储配额限制来报告存储消耗并包含 registry 增长。现在,内部 Quay 用户已具备以下功能来管理其环境的容量限制:

  • 配额报告: 借助此功能,超级用户可以跟踪所有组织的存储消耗。另外,用户可以跟踪其分配机构的存储消耗。
  • 配额管理: 借助此功能,超级用户可以为 Red Hat Quay 用户定义软和硬检查。软检查告知用户是否机构的存储消耗达到其配置的阈值。硬检查可防止用户在存储消耗达到配置的限制时推送到 registry。

这些功能一起允许 Quay 注册表的服务所有者定义服务级别协议并支持健康的资源预算。

14.1. 配额管理配置

现在,FEATURE _QUOTA_MANAGEMENT 属性支持配额管理,并默认关闭。要启用配额管理,将 config.yaml 中的 feature 标志设置为 true

FEATURE_QUOTA_MANAGEMENT: true
注意

在 Red Hat Quay 3.7 中,需要超级用户权限才能创建、更新和删除配额。虽然可以为用户和机构设置配额,但您无法使用 Red Hat Quay UI 重新配置 用户配额,而您必须使用 API。

14.1.1. 默认配额

要指定应用于每个机构和用户的系统范围默认存储配额,请使用 DEFAULT_SYSTEM_REJECT_QUOTA_BYTES 配置标志。

表 14.1. 默认配额配置

字段类型Description

DEFAULT_SYSTEM_REJECT_QUOTA_BYTES

字符串

适用于所有机构和用户的配额大小。

默认情况下不设置任何限制。

如果您为机构或用户配置特定的配额,然后删除该配额,那么如果已设置了配额,则应用系统范围的默认配额。同样,如果您为机构或用户配置了特定的配额,然后修改系统范围的默认配额,更新的系统范围默认设置将覆盖任何特定的设置。

14.2. 配额管理架构

RepositorySize 数据库表包含组织中 Red Hat Quay 存储库的存储消耗(以字节为单位)。组织的所有存储库大小均定义了 Red Hat Quay 组织的当前存储大小。初始化镜像推送后,会验证用户的组织存储来检查是否超过配置的配额限值。如果镜像推送超过定义的配额限制,则会出现软或硬检查:

  • 对于软检查,将通知用户。
  • 对于硬检查,推送将停止。

如果在配置的配额限制内消耗存储,则允许推送继续进行。

镜像清单删除遵循类似的流,通过关联镜像标签和清单之间的链接会被删除。另外,在镜像清单被删除后,存储库大小会被重新计算并在 RepositorySize 表中更新。

14.3. 在 Red Hat Quay UI 中建立配额

以下流程描述了如何报告存储消耗并建立存储配额限制。

前提条件

  • Red Hat Quay registry。
  • 超级用户帐户。
  • 有足够的存储来满足配额限制的要求。

流程

  1. 创建新机构或选择一个机构。最初,没有配置配额,如 Organization Settings 选项卡上所示:

    No Quota Configured

  2. 以超级用户身份登录注册表,再导航到 Super User Admin Panel 上的 Manage Organizations 选项卡。点击您要为其创建存储配额限制的机构 Options 图标:

    Organization options

  3. 单击 Configure Quota 并输入初始配额,如 10 MB。然后点击" 应用 "和 "关闭"

    Initial quota

  4. 检查所消耗的配额是否在超级用户面板的 Manage Organizations 选项卡中显示 0 为 10 MB

    Initial consumed quota

    消耗的配额信息也可以在 Organization 页面中直接提供:

    初始消耗配额

    Initial consumed quota

  5. 若要将配额增加到 100MB,请导航到 superuser 面板上的 Manage Organizations 选项卡。单击 Options 图标并选择 Configure Quota,将配额设置为 100 MB。点击" 应用 ",然后选择 "关闭"

    Increase quota

  6. 使用命令行将示例镜像推送到机构:

    示例命令

    $ podman pull ubuntu:18.04
    
    $ podman tag docker.io/library/ubuntu:18.04 example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:18.04
    
    $ podman push --tls-verify=false example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:18.04

  7. 在超级用户面板中会显示每个机构消耗的配额:

    Total Quota Consumed for first image

  8. Organization 页面显示镜像使用的配额总数:

    第一个镜像消耗的配额总数

    Total Quota Consumed for first image

  9. 拉取、标记和推送第二个镜像,如 nginx

    示例命令

    $ podman pull nginx
    
    $ podman tag docker.io/library/nginx example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/nginx
    
    $ podman push --tls-verify=false example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/nginx

  10. Organization 页面显示该机构中每个存储库使用的配额总数:

    每个存储库消耗的配额总数

    Total Quota Consumed for each repository

  11. 创建 rejectwarning 限制:

    从 superuser 面板中,前往 Manage Organizations 选项卡。单击组织的 Options 图标,然后选择 Configure Quota。在 Quota Policy 部分中,Action type 设置为 Reject,将 Quota Threshold 设为 80,再单击 Add Limit:

    Reject limit

  12. 要创建 警告 限制,请选择 Warning 作为 Action 类型,将 Quota Threshold 设置为 70,再单击 Add Limit:

    Warning limit

  13. 在弹出配额上点 Close。限制可在 机构 页面的 Settings 标签页中查看,但不能编辑:

    Quota policy in organization settings

  14. 推送超过 reject 限值的镜像:

    因为 reject 限制(80%)已设置为低于当前存储库大小(~83%),因此下一个推送会自动被拒绝。

    镜像推送示例

    $ podman pull ubuntu:20.04
    
    $ podman tag docker.io/library/ubuntu:20.04 example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:20.04
    
    $ podman push --tls-verify=false example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:20.04

    配额超过时的输出示例

    Getting image source signatures
    Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
    Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
    Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
    WARN[0002] failed, retrying in 1s ... (1/3). Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace
    Getting image source signatures
    Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
    Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
    Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
    WARN[0005] failed, retrying in 1s ... (2/3). Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace
    Getting image source signatures
    Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
    Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
    Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
    WARN[0009] failed, retrying in 1s ... (3/3). Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace
    Getting image source signatures
    Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
    Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
    Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
    Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace

  15. 超过限制时,会在 UI 中显示通知:

    配额通知

    Quota notifications

14.4. 使用 Red Hat Quay API 建立配额

首次创建机构时,它不会应用配额。使用 /api/v1/organization/{organization}/quota 端点:

示例命令

$ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota  | jq

输出示例

[]

14.4.1. 设置配额

要为机构设置配额,将数据 POST 到 /api/v1/organization/{orgname}/quota endpoint: .Sample 命令

$ curl -k -X POST -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' -d '{"limit_bytes": 10485760}'  https://example-registry-quay-quay-enterprise.apps.docs.quayteam.org/api/v1/organization/testorg/quota | jq

输出示例

"Created"

14.4.2. 查看配额

要查看应用的配额,请参阅 /api/v1/organization/{orgname}/quota 端点中的 GET 数据:

示例命令

$ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota  | jq

输出示例

[
  {
    "id": 1,
    "limit_bytes": 10485760,
    "default_config": false,
    "limits": [],
    "default_config_exists": false
  }
]

14.4.3. 修改配额

要更改现有配额,在这个实例中从 10 MB 改为 100 MB,PUT 数据进入 /api/v1/organization/{orgname}/quota/{quota_id} 端点:

示例命令

$ curl -k -X PUT -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' -d '{"limit_bytes": 104857600}'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota/1 | jq

输出示例

{
  "id": 1,
  "limit_bytes": 104857600,
  "default_config": false,
  "limits": [],
  "default_config_exists": false
}

14.4.4. 推送镜像

要查看消耗的存储,将各种镜像推送到该组织。

14.4.4.1. 推送 ubuntu:18.04

从命令行将 ubuntu:18.04 推送到机构:

示例命令

$ podman pull ubuntu:18.04

$ podman tag docker.io/library/ubuntu:18.04 example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:18.04

$ podman push --tls-verify=false example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:18.04

14.4.4.2. 使用 API 查看配额用量

要查看消耗的存储,请从 /api/v1/repository 端点获取数据:

示例命令

$ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' 'https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/repository?last_modified=true&namespace=testorg&popularity=true&public=true&quota=true' | jq

输出示例

{
  "repositories": [
    {
      "namespace": "testorg",
      "name": "ubuntu",
      "description": null,
      "is_public": false,
      "kind": "image",
      "state": "NORMAL",
      "quota_report": {
        "quota_bytes": 27959066,
        "configured_quota": 104857600
      },
      "last_modified": 1651225630,
      "popularity": 0,
      "is_starred": false
    }
  ]
}

14.4.4.3. 推送另一个镜像

  1. 拉取、标记和推送第二个镜像,如 nginx

    示例命令

    $ podman pull nginx
    
    $ podman tag docker.io/library/nginx example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/nginx
    
    $ podman push --tls-verify=false example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/nginx

  2. 要查看机构中存储库的配额报告,请使用 /api/v1/repository 端点:

    示例命令

    $ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' 'https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/repository?last_modified=true&namespace=testorg&popularity=true&public=true&quota=true'

    输出示例

    {
      "repositories": [
        {
          "namespace": "testorg",
          "name": "ubuntu",
          "description": null,
          "is_public": false,
          "kind": "image",
          "state": "NORMAL",
          "quota_report": {
            "quota_bytes": 27959066,
            "configured_quota": 104857600
          },
          "last_modified": 1651225630,
          "popularity": 0,
          "is_starred": false
        },
        {
          "namespace": "testorg",
          "name": "nginx",
          "description": null,
          "is_public": false,
          "kind": "image",
          "state": "NORMAL",
          "quota_report": {
            "quota_bytes": 59231659,
            "configured_quota": 104857600
          },
          "last_modified": 1651229507,
          "popularity": 0,
          "is_starred": false
        }
      ]
    }

  3. 要在机构详情中查看配额信息,请使用 /api/v1/organization/{orgname} 端点:

    示例命令

    $ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' 'https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg' | jq

    输出示例

    {
      "name": "testorg",
      ...
      "quotas": [
        {
          "id": 1,
          "limit_bytes": 104857600,
          "limits": []
        }
      ],
      "quota_report": {
        "quota_bytes": 87190725,
        "configured_quota": 104857600
      }
    }

14.4.5. 使用配额限制拒绝推送

如果镜像推送超过定义的配额限制,则会出现软或硬检查:

  • 对于软检查或警告 请通知用户。
  • 对于硬检查 或拒绝,推送将被终止。

14.4.5.1. 设置 reject 和 warning 限制

要设置 rejectwarning 限制,将 POST 数据添加到 /api/v1/organization/{orgname}/quota/{quota_id}/limit 端点:

reject limit 命令示例

$ curl -k -X POST -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' -d '{"type":"Reject","threshold_percent":80}'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota/1/limit

警告限制命令示例

$ curl -k -X POST -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' -d '{"type":"Warning","threshold_percent":50}'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota/1/limit

14.4.5.2. 查看拒绝和警告限制

要查看 rejectwarning 限制,请使用 /api/v1/organization/{orgname}/quota 端点:

查看配额限制

$  curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota | jq

配额限制输出示例

[
  {
    "id": 1,
    "limit_bytes": 104857600,
    "default_config": false,
    "limits": [
      {
        "id": 2,
        "type": "Warning",
        "limit_percent": 50
      },
      {
        "id": 1,
        "type": "Reject",
        "limit_percent": 80
      }
    ],
    "default_config_exists": false
  }
]

14.4.5.3. 超过 reject 限制时推送镜像

在本例中,拒绝限制(80%)已设置为低于当前存储库大小(~83%),因此下一个推送应自动被拒绝。

使用命令行将示例镜像推送到机构:

镜像推送示例

$ podman pull ubuntu:20.04

$ podman tag docker.io/library/ubuntu:20.04 example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:20.04

$ podman push --tls-verify=false example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:20.04

配额超过时的输出示例

Getting image source signatures
Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
WARN[0002] failed, retrying in 1s ... (1/3). Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace
Getting image source signatures
Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
WARN[0005] failed, retrying in 1s ... (2/3). Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace
Getting image source signatures
Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
WARN[0009] failed, retrying in 1s ... (3/3). Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace
Getting image source signatures
Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace

14.4.5.4. 超过限制的通知

超过限制时,会出现通知:

配额通知

Quota notifications

14.5. 配额管理限制

配额管理有助于组织维护资源消耗。配额管理的一个限制是计算在推送上的资源消耗会导致计算成为推送关键路径的一部分。如果没有这种情况,使用数据可能会偏移。

最大存储配额大小取决于所选数据库:

表 14.2. worker 数环境变量

变量Description

Postgres

8388608 TB

MySQL

8388608 TB

SQL Server

16777216 TB

第 15 章 geo-replication

异地复制允许多个地理上分散的 Red Hat Quay 部署,从客户端或用户的角度充当一个 registry。它显著提高了推送,并在全局分布式 Red Hat Quay 设置中拉取性能。镜像数据在后台异步复制,客户端具有透明故障转移/重定向。

使用 Red Hat Quay 3.7 时,独立和 Operator 部署支持使用 geo-replication 部署 Red Hat Quay。

15.1. geo-replication 功能

  • 配置异地复制后,容器镜像推送将写入到该 Red Hat Quay 实例的首选存储引擎(通常是区域内最接近的存储后端)。
  • 在初始推送后,镜像数据将在后台复制到其他存储引擎。
  • 复制位置列表可以配置,它们可以是不同的存储后端。
  • 镜像拉取总会使用最接近可用的存储引擎,以最大化拉取性能。
  • 如果复制还没有完成,则拉取将使用源存储后端。

15.2. 异地复制要求和限制

  • 因此,所有区域都共享单个数据库,因此所有元数据和 Quay 配置都会共享。
  • 单个 Redis 缓存在整个 Quay 设置间共享,需要被所有 Quay Pod 访问。
  • 所有区域应使用完全相同的配置,但存储后端除外,可以使用 QUAY_DISTRIBUTED_STORAGE_PREFERENCE 环境变量进行显式配置。
  • geo-Replication 需要每个区域中的对象存储。它无法使用本地存储或 NFS。
  • 每个区域都必须能够访问每个地区中的每个存储引擎(需要网络路径)。
  • 另外,也可以使用存储代理选项。
  • 整个存储后端(所有 blob)复制。这与存储库镜像(mirror)相反,仅限于组织或存储库或镜像。
  • 所有 Quay 实例都必须共享同一个入口点,通常是通过负载均衡器。
  • 所有 Quay 实例都必须有一组相同的超级用户,因为它们在常见配置文件中定义。
  • geo-replication 需要将 Clair 配置设置为 非受管。一个非受管 Clair 数据库可让 Red Hat Quay Operator 在 geo-replicated 环境中工作,其中多个 Operator 实例必须与同一数据库通信。如需更多信息,请参阅 高级 Clair 配置
  • 异地复制需要 SSL/TSL 证书和密钥。如需更多信息,请参阅使用 SSL 保护到 Red Hat Quay 的连接

如果无法满足上述要求,您应该使用两个或更多不同的 Quay 部署,并利用存储库镜像功能。

15.3. 使用独立 Red Hat Quay 进行 geo-replication

Georeplication

在上述示例中,Quay 在两个独立的区域中运行独立,具有通用数据库和通用 Redis 实例。每个地区和镜像拉取都提供了本地化镜像存储,可从最接近的可用存储引擎提供。容器镜像推送会写入 Quay 实例的首选存储引擎,然后在后台将复制到其他存储引擎。

注意

如果 Clair 在一个集群中失败,例如,美国用户不会在 Quay 中看到第二个集群(EU)的漏洞报告。这是因为所有 Clair 实例都具有相同的状态。当 Clair 失败时,它通常是因为集群中的问题而造成的。

15.3.1. 启用存储复制 - 独立 Quay

使用以下步骤在 Red Hat Quay 上启用存储复制。

流程

  1. 在 Red Hat Quay 配置编辑器中,找到 Registry Storage 部分。
  2. 单击 Enable Storage Replication
  3. 添加将复制数据到的每个存储引擎。必须列出所有要使用的存储引擎。
  4. 如果需要所有镜像完成复制到所有存储引擎,请在每个存储引擎配置下单击 Replicate to storage engine。这可确保所有镜像都复制到该存储引擎。

    注意

    要启用每个命名空间复制,请联系红帽 Quay 支持。

  5. 完成后,单击 Save Configuration Changes。在 Red Hat Quay 重启后,配置更改将生效。
  6. 在为异地复制 默认添加存储 并启用 Replicate 后,您必须在所有存储间同步现有镜像数据。要做到这一点,您必须在容器中 oc exec (原生、docker execkubectl exec)并输入以下命令:

    # scl enable python27 bash
    # python -m util.backfillreplication
    注意

    在添加新存储后,这是同步内容的一个时间操作。

15.3.2. 使用存储首选项运行 Red Hat Quay

  1. 将 config.yaml 复制到所有运行 Red Hat Quay 的机器
  2. 对于每个地区中的每个机器,添加一个 QUAY_DISTRIBUTED_STORAGE_PREFERENCE 环境变量,其中包含运行机器所在区域的首选存储引擎。

    例如,对于在欧洲且主机上的配置目录( $QUAY/config )中运行的机器:

    $ sudo podman run -d --rm -p 80:8080 -p 443:8443  \
       --name=quay \
       -v $QUAY/config:/conf/stack:Z \
       -e QUAY_DISTRIBUTED_STORAGE_PREFERENCE=europestorage \
       registry.redhat.io/quay/quay-rhel8:v3.8.0
    注意

    指定的环境变量值必须与 config 面板中定义的位置 ID 名称匹配。

  3. 重启所有 Red Hat Quay 容器

15.4. 使用 Red Hat Quay Operator 的 geo-replication

Georeplication architecture

在上例中,Red Hat Quay Operator 部署到两个独立的区域中,具有通用数据库和通用 Redis 实例。每个地区和镜像拉取都提供了本地化镜像存储,可从最接近的可用存储引擎提供。容器镜像推送会写入 Quay 实例的首选存储引擎,然后在后台将复制到其他存储引擎。

因为 Operator 现在单独管理 Clair 安全扫描程序及其数据库,所以可以利用异地复制设置,以便它们不管理 Clair 数据库。相反,将使用外部共享数据库。Red Hat Quay 和 Clair 支持多个 PostgreSQL 供应商和供应商,可在 Red Hat Quay 3.x 测试列表中找到。另外,Operator 还支持可注入到部署中的自定义 Clair 配置,允许用户使用外部数据库的连接凭据配置 Clair。

15.4.1. 在 Openshift 中设置 geo-replication

流程

  1. 部署 Quay postgres 实例:

    1. 登录到数据库
    2. 为 Quay 创建数据库

      CREATE DATABASE quay;
    3. 在数据库中启用 pg_trm 扩展

      \c quay;
      CREATE EXTENSION IF NOT EXISTS pg_trgm;
  2. 部署 Redis 实例:

    注意
    • 如果您的云供应商有自己的服务,则部署 Redis 实例可能会不需要。
    • 如果要使用 Builders,则需要部署 Redis 实例。
    1. 为 Redis 部署虚拟机
    2. 确保可以从运行 Quay 的集群进行访问
    3. 端口 6379/TCP 必须处于打开状态
    4. 在实例内运行 Redis

      sudo dnf install -y podman
      podman run -d --name redis -p 6379:6379 redis
  3. 创建两个对象存储后端,每个集群一个

    理想情况下,一个对象存储存储桶会接近 1 个集群(主设备),另一个则接近第二代集群(次要)。

  4. 使用环境变量覆盖部署具有相同配置捆绑包的集群,为单个集群选择适当的存储后端
  5. 配置负载均衡器,为集群提供单一入口点

15.4.1.1. 配置

config.yaml 文件在集群间共享,并将包含通用 PostgreSQL、Redis 和存储后端的详情:

config.yaml

SERVER_HOSTNAME: <georep.quayteam.org or any other name> 1
DB_CONNECTION_ARGS:
  autorollback: true
  threadlocals: true
DB_URI: postgresql://postgres:password@10.19.0.1:5432/quay 2
BUILDLOGS_REDIS:
  host: 10.19.0.2
  port: 6379
USER_EVENTS_REDIS:
  host: 10.19.0.2
  port: 6379
DISTRIBUTED_STORAGE_CONFIG:
  usstorage:
    - GoogleCloudStorage
    - access_key: GOOGQGPGVMASAAMQABCDEFG
      bucket_name: georep-test-bucket-0
      secret_key: AYWfEaxX/u84XRA2vUX5C987654321
      storage_path: /quaygcp
  eustorage:
    - GoogleCloudStorage
    - access_key: GOOGQGPGVMASAAMQWERTYUIOP
      bucket_name: georep-test-bucket-1
      secret_key: AYWfEaxX/u84XRA2vUX5Cuj12345678
      storage_path: /quaygcp
DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS:
  - usstorage
  - eustorage
DISTRIBUTED_STORAGE_PREFERENCE:
  - usstorage
  - eustorage
FEATURE_STORAGE_REPLICATION: true

1
必须将正确的 SERVER_HOSTNAME 用于路由,并且必须与全局负载均衡器的主机名匹配。
2
若要检索使用 OpenShift Operator 部署的 Clair 实例的配置文件,请参阅检索 Clair 配置

创建 configBundleSecret

$ oc create secret generic --from-file config.yaml=./config.yaml georep-config-bundle

在每个集群中,设置 configBundleSecret 并使用 QUAY_DISTRIBUTED_STORAGE_PREFERENCE 环境变量覆盖来为该集群配置适当的存储:

注意

两个部署之间的 config.yaml 文件必须匹配。如果对一个集群进行更改,则必须更改该集群。

美国集群

apiVersion: quay.redhat.com/v1
kind: QuayRegistry
metadata:
  name: example-registry
  namespace: quay-enterprise
spec:
  configBundleSecret: georep-config-bundle
  components:
    - kind: objectstorage
      managed: false
    - kind: route
      managed: true
    - kind: tls
      managed: false
    - kind: postgres
      managed: false
    - kind: clairpostgres
      managed: false
    - kind: redis
      managed: false
    - kind: quay
      managed: true
      overrides:
        env:
        - name: QUAY_DISTRIBUTED_STORAGE_PREFERENCE
          value: usstorage
    - kind: mirror
      managed: true
      overrides:
        env:
        - name: QUAY_DISTRIBUTED_STORAGE_PREFERENCE
          value: usstorage

+

注意

由于 TLS 是非受管,并且路由受管理,因此您必须使用配置工具或直接向配置捆绑包提供证书。如需更多信息,请参阅配置 TLS 和路由

欧洲集群

apiVersion: quay.redhat.com/v1
kind: QuayRegistry
metadata:
  name: example-registry
  namespace: quay-enterprise
spec:
  configBundleSecret: georep-config-bundle
  components:
    - kind: objectstorage
      managed: false
    - kind: route
      managed: true
    - kind: tls
      managed: false
    - kind: postgres
      managed: false
    - kind: clairpostgres
      managed: false
    - kind: redis
      managed: false
    - kind: quay
      managed: true
      overrides:
        env:
        - name: QUAY_DISTRIBUTED_STORAGE_PREFERENCE
          value: eustorage
    - kind: mirror
      managed: true
      overrides:
        env:
        - name: QUAY_DISTRIBUTED_STORAGE_PREFERENCE
          value: eustorage

+

注意

由于 TLS 是非受管,并且路由受管理,因此您必须使用配置工具或直接向配置捆绑包提供证书。如需更多信息,请参阅配置 TLS 和路由

15.4.2. 用于异地复制的混合存储

Red Hat Quay 异地复制支持使用不同和多个复制目标,例如,在公共云上使用 AWS S3 存储,并在prem 上使用 Ceph 存储。这会满足关键要求,以便从所有 Red Hat Quay Pod 和集群节点授予对所有存储后端的访问。因此,建议您:

  • 使用 VPN 来防止对内部存储的可见性
  • 使用只允许访问 Quay 使用的指定存储桶的令牌对

这将使 Red Hat Quay 的公共云实例可以访问预先存储,但网络将被加密、保护并且将使用 ACL,从而满足安全要求。

如果您无法实施这些安全措施,最好部署两个不同的 Red Hat Quay registry,并使用存储库镜像作为异地复制的替代选择。

第 16 章 备份和恢复由 Red Hat Quay Operator 管理的 Red Hat Quay

在 OpenShift Container Platform 上由 Red Hat Quay Operator 管理时,使用本节中的内容备份和恢复 Red Hat Quay。

16.1. 备份 Red Hat Quay

此流程描述了如何使用 Red Hat Quay Operator 创建在 OpenShift Container Platform 上部署的 Red Hat Quay 备份

前提条件

  • 使用 Red Hat Quay Operator (status condition Available 设置为 true)在 OpenShift Container Platform 上有一个健康的 Red Hat Quay 部署。
  • 组件 quaypostgresobjectstorage 被设置为 managed: true
  • 如果组件 clair 设为 managed: true,则组件 clairpostgres 也设置为 managed: true (从 Red Hat Quay Operator v3.7 或更高版本开始)
注意

如果您的部署包含部分非受管数据库或存储组件,且您使用 Postgres 或 S3 兼容对象存储来运行您的 Red Hat Quay 部署,您必须引用服务供应商或厂商文档来创建数据的备份。您可以参考本指南中描述的工具,作为如何备份外部 Postgres 数据库或对象存储的起点。

16.1.1. Red Hat Quay 配置备份

  1. 通过导出 QuayRegistry 自定义资源备份它:

    $ oc get quayregistry <quay-registry-name> -n <quay-namespace> -o yaml > quay-registry.yaml
  2. 编辑生成的 quayregistry.yaml 并删除 status 部分和以下 metadata 字段:

      metadata.creationTimestamp
      metadata.finalizers
      metadata.generation
      metadata.resourceVersion
      metadata.uid
  3. 备份受管密钥 secret:

    注意

    如果您运行的版本早于 Red Hat Quay 3.7.0,可以跳过这一步。第一次部署 Quay 时会自动生成一些 secret。它们存储在 QuayRegistry 资源的命名空间中名为 & lt;quay-registry-name>-quay-registry-managed-secret-keys 的 secret 中。

    $ oc get secret -n <quay-namespace> <quay-registry-name>-quay-registry-managed-secret-keys -o yaml > managed-secret-keys.yaml
  4. 编辑生成的 managed-secret-keys.yaml 文件,并删除条目 metadata.ownerReferencesmanaged-secret-keys.yaml 文件应类似于如下:

    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
      name: <quayname>-quay-registry-managed-secret-keys
      namespace: <quay-namespace>
    data:
      CONFIG_EDITOR_PW: <redacted>
      DATABASE_SECRET_KEY: <redacted>
      DB_ROOT_PW: <redacted>
      DB_URI: <redacted>
      SECRET_KEY: <redacted>
      SECURITY_SCANNER_V4_PSK: <redacted>

    data 属性下的所有信息都应该保持相同。

  5. 备份当前的 Quay 配置:

    $ oc get secret -n <quay-namespace>  $(oc get quayregistry <quay-registry-name> -n <quay-namespace>  -o jsonpath='{.spec.configBundleSecret}') -o yaml > config-bundle.yaml
  6. 备份在 Quay pod 中挂载的 /conf/stack/config.yaml 文件:

    $ oc exec -it quay-pod-name -- cat /conf/stack/config.yaml > quay-config.yaml

16.1.2. 缩减 Red Hat Quay 部署

重要

这一步需要创建与 Red Hat Quay 部署状态一致的备份。不要省略这一步,包括 Postgres 数据库和/或 S3 兼容对象存储由外部服务(不受 Operator 管理)提供的设置。

  1. 对于 Operator 版本 3.7 及更新版本: 通过禁用自动扩展并覆盖 Red Hat Quay,镜像 worker 和 Clair (如果管理)来缩减 Red Hat Quay 部署。您的 QuayRegistry 资源应类似于以下内容:

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      name: registry
      namespace: ns
    spec:
      components:
        …
        - kind: horizontalpodautoscaler
          managed: false 1
        - kind: quay
          managed: true
          overrides: 2
            replicas: 0
        - kind: clair
          managed: true
          overrides:
            replicas: 0
        - kind: mirror
          managed: true
          overrides:
            replicas: 0
        …
    1
    禁用 Quay、Clair 和镜像 worker 的自动扩展
    2
    将用于访问数据库和 objectstorage 的组件的副本数设置为 0
  2. 对于 Operator 版本 3.6 和更早的版本 :首先缩减 Red Hat Quay Operator,然后缩减 Red Hat Quay 资源,以缩减 Red Hat Quay 部署:

    $ oc scale --replicas=0 deployment $(oc get deployment -n <quay-operator-namespace>|awk '/^quay-operator/ {print $1}') -n <quay-operator-namespace>
    $ oc scale --replicas=0 deployment $(oc get deployment -n <quay-namespace>|awk '/quay-app/ {print $1}') -n <quay-namespace>
    $ oc scale --replicas=0 deployment $(oc get deployment -n <quay-namespace>|awk '/quay-mirror/ {print $1}') -n <quay-namespace>
    $ oc scale --replicas=0 deployment $(oc get deployment -n <quay-namespace>|awk '/clair-app/ {print $1}') -n <quay-namespace>
  3. 等待 registry-quay-appregistry-quay-mirrorregistry-clair-app pod (取决于您设置为由 Red Hat Quay Operator 管理的组件)消失。您可以运行以下命令来检查其状态:

    $ oc get pods -n <quay-namespace>

    输出示例:

    $ oc get pod
    
    quay-operator.v3.7.1-6f9d859bd-p5ftc               1/1     Running     0             12m
    quayregistry-clair-postgres-7487f5bd86-xnxpr       1/1     Running     1 (12m ago)   12m
    quayregistry-quay-app-upgrade-xq2v6                0/1     Completed   0             12m
    quayregistry-quay-config-editor-6dfdcfc44f-hlvwm   1/1     Running     0             73s
    quayregistry-quay-database-859d5445ff-cqthr        1/1     Running     0             12m
    quayregistry-quay-redis-84f888776f-hhgms           1/1     Running     0             12m

16.1.3. Red Hat Quay 管理的数据库备份

注意

如果您的 Red Hat Quay 部署配置了外部(拒绝) Postgres 数据库,请参阅您的厂商文档,了解如何创建这些数据库的一致性备份。

  1. 确定 Quay PostgreSQL pod 名称:

    $ oc get pod -l quay-component=postgres -n <quay-namespace> -o jsonpath='{.items[0].metadata.name}'

    输出示例:

    quayregistry-quay-database-59f54bb7-58xs7
  2. 获取 Quay 数据库名称:

    $ oc -n <quay-namespace> rsh $(oc get pod -l app=quay -o NAME -n <quay-namespace> |head -n 1) cat /conf/stack/config.yaml|awk -F"/" '/^DB_URI/ {print $4}'
    quayregistry-quay-database
  3. 下载备份数据库:

    $ oc exec quayregistry-quay-database-59f54bb7-58xs7 -- /usr/bin/pg_dump -C quayregistry-quay-database  > backup.sql

16.1.3.1. Red Hat Quay 管理的对象存储备份

本节中的说明适用于以下配置:

  • 独立、多云对象网关配置
  • OpenShift Data foundation storage 要求 Red Hat Quay Operator 通过 ObjectStorageBucketClaim API 从中置备 S3 对象存储存储桶
注意

如果您的 Red Hat Quay 部署配置了外部(拒绝)对象存储,请参阅您的厂商文档,了解如何创建 Quay 存储桶的内容副本。

  1. 解码并导出 AWS_ACCESS_KEY_ID

    $ export AWS_ACCESS_KEY_ID=$(oc get secret -l app=noobaa -n <quay-namespace>  -o jsonpath='{.items[0].data.AWS_ACCESS_KEY_ID}' |base64 -d)
  2. 解码并导出 AWS_SECRET_ACCESS_KEY_ID

    $ export AWS_SECRET_ACCESS_KEY=$(oc get secret -l app=noobaa -n <quay-namespace> -o jsonpath='{.items[0].data.AWS_SECRET_ACCESS_KEY}' |base64 -d)
  3. 创建新目录并将所有 blob 复制到其中:

    $ mkdir blobs
    
    $ aws s3 sync --no-verify-ssl --endpoint https://$(oc get route s3 -n openshift-storage  -o jsonpath='{.spec.host}')  s3://$(oc get cm -l app=noobaa -n <quay-namespace> -o jsonpath='{.items[0].data.BUCKET_NAME}') ./blobs
注意

您还可以使用 rclonesc3md 而不是 AWS 命令行工具。

16.1.4. 扩展 Red Hat Quay 部署备份

  1. 对于 Operator 版本 3.7 及更新版本: 如果需要,通过重新启用自动扩展、删除 Quay worker 和 Clair 的副本覆盖,以扩展 Red Hat Quay 部署。您的 QuayRegistry 资源应类似于以下内容:

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      name: registry
      namespace: ns
    spec:
      components:
        …
        - kind: horizontalpodautoscaler
          managed: true 1
        - kind: quay 2
          managed: true
        - kind: clair
          managed: true
        - kind: mirror
          managed: true
        …
    1
    再次启用 Quay 的自动扩展,Clair 和镜像 worker (如果需要)
    2
    副本覆盖重新删除以扩展 Quay 组件备份
  2. 对于 Operator 版本 3.6 和更早版本: 通过再次扩展 Red Hat Quay Operator 来扩展 Red Hat Quay 部署:

    $ oc scale --replicas=1 deployment $(oc get deployment -n <quay-operator-namespace> | awk '/^quay-operator/ {print $1}') -n <quay-operator-namespace>
  3. 检查 Red Hat Quay 部署的状态:

    $ oc wait quayregistry registry --for=condition=Available=true -n <quay-namespace>

    输出示例:

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      ...
      name: registry
      namespace: <quay-namespace>
      ...
    spec:
      ...
    status:
      - lastTransitionTime: '2022-06-20T05:31:17Z'
        lastUpdateTime: '2022-06-20T17:31:13Z'
        message: All components reporting as healthy
        reason: HealthChecksPassing
        status: 'True'
        type: Available

16.2. 恢复 Red Hat Quay

此流程用于在 Red Hat Quay Operator 管理数据库时恢复 Red Hat Quay。它应该在执行 Red Hat Quay registry 备份后执行。如需更多信息,请参阅 备份 Red Hat Quay

前提条件

  • Red Hat Quay 使用 Red Hat Quay Operator 在 OpenShift Container Platform 上部署。
  • 由 Red Hat Quay Operator 管理的 Red Hat Quay 配置备份已按照 备份 Red Hat Quay 部分中的内容创建。
  • 您的 Red Hat Quay 数据库已经备份。
  • Red Hat Quay 使用的对象存储存储桶已被备份。
  • 组件 quaypostgresobjectstorage 被设置为 managed: true
  • 如果组件 clair 设置为 managed: true,则组件 clairpostgres 也设置为 managed: true (从 Red Hat Quay Operator v3.7 或更高版本开始)
  • 在 OpenShift Container Platform 集群上的目标命名空间中,没有运行由 Red Hat Quay Operator 管理的 Red Hat Quay 部署
注意

如果您的部署包含部分非受管数据库或存储组件,且您使用 Postgres 或 S3 兼容对象存储来运行您的 Red Hat Quay 部署,您必须参考服务提供商或厂商文档从备份中恢复其数据,然后才能恢复 Red Hat Quay

16.2.1. 从备份中恢复 Red Hat Quay 及其配置

注意

这些说明假设您在 备份 Red Hat Quay 指南中的操作过程,并使用相同名称创建备份文件。

  1. 恢复备份的 Red Hat Quay 配置以及备份中生成的密钥:

    $ oc create -f ./config-bundle.yaml
    
    $ oc create -f ./managed-secret-keys.yaml
    重要

    如果您收到错误 Error from server (AlreadyExists):创建 "./config-bundle.yaml": secrets "config-bundle-secret" 时出错,则必须删除 现有的资源,并使用 $ oc delete Secret config-bundle-secret -n <quay-namespace> 重新创建为 $ oc create -f ./config-bundle.yaml

  2. 恢复 QuayRegistry 自定义资源:

    $ oc create -f ./quay-registry.yaml
  3. 检查 Red Hat Quay 部署的状态,并等待它可用:

    $ oc wait quayregistry registry --for=condition=Available=true -n <quay-namespace>

16.2.2. 缩减 Red Hat Quay 部署

  1. 对于 Operator 版本 3.7 及更新版本: 通过禁用自动扩展并覆盖 Quay 的副本数,镜像 worker 和 Clair (如果管理)来缩减 Red Hat Quay 部署。您的 QuayRegistry 资源应类似于以下内容:

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      name: registry
      namespace: ns
    spec:
      components:
        …
        - kind: horizontalpodautoscaler
          managed: false 1
        - kind: quay
          managed: true
          overrides: 2
            replicas: 0
        - kind: clair
          managed: true
          overrides:
            replicas: 0
        - kind: mirror
          managed: true
          overrides:
            replicas: 0
        …
    1
    禁用 Quay、Clair 和镜像 worker 的自动扩展
    2
    将用于访问数据库和 objectstorage 的组件的副本数设置为 0
  2. 对于 Operator 版本 3.6 和更早版本: 首先缩减 Red Hat Quay Operator,然后缩减托管的 Red Hat Quay 资源,以缩减 Red Hat Quay 部署:

    $ oc scale --replicas=0 deployment $(oc get deployment -n <quay-operator-namespace>|awk '/^quay-operator/ {print $1}') -n <quay-operator-namespace>
    
    $ oc scale --replicas=0 deployment $(oc get deployment -n <quay-namespace>|awk '/quay-app/ {print $1}') -n <quay-namespace>
    $ oc scale --replicas=0 deployment $(oc get deployment -n <quay-namespace>|awk '/quay-mirror/ {print $1}') -n <quay-namespace>
    $ oc scale --replicas=0 deployment $(oc get deployment -n <quay-namespace>|awk '/clair-app/ {print $1}') -n <quay-namespace>
  3. 等待 registry-quay-appregistry-quay-mirrorregistry-clair-app pod (取决于您设置为由 Operator 管理的组件)消失。您可以运行以下命令来检查其状态:

    $ oc get pods -n <quay-namespace>

    输出示例:

    registry-quay-config-editor-77847fc4f5-nsbbv   1/1     Running            0          9m1s
    registry-quay-database-66969cd859-n2ssm        1/1     Running            0          6d1h
    registry-quay-redis-7cc5f6c977-956g8           1/1     Running            0          5d21h

16.2.3. 恢复 Red Hat Quay 数据库

  1. 确定您的 Quay 数据库容器集:

    $ oc get pod -l quay-component=postgres -n  <quay-namespace> -o jsonpath='{.items[0].metadata.name}'

    输出示例:

    quayregistry-quay-database-59f54bb7-58xs7
  2. 通过从本地环境复制到 pod 来上传备份:

    $ oc cp ./backup.sql -n <quay-namespace> registry-quay-database-66969cd859-n2ssm:/tmp/backup.sql
  3. 为数据库打开一个远程终端:

    $ oc rsh -n <quay-namespace> registry-quay-database-66969cd859-n2ssm
  4. Enter psql:

    bash-4.4$ psql
  5. 您可以运行以下命令来列出数据库:

    postgres=# \l

    输出示例:

                                                      List of databases
               Name            |           Owner            | Encoding |  Collate   |   Ctype    |   Access privileges
    ----------------------------+----------------------------+----------+------------+------------+-----------------------
    postgres                   | postgres                   | UTF8     | en_US.utf8 | en_US.utf8 |
    quayregistry-quay-database | quayregistry-quay-database | UTF8     | en_US.utf8 | en_US.utf8 |
  6. 丢弃数据库:

    postgres=# DROP DATABASE "quayregistry-quay-database";

    输出示例:

    DROP DATABASE
  7. 退出 postgres CLI 以重新输入 bash-4.4:

    \q
  8. 将 PostgreSQL 数据库重定向到您的备份数据库:

    sh-4.4$ psql < /tmp/backup.sql
  9. 退出 bash:

    sh-4.4$ exit

16.2.4. 恢复 Red Hat Quay 对象存储数据

  1. 导出 AWS_ACCESS_KEY_ID:

    $ export AWS_ACCESS_KEY_ID=$(oc get secret -l app=noobaa -n <quay-namespace>  -o jsonpath='{.items[0].data.AWS_ACCESS_KEY_ID}' |base64 -d)
  2. 导出 AWS_SECRET_ACCESS_KEY:

    $ export AWS_SECRET_ACCESS_KEY=$(oc get secret -l app=noobaa -n <quay-namespace> -o jsonpath='{.items[0].data.AWS_SECRET_ACCESS_KEY}' |base64 -d)
  3. 运行以下命令,将所有 blob 上传到存储桶:

    $ aws s3 sync --no-verify-ssl --endpoint https://$(oc get route s3 -n openshift-storage  -o jsonpath='{.spec.host}') ./blobs  s3://$(oc get cm -l app=noobaa -n <quay-namespace> -o jsonpath='{.items[0].data.BUCKET_NAME}')
注意

您还可以使用 rclonesc3md 而不是 AWS 命令行工具。

16.2.5. 扩展 Red Hat Quay 部署

  1. 对于 Operator 版本 3.7 及更新版本: 如果需要,通过重新启用自动扩展、删除 Quay worker 和 Clair 的副本覆盖,以扩展 Red Hat Quay 部署。您的 QuayRegistry 资源应类似于以下内容:

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      name: registry
      namespace: ns
    spec:
      components:
        …
        - kind: horizontalpodautoscaler
          managed: true 1
        - kind: quay 2
          managed: true
        - kind: clair
          managed: true
        - kind: mirror
          managed: true
        …
    1
    再次启用 Red Hat Quay、Clair 和 mirror worker 的自动扩展(如果需要)
    2
    副本覆盖重新删除以扩展 Red Hat Quay 组件备份
  2. 对于 Operator 版本 3.6 和更早版本: 通过再次扩展 Red Hat Quay Operator 来扩展 Red Hat Quay 部署:

    $ oc scale --replicas=1 deployment $(oc get deployment -n <quay-operator-namespace> | awk '/^quay-operator/ {print $1}') -n <quay-operator-namespace>
  3. 检查 Red Hat Quay 部署的状态:

    $ oc wait quayregistry registry --for=condition=Available=true -n <quay-namespace>

    输出示例:

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      ...
      name: registry
      namespace: <quay-namespace>
      ...
    spec:
      ...
    status:
      - lastTransitionTime: '2022-06-20T05:31:17Z'
        lastUpdateTime: '2022-06-20T17:31:13Z'
        message: All components reporting as healthy
        reason: HealthChecksPassing
        status: 'True'
        type: Available

第 17 章 将独立 Quay 部署迁移到 Red Hat Quay Operator 受管部署

以下流程允许您备份独立 Red Hat Quay 部署,并将其迁移到 OpenShift Container Platform 上的 Red Hat Quay Operator。

17.1. 备份 Red Hat Quay 的独立部署

流程

  1. 备份独立部署的 Quay config.yaml

    $ mkdir /tmp/quay-backup
    $ cp /path/to/Quay/config/directory/config.yaml /tmp/quay-backup
  2. 创建独立 Quay 部署使用的数据库备份:

    $ pg_dump -h DB_HOST -p 5432 -d QUAY_DATABASE_NAME -U QUAY_DATABASE_USER -W -O > /tmp/quay-backup/quay-database-backup.sql
  3. 如果您尚未安装 AWS CLI
  4. 创建 ~/.aws/ 目录:

    $ mkdir ~/.aws/
  5. 从独立部署的 Quay config.yaml 获取 access_keysecret_key

    $ grep -i DISTRIBUTED_STORAGE_CONFIG -A10 /tmp/quay-backup/config.yaml

    输出示例:

    DISTRIBUTED_STORAGE_CONFIG:
        minio-1:
            - RadosGWStorage
            - access_key: ##########
              bucket_name: quay
              hostname: 172.24.10.50
              is_secure: false
              port: "9000"
              secret_key: ##########
              storage_path: /datastorage/registry
  6. access_keysecret_key 从 Quay config.yaml 文件存储在 ~/.aws 目录中:

    $ touch ~/.aws/credentials
  7. 可选:检查是否存储了 access_keysecret_key

    $ cat > ~/.aws/credentials << EOF
    [default]
    aws_access_key_id = ACCESS_KEY_FROM_QUAY_CONFIG
    aws_secret_access_key = SECRET_KEY_FROM_QUAY_CONFIG
    EOF

    输出示例:

    aws_access_key_id = ACCESS_KEY_FROM_QUAY_CONFIG
    aws_secret_access_key = SECRET_KEY_FROM_QUAY_CONFIG
    注意

    如果 aws cli 不会自动从 '~/.aws/credentials 文件 收集 access_keysecret_key,您可以通过运行 aws 配置并手动输入凭证来配置 它们。

  8. quay-backup 目录中,创建一个存储桶_backup 目录:

    $ mkdir /tmp/quay-backup/bucket-backup
  9. 从 S3 存储中备份所有 Blob:

    $ aws s3 sync --no-verify-ssl --endpoint-url https://PUBLIC_S3_ENDPOINT:PORT s3://QUAY_BUCKET/ /tmp/quay-backup/bucket-backup/
    注意

    PUBLIC_S3_ENDPOINT 可从 DISTRIBUTE D_STORAGE_STORAGE_CONFIG hostname 下的 Quay config.yaml 文件中读取。如果端点不安全,请在端点 URL 中使用 http 而不是 https

此时,您应该对本地存储的所有 Quay 数据、Blob、数据库和 config.yaml 文件进行完整备份。在以下部分中,您要将独立部署备份迁移到 OpenShift Container Platform 上的 Red Hat Quay。

17.2. 使用备份的独立内容迁移到 OpenShift Container Platform。

前提条件

  • 您的独立 Red Hat Quay 数据、blob、数据库和 config.yaml 已被备份。
  • Red Hat Quay 使用 Quay Operator 部署到 OpenShift Container Platform 上。
  • 将所有组件设置为 managedQuayRegistry
流程

本文档中的步骤使用以下命名空间: quay-enterprise

  1. 缩减 Red Hat Quay Operator:

    $ oc scale --replicas=0 deployment quay-operator.v3.6.2 -n openshift-operators
  2. 缩减应用程序并镜像部署:

    $ oc scale --replicas=0 deployment QUAY_MAIN_APP_DEPLOYMENT QUAY_MIRROR_DEPLOYMENT
  3. 将数据库 SQL 备份复制到 Quay PostgreSQL 数据库实例中:

    $ oc cp /tmp/user/quay-backup/quay-database-backup.sql quay-enterprise/quayregistry-quay-database-54956cdd54-p7b2w:/var/lib/pgsql/data/userdata
  4. 从 Operator 创建的 config.yaml 文件获取数据库密码:

    $ oc get deployment quay-quay-app -o json | jq '.spec.template.spec.volumes[].projected.sources' | grep -i config-secret

    输出示例:

          "name": "QUAY_CONFIG_SECRET_NAME"
    $ oc get secret quay-quay-config-secret-9t77hb84tb -o json | jq '.data."config.yaml"' | cut -d '"' -f2 | base64 -d -w0 > /tmp/quay-backup/operator-quay-config-yaml-backup.yaml
    cat /tmp/quay-backup/operator-quay-config-yaml-backup.yaml | grep -i DB_URI

    输出示例:

    postgresql://QUAY_DATABASE_OWNER:PASSWORD@DATABASE_HOST/QUAY_DATABASE_NAME
  5. 在数据库 pod 中执行 shell:

    # oc exec -it quay-postgresql-database-pod -- /bin/bash
  6. Enter psql:

    bash-4.4$ psql
  7. 丢弃数据库:

    postgres=# DROP DATABASE "example-restore-registry-quay-database";

    输出示例:

    DROP DATABASE
  8. 创建新数据库并设置所有者与名称相同:

    postgres=# CREATE DATABASE "example-restore-registry-quay-database" OWNER "example-restore-registry-quay-database";

    输出示例:

    CREATE DATABASE
  9. 连接到数据库:

    postgres=# \c "example-restore-registry-quay-database";

    输出示例:

    You are now connected to database "example-restore-registry-quay-database" as user "postgres".
  10. 创建 Quay 数据库的 pg_trmg 扩展:

    example-restore-registry-quay-database=# create extension pg_trgm ;

    输出示例:

    CREATE EXTENSION
  11. 退出 postgres CLI 以重新输入 bash-4.4:

    \q
  12. 设置 PostgreSQL 部署的密码:

    bash-4.4$ psql -h localhost -d "QUAY_DATABASE_NAME" -U QUAY_DATABASE_OWNER -W < /var/lib/pgsql/data/userdata/quay-database-backup.sql

    输出示例:

    SET
    SET
    SET
    SET
    SET
  13. 退出 bash 模式:

    bash-4.4$ exit
  14. 为 Red Hat Quay Operator 创建新的配置捆绑包。

    $ touch config-bundle.yaml
  15. 在新的 config-bundle.yaml 中,包括 registry 需要的所有信息,如 LDAP 配置、密钥以及旧 registry 的其他修改。运行以下命令,将 secret_key 移到 config-bundle.yaml 中:

    $ cat /tmp/quay-backup/config.yaml | grep SECRET_KEY > /tmp/quay-backup/config-bundle.yaml
    注意

    您必须手动复制所有 LDAP、OIDC 和其他信息并将其添加到 /tmp/quay-backup/config-bundle.yaml 文件中。

  16. 在 OpenShift 集群内创建配置捆绑包 secret:

    $ oc create secret generic new-custom-config-bundle --from-file=config.yaml=/tmp/quay-backup/config-bundle.yaml
  17. 扩展 Quay pod:

    $ oc scale --replicas=1 deployment quayregistry-quay-app
    deployment.apps/quayregistry-quay-app scaled
  18. 扩展镜像 pod:

    $ oc scale --replicas=1  deployment quayregistry-quay-mirror
    deployment.apps/quayregistry-quay-mirror scaled
  19. QuayRegistry CRD 进行补丁,使其包含对新自定义配置捆绑包的引用:

    $ oc patch quayregistry QUAY_REGISTRY_NAME --type=merge -p '{"spec":{"configBundleSecret":"new-custom-config-bundle"}}'
    注意

    如果 Quay 返回 500 个内部服务器错误,您可能需要将 DISTRIBUTED_STORAGE_CONFIG 的位置 更新为 默认的

  20. /.aws/ 目录中创建一个新的 AWS credentials.yaml,并包含来自 Operator 创建的 config.yaml 文件中的 access_keysecret_key

    $ touch credentials.yaml
    $ grep -i DISTRIBUTED_STORAGE_CONFIG -A10 /tmp/quay-backup/operator-quay-config-yaml-backup.yaml
    $ cat > ~/.aws/credentials << EOF
    [default]
    aws_access_key_id = ACCESS_KEY_FROM_QUAY_CONFIG
    aws_secret_access_key = SECRET_KEY_FROM_QUAY_CONFIG
    EOF
    注意

    如果 aws cli 不会自动从 '~/.aws/credentials 文件 收集 access_keysecret_key,您可以通过运行 aws 配置并手动输入凭证来配置 这些配置。

  21. 记录 NooBaa 的公开端点:

    $ oc get route s3 -n openshift-storage -o yaml -o jsonpath="{.spec.host}{'\n'}"
  22. 将备份数据同步到 NooBaa 后端存储:

    $ aws s3 sync --no-verify-ssl --endpoint-url https://NOOBAA_PUBLIC_S3_ROUTE /tmp/quay-backup/bucket-backup/* s3://QUAY_DATASTORE_BUCKET_NAME
  23. 将 Operator 扩展至 1 个 pod:

    $ oc scale –replicas=1 deployment quay-operator.v3.6.4 -n openshift-operators

Operator 将使用提供的自定义配置捆绑包,并将协调所有 secret 和部署。在 OpenShift Container Platform 上,您的新 Quay 部署应包含旧部署所需的所有信息。所有镜像均应可以拉取。

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

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

18.1. 在独立部署中备份 Red Hat Quay

此流程描述了如何在独立部署中创建 Red Hat Quay 备份。

流程

  1. 创建临时备份目录,如 quay-backup

    $ mkdir /tmp/quay-backup
  2. 以下示例命令表示 Red Hat Quay 在 中启动的本地目录,例如: /opt/quay-install:

    $ podman run --name quay-app \
       -v /opt/quay-install/config:/conf/stack:Z \
       -v /opt/quay-install/storage:/datastorage:Z \
       {productrepo}/{quayimage}:{productminv}

    运行以下命令,更改到容器内 bind-mounts 到 /conf/stack 的目录,如 /opt/quay-install

    $ cd /opt/quay-install
  3. 输入以下命令将 Red Hat Quay 部署的内容压缩到 quay-backup 目录中的存档中:

    $ tar cvf /tmp/quay-backup/quay-backup.tar.gz *

    输出示例:

    config.yaml
    config.yaml.bak
    extra_ca_certs/
    extra_ca_certs/ca.crt
    ssl.cert
    ssl.key
  4. 输入以下命令备份 Quay 容器服务:

    $ podman inspect quay-app | jq -r '.[0].Config.CreateCommand | .[]' | paste -s -d ' ' -
    
      /usr/bin/podman run --name quay-app \
      -v /opt/quay-install/config:/conf/stack:Z \
      -v /opt/quay-install/storage:/datastorage:Z \
      {productrepo}/{quayimage}:{productminv}
  5. 输入以下命令将 conf/stack/config.yaml 文件的内容重定向到临时 quay-config.yaml 文件:

    $ podman exec -it quay cat /conf/stack/config.yaml > /tmp/quay-backup/quay-config.yaml
  6. 输入以下命令来获取位于您的临时 quay-config.yaml 中的 DB_URI

    $ grep DB_URI /tmp/quay-backup/quay-config.yaml

    输出示例:

    $ postgresql://<username>:test123@172.24.10.50/quay
  7. 输入以下命令将 PostgreSQL 内容提取到 backup .sql 文件中的临时备份目录:

    $ pg_dump -h 172.24.10.50  -p 5432 -d quay  -U  <username>   -W -O > /tmp/quay-backup/quay-backup.sql
  8. 输入以下命令输出您的 DISTRIBUTED_STORAGE_CONFIG 的内容:

    DISTRIBUTED_STORAGE_CONFIG:
       default:
        - S3Storage
        - s3_bucket: <bucket_name>
          storage_path: /registry
          s3_access_key: <s3_access_key>
          s3_secret_key: <s3_secret_key>
          host: <host_name>
  9. 使用步骤 7 中获取的 access_key 凭证导出 AWS_ACCESS_KEY_ID:

    $ export AWS_ACCESS_KEY_ID=<access_key>
  10. 使用在第 7 步中获得的 secret_key 导出 AWS_SECRET_ACCESS_KEY:

    $ export AWS_SECRET_ACCESS_KEY=<secret_key>
  11. quay 存储桶同步到 DISTRIBUTED_STORAGE_CONFIG 的主机名 中的 /tmp/quay-backup/ 目录:

    $ aws s3 sync s3://<bucket_name>  /tmp/quay-backup/blob-backup/ --source-region us-east-2

    输出示例:

    download: s3://<user_name>/registry/sha256/9c/9c3181779a868e09698b567a3c42f3744584ddb1398efe2c4ba569a99b823f7a to registry/sha256/9c/9c3181779a868e09698b567a3c42f3744584ddb1398efe2c4ba569a99b823f7a
    download: s3://<user_name>/registry/sha256/e9/e9c5463f15f0fd62df3898b36ace8d15386a6813ffb470f332698ecb34af5b0d to registry/sha256/e9/e9c5463f15f0fd62df3898b36ace8d15386a6813ffb470f332698ecb34af5b0d

建议您在同步 quay 存储桶后删除 quay-config.yaml 文件,因为它包含敏感信息。quay-config.yaml 文件将不会丢失,因为它在 quay-backup.tar.gz 文件中备份。

18.2. 在独立部署中恢复 Red Hat Quay

此流程描述了如何在独立部署中恢复 Red Hat Quay。

前提条件

  • 您已备份了 Red Hat Quay 部署。

流程

  1. 在 Red Hat Quay 容器内创建一个将绑定挂载到 /conf/stack 的新目录:

    $ mkdir /opt/new-quay-install
  2. 将备份 独立部署的 Red Hat Quay 中创建的临时备份目录的内容复制到第 1 步中创建的 new-quay-install1 目录中:

    $ cp /tmp/quay-backup/quay-backup.tar.gz /opt/new-quay-install/
  3. 输入以下命令改变 new-quay-install 目录:

    $ cd /opt/new-quay-install/
  4. 提取 Red Hat Quay 目录的内容:

    $ tar xvf /tmp/quay-backup/quay-backup.tar.gz *

    输出示例:

    config.yaml
    config.yaml.bak
    extra_ca_certs/
    extra_ca_certs/ca.crt
    ssl.cert
    ssl.key
  5. 输入以下命令从您的支持的 config.yaml 文件中重新调用 DB_URI

    $ grep DB_URI config.yaml

    输出示例:

    postgresql://<username>:test123@172.24.10.50/quay
  6. 运行以下命令进入 PostgreSQL 数据库服务器:

    $ sudo postgres
  7. 输入 psql 并在 172.24.10.50 中创建新数据库,以恢复 quay 数据库,例如: example_restore_registry_quay_database

    $ psql "host=172.24.10.50  port=5432 dbname=postgres user=<username>  password=test123"
    postgres=> CREATE DATABASE example_restore_registry_quay_database;

    输出示例:

    CREATE DATABASE
  8. 运行以下命令来连接到数据库:

    postgres=# \c "example-restore-registry-quay-database";

    输出示例:

    You are now connected to database "example-restore-registry-quay-database" as user "postgres".
  9. 运行以下命令,创建 Quay 数据库的 pg_trmg 扩展:

    example_restore_registry_quay_database=> CREATE EXTENSION IF NOT EXISTS pg_trgm;

    输出示例:

    CREATE EXTENSION
  10. 输入以下命令退出 postgres CLI:

    \q
  11. 运行以下命令,将数据库备份导入到新数据库中:

    $ psql "host=172.24.10.50 port=5432 dbname=example_restore_registry_quay_database user=<username> password=test123"  -W <  /tmp/quay-backup/quay-backup.sql

    输出示例:

    SET
    SET
    SET
    SET
    SET

    在重启 Red Hat Quay 部署前,将 config.yaml 中的 DB_URI 的值从 postgresql://<username>:test123@172.24.10.50/example-restore-registry-quay-database 更新。

    注意

    DB_URI 格式是 DB_URI postgresql://<login_user_name>:<login_user_password>@<postgresql_host>/<quay_database>。如果您要从一个 PostgreSQL 服务器移动到另一个 PostgreSQL 服务器,请同时更新 < login_user_name>、< login_user_password><postgresql_host > 的值。

  12. /opt/new-quay-install 目录中打印您的 DISTRIBUTED_STORAGE_CONFIG 捆绑包的内容:

    $ cat config.yaml | grep DISTRIBUTED_STORAGE_CONFIG -A10

    输出示例:

    DISTRIBUTED_STORAGE_CONFIG:
       default:
    DISTRIBUTED_STORAGE_CONFIG:
       default:
        - S3Storage
        - s3_bucket: <bucket_name>
          storage_path: /registry
          s3_access_key: <s3_access_key>
          s3_secret_key: <s3_secret_key>
          host: <host_name>
    注意

    在重启 Red Hat Quay 部署前,必须更新 /opt/new-quay-install 中的 DISTRIBUTED_STORAGE_CONFIG

  13. 使用在第 13 步中获得的 access_key 凭证导出 AWS_ACCESS_KEY_ID

    $ export AWS_ACCESS_KEY_ID=<access_key>
  14. 使用在第 13 步中获得的 secret_key 导出 AWS_SECRET_ACCESS_KEY:

    $ export AWS_SECRET_ACCESS_KEY=<secret_key>
  15. 输入以下命令创建新 s3 存储桶:

    $ aws s3 mb s3://<new_bucket_name>  --region us-east-2

    输出示例:

    $ make_bucket: quay
  16. 输入以下命令将所有 blob 上传到新的 s3 存储桶:

    $ aws s3 sync --no-verify-ssl \
    --endpoint-url <example_endpoint_url> 1
    /tmp/quay-backup/blob-backup/. s3://quay/
    1
    在备份和恢复前,Red Hat Quay registry 端点必须相同。

    输出示例:

    upload: ../../tmp/quay-backup/blob-backup/datastorage/registry/sha256/50/505edb46ea5d32b5cbe275eb766d960842a52ee77ac225e4dc8abb12f409a30d to s3://quay/datastorage/registry/sha256/50/505edb46ea5d32b5cbe275eb766d960842a52ee77ac225e4dc8abb12f409a30d
    upload: ../../tmp/quay-backup/blob-backup/datastorage/registry/sha256/27/27930dc06c2ee27ac6f543ba0e93640dd21eea458eac47355e8e5989dea087d0 to s3://quay/datastorage/registry/sha256/27/27930dc06c2ee27ac6f543ba0e93640dd21eea458eac47355e8e5989dea087d0
    upload: ../../tmp/quay-backup/blob-backup/datastorage/registry/sha256/8c/8c7daf5e20eee45ffe4b36761c4bb6729fb3ee60d4f588f712989939323110ec to s3://quay/datastorage/registry/sha256/8c/8c7daf5e20eee45ffe4b36761c4bb6729fb3ee60d4f588f712989939323110ec
    ...
  17. 在重启 Red Hat Quay 部署前,更新 config.yaml 中的存储设置:

    DISTRIBUTED_STORAGE_CONFIG:
       default:
    DISTRIBUTED_STORAGE_CONFIG:
       default:
        - S3Storage
        - s3_bucket: <new_bucket_name>
          storage_path: /registry
          s3_access_key: <s3_access_key>
          s3_secret_key: <s3_secret_key>
          host: <host_name>

第 19 章 Red Hat Quay 垃圾回收

19.1. 关于 Red Hat Quay 垃圾回收

Red Hat Quay 包括自动和持续镜像垃圾回收。垃圾回收通过删除 occupy sizeable 磁盘空间(如 danging 或 untagged 镜像、存储库和 blob)来有效地为活跃对象使用资源,包括层和清单。Red Hat Quay 执行的垃圾回收可以缩短您组织的环境中的停机时间。

19.2. Red Hat Quay 垃圾回收实践

目前,所有垃圾回收都会发生;没有命令可以手动运行垃圾回收。Red Hat Quay 提供跟踪不同垃圾回收工作程序状态的指标。

对于命名空间和存储库垃圾回收,会根据对应队列的大小跟踪进度。命名空间和存储库垃圾回收工作需要全局锁定。因此,出于性能原因,每次只运行一个 worker。

注意

Red Hat Quay 在命名空间和存储库间共享 Blob,以节省磁盘空间。例如,如果同一镜像被推送 10 次,则仅存储该镜像的一个副本。

标签可以与已经存储在 Red Hat Quay 中的不同镜像共享其层。在这种情况下,Blob 将保留在存储中,因为删除共享 Blob 会使其他镜像不可用。

blob 过期时间独立于时间机器。如果您将标签推送到 Red Hat Quay,并且将时间机器设置为 0 秒,然后您立即删除标签,垃圾回收会删除与该标签相关的所有标签,但不会删除 blob 存储,直到达到 blob 过期时间。

垃圾回收标记的镜像与命名空间或存储库上的垃圾回收不同。垃圾回收 worker 不使用项目,而是会主动搜索带有不活跃或过期标签的存储库进行清理。每个垃圾回收 worker 实例都会获取一个存储库锁定,这会导致每个存储库有一个 worker。

注意
  • 在 Red Hat Quay 中,不活跃或过期的标签是没有标签的清单,因为最后的标签已被删除或过期。清单存储关于镜像如何组成并存储在各个标签的数据库中的信息。删除标签并满足 Time Machine 中分配的时间后,Red Hat Quay 垃圾回收没有连接到 registry 中任何其他清单的 Blob。如果特定的 blob 连接到清单,则该 Blob 会保留在存储中,并且只删除它与要删除的清单的连接。
  • 过期的镜像将在分配的时间后消失,但仍然存储在 Red Hat Quay 中。镜像完全删除或收集的时间取决于机构的 Time Machine 设置。垃圾回收的默认时间为 14 天,除非另有指定。在此之前,标签可以指向过期或删除的镜像。

对于每种垃圾回收类型,Red Hat Quay 提供了每个垃圾回收 worker 所删除的每个表的行数的指标。下图显示了 Red Hat Quay 如何监控具有相同指标的垃圾回收示例:

Garbage collection metrics

19.2.1. 测量存储重新声明

Red Hat Quay 没有办法跟踪通过垃圾回收来释放的空间量。目前,这是通过检查提供的指标中已删除多少 Blob 的最佳指示。

注意

Red Hat Quay 指标中的 UploadedBlob 表跟踪与存储库关联的各种 Blob。上传 blob 时,它不会在由 PUSH_TEMP_TAG_EXPIRATION_SEC 参数指定的时间之前收集它。这是为了避免预先删除作为持续推送一部分的 blob。例如,如果垃圾回收会频繁运行,且在小于一小时的范围内删除标签,那么相关的 Blob 无法立即清理。相反,假设由 PUSH_TEMP_TAG_EXPIRATION_SEC 参数指定的时间已被传递,则相关的 Blob 将删除下一个在同一仓库上运行的垃圾回收。

19.3. 垃圾回收配置字段

以下配置字段可用于自定义垃圾回收所收集的内容,以及垃圾回收发生的频率:

名称描述模式

FEATURE_GARBAGE_COLLECTION

是否为镜像标签启用了垃圾回收。默认值为 true

布尔值

FEATURE_NAMESPACE_GARBAGE_COLLECTION

是否为命名空间启用垃圾回收。默认值为 true

布尔值

FEATURE_REPOSITORY_GARBAGE_COLLECTION

是否为软件仓库启用垃圾回收。默认值为 true

布尔值

GARBAGE_COLLECTION_FREQUENCY

垃圾回收 worker 运行的频率,以秒为单位。仅影响垃圾回收 worker。默认为 30 秒。

字符串

PUSH_TEMP_TAG_EXPIRATION_SEC

上传后没有垃圾回收 Blob 的秒数。此功能可防止垃圾回收清理尚未引用的 Blob,但仍然作为持续推送的一部分使用。

字符串

TAG_EXPIRATION_OPTIONS

有效标签到期值列表。

字符串

DEFAULT_TAG_EXPIRATION

时间机器的标签过期时间。

字符串

CLEAN_BLOB_UPLOAD_FOLDER

当设置为 true 时,从 S3 多部件上传中自动清理陈旧的 Blob。默认情况下,每小时清理超过两天的 Blob 文件。

布尔值

+ default: false

19.4. 禁用垃圾回收

镜像标签、命名空间和存储库的垃圾回收功能存储在 config.yaml 文件中。这些功能默认为 true

在个别情况下,您可能需要禁用垃圾回收,例如,控制执行垃圾回收的时间。您可以通过将 GARBAGE_COLLECTION 功能设置为 false 来禁用垃圾回收。禁用后,不会删除 danging 或 untagged 镜像、存储库、命名空间、层和清单。这可能会增加环境的停机时间。

注意

没有命令可以手动运行垃圾回收。相反,您要禁用,然后重新启用垃圾回收功能。

19.5. 垃圾回收和配额管理

Red Hat Quay 在 3.7 中引入了配额管理。通过配额管理,用户可以报告存储消耗,并通过建立配置的存储配额限制来包含 registry 增长。

从 Red Hat Quay 3.7 开始,垃圾回收会回收在删除后分配给镜像、存储库和 Blob 的内存。由于垃圾回收功能在删除后回收内存,因此存储在环境的磁盘空间和配额管理作为总消耗之间存在差异。当前没有解决此问题的方法。

19.6. 实践中的垃圾回收

使用以下步骤检查您的 Red Hat Quay 日志,以确保垃圾回收正常工作。

流程

  1. 输入以下命令确保垃圾回收正常工作:

    $ sudo podman logs <container_id>

    输出示例:

gcworker stdout | 2022-11-14 18:46:52,458 [63] [INFO] [apscheduler.executors.default] Job "GarbageCollectionWorker._garbage_collection_repos (trigger: interval[0:00:30], next run at: 2022-11-14 18:47:22 UTC)" executed successfully
  1. 删除镜像标签。
  2. 输入以下命令确保标签已被删除:

    $ podman logs quay-app

    输出示例:

gunicorn-web stdout | 2022-11-14 19:23:44,574 [233] [INFO] [gunicorn.access] 192.168.0.38 - - [14/Nov/2022:19:23:44 +0000] "DELETE /api/v1/repository/quayadmin/busybox/tag/test HTTP/1.0" 204 0 "http://quay-server.example.com/repository/quayadmin/busybox?tab=tags" "Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0"

19.7. Red Hat Quay 垃圾回收指标

以下指标显示了由垃圾回收移除的资源数量。这些指标显示垃圾回收 worker 运行的次数,以及删除多少个命名空间、存储库和 Blob。

指标名称Description

quay_gc_iterations_total

GCWorker 的迭代数

quay_gc_namespaces_purged_total

NamespaceGCWorker 清除的命名空间数量

quay_gc_repos_purged_total

RepositoryGCWorker 或 NamespaceGCWorker 清除的存储库数量

quay_gc_storage_blobs_deleted_total

删除的存储 Blob 数量

指标输出示例

# TYPE quay_gc_iterations_created gauge
quay_gc_iterations_created{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 1.6317823190189714e+09
...

# HELP quay_gc_iterations_total number of iterations by the GCWorker
# TYPE quay_gc_iterations_total counter
quay_gc_iterations_total{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 0
...

# TYPE quay_gc_namespaces_purged_created gauge
quay_gc_namespaces_purged_created{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 1.6317823190189433e+09
...

# HELP quay_gc_namespaces_purged_total number of namespaces purged by the NamespaceGCWorker
# TYPE quay_gc_namespaces_purged_total counter
quay_gc_namespaces_purged_total{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 0
....

# TYPE quay_gc_repos_purged_created gauge
quay_gc_repos_purged_created{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 1.631782319018925e+09
...

# HELP quay_gc_repos_purged_total number of repositories purged by the RepositoryGCWorker or NamespaceGCWorker
# TYPE quay_gc_repos_purged_total counter
quay_gc_repos_purged_total{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 0
...

# TYPE quay_gc_storage_blobs_deleted_created gauge
quay_gc_storage_blobs_deleted_created{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 1.6317823190189059e+09
...

# HELP quay_gc_storage_blobs_deleted_total number of storage blobs deleted
# TYPE quay_gc_storage_blobs_deleted_total counter
quay_gc_storage_blobs_deleted_total{host="example-registry-quay-app-6df87f7b66-9tfn6",instance="",job="quay",pid="208",process_name="secscan:application"} 0
...

第 20 章 Red Hat Quay 故障排除

恢复的常见故障模式和最佳实践。

第 21 章 Red Hat Quay 配置的 schema

大多数 Red Hat Quay 配置信息都存储在 config.yaml 文件中,在首次部署 Red Hat Quay 时,使用基于浏览器的配置工具创建它。

Red Hat Quay Configuration Guide 中描述了配置选项。

其他资源