管理 Red Hat Quay

Red Hat Quay 3.9

管理 Red Hat Quay

Red Hat OpenShift Documentation Team

摘要

管理 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 集成
  • 使用存储库镜像镜像镜像
  • 将 Red Hat Quay 镜像与 BitTorrent 服务共享
  • 使用 LDAP 验证用户
  • 为 Prometheus 和 Grafana 指标启用 Quay
  • 设置区域复制
  • Red Hat Quay 故障排除

有关 Red Hat Quay 配置字段的完整列表,请参阅 Configure Red Hat Quay 页面。

第 1 章 高级 Red Hat Quay 配置

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

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

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

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

config 模式运行 Quay 容器时可以使用 Red Hat Quay Config Tool 以及常规的 Red Hat Quay 服务。

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

1.1.1. 从 Red Hat Quay Operator 运行配置工具

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

先决条件

  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. 选择 此集群的修改配置 来启动 Config Tool 设置,例如:

    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 rolloutPopulate 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 \
        registry.redhat.io/quay/quay-rhel8:v3.9.6 config <my_secret_password>
    注意

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

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

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

您可以通过将环境变量传递给运行时变量来部署带有安全 TLS 证书的配置工具。这样可确保对数据库和存储后端的凭证等敏感数据受到保护。

公钥和私钥必须包含您在其上部署配置工具的路由的有效主题备用名称(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 调用

FEATURE_RATE_LIMITS 参数添加到 config.yaml 文件会导致 nginx 将特定 API 调用限制为 30-per-second。如果没有设置 FEATURE_RATE_LIMITS,API 调用将每秒限制为 300 秒,从而使其无限。

当您必须确保可用资源不会面临流量时,速率限制非常重要。

有些命名空间可能需要无限访问,例如,如果它们对 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 数据库连接设置。它们取决于您的部署的数据库驱动程序,例如,用于 Postgres 的 psycopg2,以及 MySQL 的 pymysql。您还可以传递 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 连接的优先级。sslmode 参数有六个模式:

  • Disabl : 仅尝试非 SSL 连接。
  • Allow :首先测试非 SSL 连接。出现故障时,尝试 SSL 连接。
  • 首选: Default。首先尝试 SSL 连接。失败时,尝试非 SSL 连接。
  • 需要 :仅尝试 SSL 连接。如果存在 root CA 文件,请使用与指定 verify-ca 相同的方式验证连接。
  • verify-ca :仅尝试 SSL 连接,并验证服务器证书是否由信任证书颁发机构(CA)发布。
  • verify-full: 只尝试 SSL 连接。验证服务器证书是否由信任 CA 发布,并且请求的服务器主机名是否与证书中的匹配。

有关 PostgreSQL 有效参数的更多信息,请参阅 数据库连接控制功能

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 操作

    • 最小值: 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
    • maximum: 4
    • 默认: $CPU_COUNT x 2
    • 环境变量:WORKER_COUNT_SECSCAN

1.3.4.5. 环境变量

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

表 1.1. worker 计数环境变量

变量描述

WORKER_COUNT_REGISTRY

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

864之间的整数

WORKER_COUNT_WEB

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

232之间的整数

WORKER_COUNT_SECSCAN

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

整数.因为 Operator 为资源请求和限值指定 2 个 vCPU,所以在 24 之间设置这个值是安全的。但是,如果保证,用户可以运行更多,例如 16 个。

DB_CONNECTION_POOLING

切换数据库连接池。

truefalse

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.9.6 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.9.6 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 预测时知道的通知。

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

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

4.1. 使用 SSL/TLS

要使用 自签名证书 配置 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. 创建证书颁发机构

使用以下步骤创建证书颁发机构(CA)

流程

  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/TLS。

前提条件

  • 您已创建了证书颁发机构并签署证书。

流程

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

    cp ~/ssl.cert ~/ssl.key $QUAY/config
  2. 输入以下命令进入 $QUAY/config 目录:

    $ cd $QUAY/config
  3. 编辑 config.yaml 文件,并指定您希望 Red Hat Quay 处理 TLS/SSL:

    config.yaml

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

  4. 可选:输入以下命令将 rootCA.pem 文件的内容应用到 ssl.cert 文件的末尾:

    $ cat rootCA.pem >> ssl.cert
  5. 输入以下命令停止 Quay 容器:

    $ sudo podman stop quay
  6. 输入以下命令重启 registry:

    $ 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.9.6

4.4. 使用 Red Hat Quay UI 配置 SSL/TLS

使用以下步骤使用 Red Hat Quay UI 配置 SSL/TLS。

要使用命令行界面配置 SSL,请参阅"使用命令行界面配置 SSL/TLS"。

前提条件

  • 您已创建了证书颁发机构并签署证书。

流程

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

    $ sudo podman run --rm -it --name quay_config -p 80:8080 -p 443:8443 registry.redhat.io/quay/quay-rhel8:v3.9.6 config secret
  2. Server Configuration 部分中,选择 Red Hat Quay handle TLS for SSL/TLS。上传之前创建的证书文件和私钥文件,确保 Server Hostname 与创建证书时使用的值匹配。
  3. 验证并下载更新的配置。
  4. 输入以下命令停止 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.9.6

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 配置为信任 root 证书颁发机构(CA)。

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

当您尝试访问 Quay registry 时,在这种情况下,浏览器会警告潜在的风险:https://quay-server.example.com

Potential risk

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

Connection not secure

以下部分介绍了将系统配置为信任 root 证书颁发机构(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. 输入以下命令将 rootCA.pem 文件复制到整合的系统范围信任存储中:

    $ 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. 要从系统范围的信任中删除 rootCA.pem 文件,请删除该文件并更新配置:

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

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

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

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

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

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

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

    $ 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.9.6 "/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 上部署 Red Hat Quay 时添加自定义 SSL/TLS 证书

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

作为临时解决方案,在部署 Red Hat Quay base64 编码证书可以添加到 secret 中。

在 Kubernetes 上部署 Red Hat Quay 时,请使用以下步骤添加自定义 SSL/TLS 证书。

前提条件

  • Red Hat Quay 已部署。
  • 您有一个自定义 ca.crt 文件。

流程

  1. 输入以下命令对 SSL/TLS 证书的内容进行 Base64 编码:

    $ 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 编码字符串er 粘贴到该条目下。例如:

      custom-cert.crt:
    c1psWGpqeGlPQmNEWkJPMjJ5d0pDemVnR2QNCnRsbW9JdEF4YnFSdVd3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
  4. 使用 kubectl delete 命令删除所有 Red Hat Quay pod。例如:

    $ kubectl delete pod quay-operator.v3.7.1-6f9d859bd-p5ftc quayregistry-clair-postgres-7487f5bd86-xnxpr quayregistry-quay-app-upgrade-xq2v6 quayregistry-quay-config-editor-6dfdcfc44f-hlvwm quayregistry-quay-database-859d5445ff-cqthr quayregistry-quay-redis-84f888776f-hhgms

    之后,Red Hat Quay 部署会自动将 pod 替换为新证书数据。

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

默认情况下,以前三个使用日志存储在 Red Hat Quay 数据库中,并通过 Web UI 在机构和存储库级别上公开。需要适当的管理特权才能查看日志条目。对于具有大量日志记录操作的部署,您可以将用量日志存储在 Elasticsearch 和 Splunk 中,而不是 Red Hat Quay 数据库后端。

6.1. 为 Elasticsearch 配置操作日志存储

注意

要为 Elasticsearch 配置操作日志存储,您必须提供自己的 Elasticsearch 堆栈,因为它没有包含在 Red Hat Quay 中作为可定制的组件。

使用配置工具,可以在 Red Hat Quay 部署或部署后启用 Elasticsearch 日志记录。生成的配置存储在 config.yaml 文件中。配置后,通过 Web UI 为存储库和机构提供使用情况日志访问。

使用以下步骤为 Elasticsearch 配置操作日志存储:

流程

  1. 获取 Elasticsearch 帐户。
  2. 打开 Red Hat Quay Config Tool (在 Red Hat Quay 部署期间或之后)。
  3. 滚动到 Action Log Storage Configuration 设置,再选择 Elasticsearch。下图显示了出现的 Elasticsearch 设置:

    Choose Elasticsearch to view settings to store logs

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

    • Elasticsearch hostname :提供 Elasticsearch 服务的系统的主机名或 IP 地址。
    • Elasticsearch port :在您刚才输入的主机上提供 Elasticsearch 服务的端口号。请注意,该端口必须可从所有运行 Red Hat Quay registry 的系统访问。默认值为 TCP 端口 9200。
    • Elasticsearch access key :如果需要可以访问 Elastic 搜索服务所需的访问密钥。
    • Elasticsearch secret key :如果需要可以访问 Elastic 搜索服务所需的 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 access key :获取对 Kinesis 流的访问权限所需的 AWS 访问密钥的名称(如果需要)。
    • AWS secret key :如果需要可以访问 Kinesis 流所需的 AWS secret 密钥的名称。
    • AWS 区域 :AWS 区域。
  6. 完成后,保存配置。配置工具检查您的设置。如果连接到 Elasticsearch 或 Kinesis 服务存在问题,您会看到错误,并准备继续编辑。否则,日志记录将在集群使用新配置重启后开始定向到 Elasticsearch 配置。

6.2. 为 Splunk 配置操作日志存储

Splunk 是 Elasticsearch 的替代选择,可以为 Red Hat Quay 数据提供日志分析。

使用配置工具,可以在 Red Hat Quay 部署或部署后启用 Splunk 日志记录。生成的配置存储在 config.yaml 文件中。配置后,通过 Splunk Web UI 为存储库和机构提供使用日志访问权限。

使用以下步骤为您的 Red Hat Quay 部署启用 Splunk。

6.2.1. 为 Splunk 安装并创建用户名

使用以下步骤安装并创建 Splunk 凭证。

流程

  1. 进入 Splunk 并输入所需凭证来创建 Splunk 帐户。
  2. 导航到 Splunk Enterprise Free Trial 页面,选择您的平台和安装软件包,然后单击 Download Now
  3. 在您的机器上安装 Splunk 软件。出现提示时,创建一个用户名,如 mvapich _admin 和密码。
  4. 创建用户名和密码后,将为 Splunk 部署提供一个 localhost URL,例如 http://<sample_url>.remote.csb:8000/。在您首选的浏览器中打开 URL。
  5. 使用安装期间创建的用户名和密码登录。您会被定向到 Splunk UI。

6.2.2. 生成 Splunk 令牌

使用以下步骤为 Splunk 创建 bearer 令牌。

6.2.2.1. 使用 Splunk UI 生成 Splunk 令牌

使用以下步骤,使用 Splunk UI 为 Splunk 创建 bearer 令牌。

先决条件

  • 已安装 Splunk 并创建一个用户名。

流程

  1. 在 Splunk UI 中,进入到 SettingsTokens
  2. 单击 Enable Token Authentication
  3. Token Settings 并选择 Token Authentication (如果需要),确保启用了 Token Authentication
  4. 可选:为您的令牌设置过期时间。默认值为 30 天。
  5. 点击 Save
  6. 单击 New Token
  7. 输入 UserAudience 的信息。
  8. 可选:设置 ExpirationNot Before 信息。
  9. Create。您的令牌会出现在 Token 框中。立即复制令牌。

    重要

    如果在复制令牌前开箱即用,则必须创建新令牌。在关闭 New Token 窗口后,整个令牌不可用。

6.2.2.2. 使用 CLI 生成 Splunk 令牌

使用以下步骤使用 CLI 为 Splunk 创建 bearer 令牌。

先决条件

  • 已安装 Splunk 并创建一个用户名。

流程

  1. 在 CLI 中,输入以下 CURL 命令以启用令牌身份验证,传递您的 Splunk 用户名和密码:

    $ curl -k -u <username>:<password> -X POST <scheme>://<host>:<port>/services/admin/token-auth/tokens_auth -d disabled=false
  2. 输入以下 CURL 命令,传递 Splunk 用户名和密码来创建令牌。

    $ curl -k -u <username>:<password> -X POST <scheme>://<host>:<port>/services/authorization/tokens?output_mode=json --data name=<username> --data audience=Users --data-urlencode expires_on=+30d
  3. 保存生成的 bearer 令牌。

6.2.3. 将 Red Hat Quay 配置为使用 Splunk

使用以下步骤将 Red Hat Quay 配置为使用 Splunk。

先决条件

  • 已安装 Splunk 并创建一个用户名。
  • 您已生成了一个 Splunk bearer 令牌。

流程

  1. 打开 Red Hat Quay config.yaml 文件并添加以下配置字段:

    ---
    LOGS_MODEL: splunk
    LOGS_MODEL_CONFIG:
        producer: splunk
        splunk_config:
            host: http://<user_name>.remote.csb 1
            port: 8089 2
            bearer_token: <bearer_token> 3
            url_scheme: <http/https> 4
            verify_ssl: False 5
            index_prefix: <splunk_log_index_name> 6
            ssl_ca_path: <location_to_ssl-ca-cert.pem> 7
    ---
    1
    字符串.Splunk 集群端点。
    2
    整数.Splunk 管理集群端点端口。与 Splunk GUI 托管端口不同。可以在 Splunk UI 的 SettingsServer SettingsGeneral Settings 下找到。
    3
    字符串.为 Splunk 生成的 bearer 令牌。
    4
    字符串.访问 Splunk 服务的 URL 方案。如果将 Splunk 配置为使用 TLS/SSL,则必须是 https
    5
    布尔值.是否启用 TLS/SSL。默认值为 true
    6
    字符串.Splunk 索引前缀。可以是新的、使用的索引。可以从 Splunk UI 创建。
    7
    字符串.到包含用于 TLS/SSL 验证的证书颁发机构(CA)的单个 .pem 文件的相对容器路径。
  2. 如果要配置 ssl_ca_path,您必须配置 SSL/TLS 证书,以便 Red Hat Quay 将信任它。

    1. 如果您使用 Red Hat Quay 的独立部署,可以通过将证书文件放在 extra_ca_certs 目录内或通过 ssl_ca_path 指定来提供 SSL/TLS 证书。
    2. 如果使用 Red Hat Quay Operator,请创建一个配置捆绑包 secret,包括 Splunk 服务器的证书颁发机构(CA)。例如:

      $ oc create secret generic --from-file config.yaml=./config_390.yaml --from-file extra_ca_cert_splunkserver.crt=./splunkserver.crt config-bundle-secret

      config.yaml 中指定 conf/stack/extra_ca_certs/mvapichserver.crt 文件。例如:

      LOGS_MODEL: splunk
      LOGS_MODEL_CONFIG:
          producer: splunk
          splunk_config:
              host: ec2-12-345-67-891.us-east-2.compute.amazonaws.com
              port: 8089
              bearer_token: eyJra
              url_scheme: https
              verify_ssl: true
              index_prefix: quay123456
              ssl_ca_path: conf/stack/splunkserver.crt

6.2.4. 创建操作日志

使用以下步骤创建可将操作日志转发到 Splunk 的用户帐户。

重要

您必须使用 Splunk UI 查看 Red Hat Quay 操作日志。目前,在 Red Hat Quay Usage Logs 页面中查看 Splunk 操作日志不受支持,并返回以下信息: Method not implemented。Splunk 不支持日志查找

先决条件

  • 已安装 Splunk 并创建一个用户名。
  • 您已生成了一个 Splunk bearer 令牌。
  • 您已配置了 Red Hat Quay config.yaml 文件来启用 Splunk。

流程

  1. 登录到您的 Red Hat Quay 部署。
  2. 点击您要用来为 Splunk 创建操作日志的组织名称。
  3. 在导航窗格中,点 Robot AccountsCreate Robot Account
  4. 出现提示时,输入机器人帐户的名称,如 spunkrobotaccount,然后单击 Create robot account
  5. 在您的浏览器中,打开 Splunk UI。
  6. 单击 Search and Reporting
  7. 在搜索栏中输入索引名称,例如 <mvapich _log_index_name > 并按 Enter

    搜索结果在 Splunk UI 上填充,显示 主机sourcetype 等信息。点击 & gt; 箭头,您可以查看日志的元数据,如 ip、JSON 元数据和帐户名称。

第 7 章 Clair for Red Hat Quay

Clair v4 (Clair)是一个开源应用程序,它利用静态代码分析来解析镜像内容和报告影响内容的漏洞。Clair 与 Red Hat Quay 打包,并可用于独立和 Operator 部署。它可以在高度可扩展的配置中运行,其中组件可根据企业环境单独扩展。

7.1. Clair 安全漏洞数据库

Clair 使用以下漏洞数据库来报告您的镜像中的问题:

  • Ubuntu Oval 数据库
  • Debian 安全跟踪器
  • Red Hat Enterprise Linux (RHEL) Oval 数据库
  • Dan Oval 数据库
  • Oracle Oval 数据库
  • alpine SecDB 数据库
  • VMware Photon OS 数据库
  • Amazon Web Services (AWS) UpdateInfo
  • 开源漏洞(OSV)数据库

有关 Clair 如何对不同数据库进行安全映射的信息,请参阅 Claircore Severity 映射

7.1.1. Clair 的开源漏洞(OSV)数据库的信息

开源漏洞(OSV)是一种漏洞数据库和监控服务,侧重于跟踪和管理开源软件中的安全漏洞。

OSV 提供开源项目中已知安全漏洞的全面、最新的数据库。它涵盖了广泛的开源软件,包括库、框架和软件开发中使用的其他组件。有关包含生态系统的完整列表,请参阅 定义的生态系统

Clair 还通过开源漏洞(OSV)数据库报告 golangjavaruby 生态系统的漏洞和安全信息。

通过利用 OSV,开发人员和组织可以主动监控和解决其使用的开源组件中的安全漏洞,这有助于降低安全漏洞和数据遭受攻击的风险。

有关 OSV 的更多信息,请参阅 OSV 网站

7.2. 在独立的 Red Hat Quay 部署上设置 Clair

对于独立的 Red Hat Quay 部署,您可以手动设置 Clair。

流程

  1. 在 Red Hat Quay 安装目录中,为 Clair 数据库数据创建新目录:

    $ mkdir /home/<user-name>/quay-poc/postgres-clairv4
  2. 输入以下命令为 postgres-clairv4 文件设置适当的权限:

    $ setfacl -m u:26:-wx /home/<user-name>/quay-poc/postgres-clairv4
  3. 输入以下命令部署 Clair Postgres 数据库:

    $ sudo podman run -d --name postgresql-clairv4 \
      -e POSTGRESQL_USER=clairuser \
      -e POSTGRESQL_PASSWORD=clairpass \
      -e POSTGRESQL_DATABASE=clair \
      -e POSTGRESQL_ADMIN_PASSWORD=adminpass \
      -p 5433:5433 \
      -v /home/<user-name>/quay-poc/postgres-clairv4:/var/lib/pgsql/data:Z \
      registry.redhat.io/rhel8/postgresql-13:1-109
  4. 为您的 Clair 部署安装 Postgres uuid-ossp 模块:

    $ podman exec -it postgresql-clairv4 /bin/bash -c 'echo "CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\"" | psql -d clair -U postgres'

    输出示例

    CREATE EXTENSION

    注意

    Clair 需要将 uuid-ossp 扩展添加到其 Postgres 数据库中。对于具有适当权限的用户,Clair 将自动添加扩展。如果用户没有正确的权限,则必须在启动 Clair 前添加扩展。

    如果没有扩展,当 Clair 尝试启动时会显示以下错误: ERROR: Please load the "uuid-ossp" 扩展。(SQLSTATE 42501).

  5. 如果 Quay 容器正在运行,并在配置模式中重启它,将现有配置载入为卷:

    $ sudo podman run --rm -it --name quay_config \
      -p 80:8080 -p 443:8443 \
      -v $QUAY/config:/conf/stack:Z \
      registry.redhat.io/quay/quay-rhel8:{productminv} config secret
  6. 登录到配置工具,再单击 UI 的 Security Scanner 部分中的 Enable Security Scanning
  7. 使用 quay-server 系统上尚未使用的端口设置 Clair 的 HTTP 端点,例如 8081
  8. 使用 Generate PSK 按钮创建预共享密钥(PSK)。

    安全扫描器 UI

    Security Scanner

  9. 验证并下载 Red Hat Quay 的 config.yaml 文件,然后停止运行配置编辑器的 Quay 容器。
  10. 将新配置捆绑包提取到 Red Hat Quay 安装目录中,例如:

    $ tar xvf quay-config.tar.gz -d /home/<user-name>/quay-poc/
  11. 为您的 Clair 配置文件创建一个文件夹,例如:

    $ mkdir /etc/opt/clairv4/config/
  12. 进入 Clair 配置文件夹:

    $ cd /etc/opt/clairv4/config/
  13. 创建 Clair 配置文件,例如:

    http_listen_addr: :8081
    introspection_addr: :8088
    log_level: debug
    indexer:
      connstring: host=quay-server.example.com port=5433 dbname=clair user=clairuser password=clairpass sslmode=disable
      scanlock_retry: 10
      layer_scan_concurrency: 5
      migrations: true
    matcher:
      connstring: host=quay-server.example.com port=5433 dbname=clair user=clairuser password=clairpass sslmode=disable
      max_conn_pool: 100
      migrations: true
      indexer_addr: clair-indexer
    notifier:
      connstring: host=quay-server.example.com port=5433 dbname=clair user=clairuser password=clairpass sslmode=disable
      delivery_interval: 1m
      poll_interval: 5m
      migrations: true
    auth:
      psk:
        key: "MTU5YzA4Y2ZkNzJoMQ=="
        iss: ["quay"]
    # tracing and metrics
    trace:
      name: "jaeger"
      probability: 1
      jaeger:
        agent:
          endpoint: "localhost:6831"
        service_name: "clair"
    metrics:
      name: "prometheus"

    有关 Clair 的配置格式的更多信息,请参阅 Clair 配置参考

  14. 使用容器镜像启动 Clair,从您创建的文件中挂载在配置中:

    $ sudo podman run -d --name clairv4 \
    -p 8081:8081 -p 8088:8088 \
    -e CLAIR_CONF=/clair/config.yaml \
    -e CLAIR_MODE=combo \
    -v /etc/opt/clairv4/config:/clair:Z \
    registry.redhat.io/quay/clair-rhel8:v3.9.6
    注意

    也有可能运行多个 Clair 容器,但对于单一容器以外的部署场景,我们强烈建议使用 Kubernetes 或 OpenShift Container Platform 等容器编配器。

7.3. OpenShift Container Platform 上的 Clair

要在 OpenShift Container Platform 上的 Red Hat Quay 部署上设置 Clair v4 (Clair),建议使用 Red Hat Quay Operator。默认情况下,Red Hat Quay Operator 将安装和升级 Clair 部署,以及您的 Red Hat Quay 部署并自动配置 Clair。

7.4. 测试 Clair

使用以下步骤在一个独立 Red Hat Quay 部署或基于 OpenShift Container Platform Operator 的部署中测试 Clair。

先决条件

  • 您已部署了 Clair 容器镜像。

流程

  1. 输入以下命令拉取示例镜像:

    $ podman pull ubuntu:20.04
  2. 输入以下命令将镜像标记到 registry:

    $ sudo podman tag docker.io/library/ubuntu:20.04 <quay-server.example.com>/<user-name>/ubuntu:20.04
  3. 输入以下命令将镜像推送到 Red Hat Quay registry:

    $ sudo podman push --tls-verify=false quay-server.example.com/quayadmin/ubuntu:20.04
  4. 通过 UI 登录您的 Red Hat Quay 部署。
  5. 单击存储库名称,如 quayadmin/ubuntu
  6. 在导航窗格中,点 Tags

    报告概述

    Security scan information appears for scanned repository images

  7. 点镜像报告(如 45 个介质 )以显示更详细的报告:

    报告详情

    See all vulnerabilities or only those that are fixable

    注意

    在某些情况下,Clair 显示有关镜像的重复报告,例如 ubi8/nodejs-12ubi8/nodejs-16。这是因为名称相同的漏洞适用于不同的软件包。这个行为预期为 Clair 漏洞报告,且不会作为程序错误解决。

第 8 章 仓库镜像

8.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 执行。

8.2. 与 geo-replication 相比的存储库镜像

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

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

存储库镜像将所选存储库或存储库的子集从一个 registry 同步到另一个 registry。registry 有所不同,每个 registry 都有单独的数据库和单独的镜像存储。

镜像的主要用例包括:

  • 在不同数据中心或区域中的独立 registry 部署,其中整个内容的某些子集应在数据中心和区域间共享
  • 从外部 registry 自动同步或镜像所选(允许)上游存储库到本地 Red Hat Quay 部署
注意

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

表 8.1. Red Hat Quay 仓库镜像和地理复制比较

功能/能力geo-replication仓库镜像

旨在做什么?

共享的全局 registry

不同的 registry

复制或镜像尚未完成时会发生什么?

使用远程副本(下下)

没有提供镜像

是否可以访问这两个区域中的所有存储后端?

是(所有 Red Hat Quay 节点)

否(区分存储)

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

所有 registry 内容和配置是否适用于所有区域(共享数据库)?

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

用户可以应用过滤器来同步规则?

每个区域中允许的独立/不同的角色访问控制配置

8.3. 使用存储库镜像

以下列表显示 Red Hat Quay 存储库镜像的特性和限制:

  • 使用存储库镜像,您可以镜像整个存储库,或有选择限制同步哪些镜像。过滤器可以基于以逗号分隔的标签列表、一系列标签,或者通过 Unix shell 风格的通配符来识别标签。如需更多信息,请参阅 通配符 文档。
  • 当将存储库设置为 mirror 时,您无法手动将其他镜像添加到该存储库中。
  • 由于已镜像的存储库基于您设置的存储库和标签,因此它将只保存由存储库和标签对表示的内容。例如,如果您更改了标签,以便存储库中的某些镜像不再匹配,则这些镜像将被删除。
  • 只有指定的机器机器才能将镜像推送到已镜像的存储库,并取代存储库上设置的任何基于角色的访问控制权限。
  • 镜像可以被配置为在失败时回滚,或者以 最佳为先运行。
  • 使用已镜像的存储库时,具有读取权限 的用户可以从存储库拉取镜像,但不能将镜像推送到存储库。
  • 可以使用您创建的镜像存储库的 RepositoriesMirrors 选项卡在 Red Hat Quay 用户界面中执行已镜像存储库的设置。
  • 镜像以设定的间隔同步,但也可以根据需要同步。

8.4. 镜像配置 UI

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

    Enable mirroring and require HTTPS and verified certificates

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

8.5. 镜像配置字段

表 8.2. 镜像配置

字段类型描述

FEATURE_REPO_MIRROR

布尔值

启用或禁用存储库镜像

默认: false

REPO_MIRROR_INTERVAL

Number

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

默认:30

REPO_MIRROR_SERVER_HOSTNAME

字符串

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

Default: None

Example:
openshift-quay-service

REPO_MIRROR_TLS_VERIFY

布尔值

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

默认: false

REPO_MIRROR_ROLLBACK

布尔值

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

默认false

8.6. 镜像 worker

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

流程

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

    $ sudo podman run -d --name mirroring-worker \
      -v $QUAY/config:/conf/stack:Z \
      registry.redhat.io/quay/quay-rhel8:v3.9.6 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 \
      registry.redhat.io/quay/quay-rhel8:v3.9.6 repomirror

8.7. 创建已镜像的存储库

从外部容器 registry 镜像存储库时,您必须创建一个新的私有存储库。通常,名称与目标存储库相同,如 quay-rhel8

Create new Red Hat Quay repo

8.7.1. 存储库镜像设置

使用以下步骤调整已镜像存储库的设置。

前提条件

  • 您已在 Red Hat Quay 配置文件中启用了存储库镜像。
  • 您已部署了镜像 worker。

流程

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

    Create a new Red Hat Quay repo mirror

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

    Repository mirroring

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

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

8.7.2. 高级设置

Advanced Settings 部分中,您可以使用以下选项配置 SSL/TLS 和代理:

  • 验证 TLS: 如果您需要 HTTPS,并在与目标远程 registry 通信时验证证书,请选择这个选项。
  • 接受未签名的镜像 : 选择这个选项允许镜像未签名的镜像。
  • HTTP Proxy: 如果您需要 HTTPS,并在与目标远程 registry 通信时验证证书,请选择这个选项。
  • https PROXY: 如果需要代理服务器,请识别访问远程站点所需的 HTTPS 代理服务器。
  • 无代理: 不需要代理的位置列表。

8.7.3. 现在同步

使用以下步骤启动镜像操作。

流程

  • 要执行即时镜像操作,请在存储库镜像选项卡中按立即同步按钮。日志在 Usage Logs 标签页中可用:

    Usage logs

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

    Repository mirroring tags

    以下是已完成的仓库镜像屏幕示例:

    Repository mirroring details

8.8. 用于镜像的事件通知

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

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

事件可以在每个存储库的 Settings 选项卡中配置,并且支持电子邮件、Slack、Quay UI 和 Webhook 等所有现有通知方法。

8.9. 镜像标签模式

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

8.9.1. 模式语法

pattern

描述

*

匹配所有字符

?

匹配任何单个字符

[seq]

匹配顺序中 的任何字符

[!seq]

匹配任何不在顺序 中的字符

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

8.10. 使用已镜像的存储库

创建已镜像的存储库后,您可以使用该存储库的方法。从 Repositories 页面中选择您的镜像存储库,并执行以下操作:

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

    View logs for your Red Hat Quay repo mirror

  • 现在同步镜像 :要立即同步存储库中的镜像,请选择 Sync Now 按钮。
  • 更改凭证 :要更改用户名和密码,请从 Credentials 行选择 DELETE。然后,选择 None 并添加在提示时登录到外部 registry 所需的用户名和密码。
  • 取消镜像 :要停止镜像,这样可保持当前镜像可用,但停止新的镜像同步,请选择 CANCEL 按钮。
  • 设置机器人权限 :Red Hat Quay 机器人帐户命名为 token,用于保存用于访问外部存储库的凭证。通过将凭证分配给机器机器,该机器可以在需要访问同一外部 registry 的多个已镜像存储库中使用。

    您可以通过转至 Account Settings 来为存储库分配现有机器机器,然后在左列中选择立即登录帐户图标。对于 robot 帐户,选择 REPOSITORIES 列下的链接。在弹出窗口中,您可以:

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

    Assign permission to a robot

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

8.11. 仓库镜像建议

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

  • 仓库镜像 pod 可以在任何节点上运行。这意味着您可以在已在运行 Red Hat Quay 的节点上运行镜像。
  • 存储库镜像调度到数据库中,并批量运行。因此,存储库 worker 会检查每个存储库镜像配置文件,并在下一次同步需要时读取。更多镜像 worker 意味着可以同时镜像更多存储库。例如,运行 10 个镜像 worker 表示用户可以并行运行 10 个镜像 Operator。如果用户只有 2 个带有 10 个镜像配置的 worker,则只能执行 2 个 operator。
  • 镜像 pod 的最佳数量取决于以下条件:

    • 要镜像的存储库总数
    • 存储库中的镜像和标签数量以及更改的频率
    • 并行批处理

      例如,如果用户正在镜像具有 100 标签的存储库,则镜像将由一个 worker 完成。用户必须考虑需要并行镜像的软件仓库数量,并基于该 worker 数量。

      同一存储库中的多个标签无法并行镜像。

第 9 章 IPv6 和双栈部署

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

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

9.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 limitations] 禁止。

警告

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

9.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 功能都可以正常使用,只要您的环境是为双栈配置的。

9.3. IPv6 和 dua-stack 限制

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

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

  • 目前,尝试使用 Amazon S3 CloudFront 配置 Red Hat Quay 部署不适用于 IPv6 单堆栈环境。由于 Amazon S3 CloudFront 的端点不支持 IPv6,所以这个问题还没有临时解决方案。

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

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

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

10.1. 启用 LDAP 时的注意事项

在为 Red Hat Quay 部署启用 LDAP 之前,您应该考虑以下内容:

现有的 Red Hat Quay 部署

当您为已经配置了用户的现有 Red Hat Quay 部署启用 LDAP 时,用户名之间可能会出现冲突。例如,在启用 LDAP 之前,在 Red Hat Quay 中手动创建了一个用户 alice。如果 LDAP 目录中也存在 username alice ,当 alice 第一次使用 LDAP 登录时,Red Hat Quay 会自动创建一个新的用户 alice-1。Red Hat Quay 随后会自动将 LDAP 凭据映射到 alice 帐户。出于一致性的原因,您的 Red Hat Quay 部署可能会出现错误。建议您在启用 LDAP 之前从 Red Hat Quay 中删除任何可能冲突的本地帐户名称。

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

当为 LDAP 配置 Red Hat Quay 时,如果配置选项 FEATURE_USER_CREATION 设置为 true,则在第一次登录时会在 Red Hat Quay 的数据库中自动创建 LDAP 验证的用户。如果此选项设为 false,则 LDAP 用户自动创建用户会失败,并且不允许该用户登录。在这种情况下,超级用户需要首先创建所需的用户帐户。相反,如果将 FEATURE_USER_CREATION 设置为 true,这也意味着用户仍然可以从 Red Hat Quay 登录屏幕创建一个帐户,即使 LDAP 中存在对等用户。

10.2. 为 Red Hat Quay 配置 LDAP

使用以下步骤为您的 Red Hat Quay 部署配置 LDAP。

流程

  1. 您可以使用 Red Hat Quay 配置工具来配置 LDAP。

    1. 使用 Red Hat Quay 配置工具,找到 Authentication 部分。从下拉菜单中选择 LDAP,并根据需要更新 LDAP 配置字段。

      LDAP configuration fields

    2. 可选。在 团队同步 框中,点 Enable Team Syncrhonization Support。启用团队同步后,作为超级用户的 Red Hat Quay 管理员可以设置团队,使其成员资格与 LDAP 中的后备组同步。

      Team synchronization

    3. 对于 Resynchronization 持续时间,请输入 60m。这个选项设定必须重新同步团队的重新同步持续时间。必须设置此字段类似以下示例: 30m1h1d
    4. 可选。对于 自助服务团队同步设置,您可以点 Allow non-superusers 来启用和管理团队同步,以允许超级用户在管理员管理员的机构下启用和管理团队同步。

      Team synchronization

    5. 找到 LDAP URI 框并提供完整的 LDAP URI,包括 ldap://ldaps:// 前缀,例如 ldap://117.17.8.101

      LDAP server URI

    6. Base DN 下,提供一个名称来组成查找所有 LDAP 记录的基本路径,例如: o=<organization_id&gt; , dc=<example_domain_component>,dc=com

      Distinguished Names

    7. User Relative DN 下,提供 Distinguished Name 路径列表,其形成查找与上面定义基本 DN 相关的所有用户 LDAP 记录的第二个基本路径。例如: uid=<name>,ou=Users,o=<organization_id>,dc=<example_domain_component>,dc=com。如果用户无法通过主相对 DN 找到,则会尝试此路径或这些路径。

      User Relative DN

      注意

      用户相对 DN 相对于 基本 DN,例如 ou=Users 而不是 ou=Users,dc=<example_domain_component>,dc=com

    8. 可选。如果有多个 用户对象所在的机构单元,请提供二级用户 Relative DN。您可以在机构单元中键入,然后点 Add 添加多个 RDN。例如: ou=Users,ou=NYC 和 ou=Users,ou=SFO

      具有子树范围的用户 相对 DN 搜索。例如,如果您的组织在用户 OU 下有机构单元 NYCSFO (即 ou=SFO、ou=Users 和 ou=NYC,ou=Users ),则 Red Hat Quay 可以从 NYCSFO 机构单元下验证用户(如果用户 Relative DN 设置为 Users (ou=Users))。

    9. 可选。如果需要,为所有用户查询填写 Additional User Filter Expression 字段。过滤器中使用的区分名称必须完全基于。Base DN 不会被自动添加到此字段中,您必须将文本嵌套为括号,例如 (memberOf=cn=developers,ou=groups,dc= ,dc=<example_domain_component> com)

      Additional User Filter

    10. 填写 Red Hat Quay 管理员帐户的 Administrator DN 字段。此帐户必须能够登录并查看所有用户帐户的记录。例如: uid=& lt;name>,ou=Users,o=<organization_id>,dc=<example_domain_component>,dc=com

      Administrator DN

    11. 填写 Administrator DN Password 字段。这是管理员可分辨名称的密码。

      重要

      此字段的密码存储在 config.yaml 文件的纯文本中。强烈建议使用密码哈希设置专用帐户。

    12. 可选。填写 UID Attribute 字段。这是存储用户用户名的 LDAP 用户记录中的 property 字段的名称。最常见的是,在此字段中输入 uid。此字段可用于登录到 Red Hat Quay 部署。

      UID Attribute

    13. 可选。填写 Mail Attribute 字段。这是存储用户电子邮件地址的 LDAP 用户记录中的 property 字段的名称。最常见的是,在此字段中输入 mail。此字段可用于登录到 Red Hat Quay 部署。

      Mail Attribute

      注意
      • 用户 Relative DN 中必须存在登录的用户名。
      • 如果您使用 Microsoft Active Directory 设置 LDAP 部署,则必须将 sAMAccountName 用于 UID 属性。
    14. 可选。您可以点击 Custom TLS Certificate optionl 下的 Choose File 来添加自定义 SSL/TLS 证书。另外,您可以通过选中 Allow fallback to non-TLS 连接框来启用回退到不安全的非 TLS 连接

      LDAP server SSL

      如果上传 SSl/TLS 证书,您必须提供 ldaps:// 前缀,例如 LDAP_URI: ldaps://ldap_provider.example.org

  2. 另外,您可以直接更新 config.yaml 文件,使其包含所有相关信息。例如:

    ---
    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,dc=<domain_name>,dc=com)
    LDAP_USER_RDN:
        - ou=<example_organization_unit>
        - o=<organization_id>
        - dc=<example_domain_component>
        - dc=com
  3. 添加所有所需的 LDAP 字段后,单击 Save Configuration Changes 按钮以验证配置。在继续操作前,所有验证都必须成功。通过选择 Continue Editing 按钮可以执行其他配置。

10.3. 启用 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 参数并指定受限用户组,例如:members

    ---
    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 用户会被限制为不能读取和写入内容并创建机构。

10.4. 启用 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 用户具有超级用户特权。以下选项可供超级用户使用:

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

10.5. 常见 LDAP 配置问题

以下错误可能会返回无效的配置。

  • 无效凭据。如果您收到这个错误,则管理员 DN 或管理员 DN 密码值不正确。确保您提供准确的管理员 DN 和密码值。
  • * 验证超级用户 %USERNAME% 失败。返回此错误的原因如下:

    • 未找到用户名。
    • 用户在远程身份验证系统中不存在。
    • LDAP 授权配置不正确。
  • 无法找到当前登录的用户。为 Red Hat Quay 配置 LDAP 时,可能会出现使用 管理员 DN 字段中提供的用户名和密码成功建立 LDAP 连接的情况。但是,如果无法使用 UID AttributeMail Attribute 字段在指定的 用户 Relative DN 路径中找到当前登录的用户,则通常有两个潜在的原因:

    • 当前登录的用户没有 用户 Relative DN 路径。
    • 管理员 DN 没有搜索或读取指定的 LDAP 路径的权限。

      要解决这个问题,请确保登录的用户包含在 用户 Relative DN 路径中,或者为 管理员 DN 帐户提供正确的权限。

第 11 章 为 Red Hat Quay 配置 OIDC

为 Red Hat Quay 配置 OpenID Connect (OIDC)可以为 Red Hat Quay 部署提供一些优点。例如,OIDC 允许用户使用来自 OIDC 供应商的现有凭证(如 Red Hat Single Sign-On、Google、Github、Microsoft 等)向 Red Hat Quay 进行身份验证。OIDC 的其他优点包括集中式用户管理、增强安全性和单点登录(SSO)。总体而言,OIDC 配置可以简化用户身份验证和管理,增强安全性,并为 Red Hat Quay 用户提供无缝的用户体验。

以下流程演示了如何配置 Red Hat Single Sign-On 和 Azure AD。这些步骤包括在 Red Hat Quay Operator 上配置 OIDC,以及使用 Red Hat Quay 配置工具在独立部署中配置 OIDC。

注意

按照以下步骤,无论您选择使用什么身份提供程序,您都可以在 Red Hat Quay 中添加任何 OIDC 供应商。

11.1. 为 Red Hat Quay 配置 Red Hat Single Sign-On

根据 Keycloak 项目,Red Hat Single Sign-On (RH-SSO)是一个红帽提供的开源身份和访问管理(IAM)解决方案。RH-SSO 允许组织在其系统和应用程序之间管理用户身份、安全应用程序和强制实施访问控制策略。它还提供了一个统一的身份验证和授权框架,允许用户一次登录并获得对多个应用和资源的访问权限,而无需重新验证。如需更多信息,请参阅 Red Hat Single Sign-On

通过在 Red Hat Quay 上配置 Red Hat Single Sign-On,您可以在 Red Hat Quay 和其他 OpenShift Container Platform 等应用平台之间创建无缝身份验证集成。

11.1.1. 为 Red Hat Quay Operator 配置 Red Hat Single Sign-On Operator

使用以下步骤为 OpenShift Container Platform 上的 Red Hat Quay Operator 配置 Red Hat Single Sign-On。

先决条件

  • 您已为 Red Hat Quay Operator 配置 Red Hat Single Sign-On。如需更多信息,请参阅 Red Hat Single Sign-On Operator
  • 您已为 Red Hat Quay 部署和 Red Hat Single Sign-On 配置了 TLS/SSL。
  • 您已生成了一个证书颁发机构(CA),并将其上传到 Red Hat Single Sign-On Operator Red Hat Quay 配置。
  • 已登陆到 OpenShift Container Platform 集群。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 导航到 Red Hat Single Sign-On Admin Console

    1. 在 OpenShift Container Platform Web 控制台中 导航至 NetworkRoute
    2. 从下拉列表中选择 Red Hat Single Sign-On 项目。
    3. Routes 表中查找 Red Hat Single Sign-On Admin 控制台
  2. 选择您要用来配置 Red Hat Quay 的 Realm。
  3. 单击导航面板的 Configure 部分下的 Clients,然后单击 Create 按钮为 Red Hat Quay 添加新的 OIDC。
  4. 输入以下信息。

    • 客户端 ID: quay-enterprise
    • 客户端协议: openid-connect
    • 根 URL: https://<quay endpoint>/
  5. 点击 Save。这会导致重定向到 Clients 设置面板。
  6. 导航到 Access Type 并选择 Confidential
  7. 导航到 Valid Redirect URI。您必须提供三个重定向 URI。该值应该是 Red Hat Quay registry 的完全限定域名,附加了 /oauth2/redhatsso/callback。例如:

  8. Save 并进入新的 Credentials 设置。
  9. 复制 Secret 的值。

11.1.2. 将 Red Hat Quay Operator 配置为使用 Red Hat Single Sign-On

使用以下步骤使用 Red Hat Quay Operator 配置 Red Hat Single Sign-On。

先决条件

  • 您已为 Red Hat Quay Operator 配置了 Red Hat Single Sign-On Operator。

流程

  1. 进入到 OperatorsInstalled Operators,输入 Red Hat Quay config editor 工具。点 Red Hat QuayQuay Registry。然后,单击 Red Hat Quay registry 的名称,以及通过 Config Editor Endpoint 列出的 URL。
  2. 将自定义 SSL/TLS 证书上传到 OpenShift Container Platform 部署。

    1. 导航到 Red Hat Quay 配置工具 UI。
    2. Custom SSL Certificates 下,点 Select file 并上传您的自定义 SSL/TLS 证书。
    3. 重新配置 Red Hat Quay 部署。
  3. 向下滚动到 External Authorization (OAuth) 部分。
  4. Add OIDC Provider
  5. 出现提示时,输入 redhatsso
  6. 输入以下信息:

    • OIDC 服务器: Red Hat Single Sign-On 实例的完全限定域名(FQDN),附加了 /auth/realms/ 和 Realm 名称。您必须在末尾包括正斜杠,例如 https://sso-redhat.example.com//auth/realms/<keycloak_realm_name>/
    • 客户端 ID : 被身份提供程序重新获得的应用程序的客户端 ID,如 quay-enterprise
    • Client Secret : quay-enterprise OIDC 客户端设置的 Credentials 选项卡中的 Secret。
    • Service Name: 在 Red Hat Quay 登录页面中显示的名称,例如,Red Hat Single Sign On
    • 验证电子邮件地址: 用于验证用户电子邮件地址的声明名称。
    • Login Scopes : 执行登录流时发送到 OIDC 供应商的范围,如 openid。配置后,您必须单击 Add
  7. 向下滚动并单击 Validate Configuration Changes。然后,点 Restart Now 部署启用了 OIDC 的 Red Hat Quay Operator。

11.2. 为 Red Hat Quay 配置 Azure AD OIDC

通过将 Azure AD 身份验证与 Red Hat Quay 集成,您的组织可以利用 Azure AD 提供的集中用户管理和安全功能。有些功能包括根据 Azure AD 角色和权限管理用户对 Red Hat Quay 存储库的访问权限,以及启用 Azure AD 提供的多因素身份验证和其他安全功能的功能。

Red Hat Quay 的 Azure Active Directory (Azure AD)身份验证允许用户使用其 Azure AD 凭证进行身份验证并访问 Red Hat Quay。

11.2.1. 使用 Red Hat Quay 配置工具配置 Azure AD

以下流程使用配置工具为 Red Hat Quay 配置 Azure AD。

流程

  1. 输入 Red Hat Quay config editor 工具。

    1. 如果您正在运行独立的 Red Hat Quay 部署,您可以输入以下命令:

      $ sudo podman run --rm -it --name quay_config -p 80:8080 -p 443:8443 registry.redhat.io/quay/quay-rhel8:v3.9.6 config secret

      使用您的浏览器导航到配置工具的用户界面并登录。

    2. 如果您在 Red Hat Quay Operator 中,进入 OperatorsInstalled Operators。点 Red Hat QuayQuay Registry。然后,单击 Red Hat Quay registry 的名称,以及通过 Config Editor Endpoint 列出的 URL。
  2. 向下滚动到 External Authorization (OAuth) 部分。
  3. Add OIDC Provider
  4. 出现提示时,输入 ODIC 供应商的 ID。

    注意

    您的 OIDC 服务器必须以 / 结尾。

  5. 添加 ODIC 供应商后,Red Hat Quay 会列出必须在 Azure 上注册的三个回调 URL。这些地址允许 Azure 在验证后直接回退到 Red Hat Quay。例如:

    • https://QUAY_HOSTNAME/oauth2/<name_of_service>/callback
    • https://QUAY_HOSTNAME/oauth2/<name_of_service>/callback/attach
    • https://QUAY_HOSTNAME/oauth2/<name_of_service>/callback/cli
  6. 设置完所有必填字段后,单击 Validate Configuration Changes 来验证您的设置。如果报告任何错误,请继续编辑您的配置,直到设置有效,Red Hat Quay 可以连接到您的数据库和 Redis 服务器。

11.2.2. 通过更新 Red Hat Quay config.yaml 文件配置 Azure AD

使用以下步骤通过直接更新 Red Hat Quay config.yaml 文件来配置 Azure AD。

流程
  • 使用以下步骤,您可以在 Red Hat Quay 中添加任何 ODIC 供应商,而不考虑正在添加哪些身份提供程序。
  • 如果您的系统启用了防火墙,或者启用了代理,则必须将创建的每个 Oauth 应用程序的所有 Azure API 端点列入白名单。否则,会返回以下错误: x509: certificate signed by unknown authority
  1. 在 Red Hat Quay config.yaml 文件中添加以下信息:

    AZURE_LOGIN_CONFIG: 1
        CLIENT_ID: <client_id> 2
        CLIENT_SECRET: <client_secret> 3
        OIDC_SERVER: <oidc_server_address_> 4
        SERVICE_NAME: Azure AD 5
        VERIFIED_EMAIL_CLAIM_NAME: <verified_email> 6
    1
    包含 OIDC 配置设置的父键。在本例中,所用的父密钥是 AZURE_LOGIN_CONFIG,但字符串 AZURE 可以根据您的特定需求替换任意任意字符串,如 ABC123。但是,以下字符串不被接受: GOOGLE,GITHUB。这些字符串为其重新指定身份平台保留,且需要在您使用的平台时指定特定的 config.yaml 条目。
    2
    与身份提供程序重新加入的应用程序的客户端 ID。
    3
    与身份提供程序一起注册的应用的客户端机密。
    4
    用于身份验证的 OIDC 服务器地址。在本例中,您必须使用 sts.windows.net 作为签发者标识符。使用 https://login.microsoftonline.com 会导致以下错误: Could not create provider for AzureAD。error: oidc: issuer 与供应商返回的签发者不匹配,预期的 "https://login.microsoftonline.com/73f2e714-xxxx-xxxx-xxxx-dffe1df8a5d5" got "https://sts.windows.net/73f2e714-xxxx-xxxx-xxxx-dffe1df8a5d5/"
    5
    正在验证的服务的名称。
    6
    用于验证用户电子邮件地址的声明名称。
  2. 正确配置 Azure AD 结果使用以下格式三个重定向:

    • https://QUAY_HOSTNAME/oauth2/<name_of_service>/callback
    • https://QUAY_HOSTNAME/oauth2/<name_of_service>/callback/attach
    • https://QUAY_HOSTNAME/oauth2/<name_of_service>/callback/cli
  3. 重启 Red Hat Quay 部署。

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

Red Hat Quay 在每个实例上导出 Prometheus和 Grafana 兼容的端点,以允许轻松监控和警报。

12.1. 公开 Prometheus 端点

12.1.1. 独立 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.9.6

现在,指标将可用:

$ curl quay.example.com:9091/metrics

有关配置 Prometheus 和 Grafana 以监控 Quay 存储库计数的详情,请参阅使用 Prometheus 和 Grafana 监控 Quay。

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

12.1.3. 设置 Prometheus 以使用指标

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

12.1.4. Kubernetes 下的 DNS 配置

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

12.1.5. 手动集群的 DNS 配置

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

12.2. 指标简介

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

12.2.1. 常规 registry 统计

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

指标名称描述

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

12.2.2. 队列项

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

指标名称描述

quay_queue_items_available

特定队列中的项目数

quay_queue_items_locked

正在运行的项目数

quay_queue_items_available_unlocked

等待处理的项目数

指标标签

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

    • exportactionlogs : 排队请求以导出操作日志。这些日志随后会被处理并放入存储中。然后,通过电子邮件将链接发送到请求者。
    • namespacegc:排队进行垃圾回收的命名空间
    • 通知:要发送的存储库通知的队列
    • repositorygc: 要收集垃圾收集的队列存储库
    • secscanv4: 特定于 Clair V4 的通知队列
    • dockerfilebuild: Quay docker 构建队列
    • Imagestoragereplication : 要在多个存储间复制排队 Blob
    • chunk_cleanup : 需要删除队列 Blob 段。这仅适用于某些存储实施,如 Swift。

例如,queue labelled 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

12.2.3. 垃圾回收指标

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

指标名称描述

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

12.2.3.1. 多部分上传指标

多部分上传指标显示上传到存储的 Blob 数量(S3、Rados、GoogleCloudStorage、RHOCS)。当 Quay 无法正确将 Blob 上传到存储中时,这有助于识别问题。

指标名称描述

quay_multipart_uploads_started_total

启动的上传到 Quay 存储的 multipart 数

quay_multipart_uploads_completed_total

完成的上传到 Quay 存储的 multipart 数

指标输出示例

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

12.2.4. 镜像拉取(pull)/拉取指标

与推送和拉取镜像相关的可用指标数据的数量。

12.2.4.1. 镜像拉取(pull)总数

指标名称描述

quay_registry_image_pulls_total

从 registry 下载的镜像数量。

指标标签

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

12.2.4.2. 镜像拉取(pull)的镜像拉取(pull)

指标名称描述

quay_registry_image_pulled_estimated_bytes_total

从 registry 下载的字节数

指标标签

  • 协议: 使用的 registry 协议(应该始终为 v2)

12.2.4.3. 镜像推送总数

指标名称描述

quay_registry_image_pushes_total

从 registry 上传的镜像数量。

指标标签

  • 协议: 使用的 registry 协议(应该始终为 v2)
  • pstatus: 请求的 http 返回码
  • pmedia_type : 上传的清单类型

12.2.4.4. 推送的镜像字节

指标名称描述

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

12.2.5. 身份验证指标

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

指标名称描述

quay_authentication_attempts_total

跨 registry 和 API 的身份验证尝试次数

指标标签

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

    • 基本的
    • oauth
    • credentials
  • 成功: 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
...

第 13 章 Red Hat Quay 配额管理和强制概述

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

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

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

13.1. 配额管理架构

启用配额管理功能后,单独的 blob 大小在存储库和命名空间级别总和。例如,如果同一存储库中的两个标签引用同一 blob,则该 Blob 的大小仅计算为仓库总计一次。另外,清单列表总数计算为存储库总计。

重要

因为清单列表总数被计算为仓库总计,所以从以前的 Red Hat Quay 版本升级时消耗的总配额可能会在 Red Hat Quay 3.9 中被报告不同。在某些情况下,新总数可能会超过存储库的之前设置的限制。Red Hat Quay 管理员可能需要调整存储库所分配的配额,以考虑这些更改。

配额管理功能的工作原理是,使用回填 worker 计算现有存储库和命名空间的大小,然后从总镜像添加或减去,这些镜像被推送或垃圾收集到每个镜像。另外,在收集清单时,从总的减法中减去。

注意

因为减法发生在清单垃圾回收时的总数,所以大小计算会有一个延迟,直到它能够收集垃圾回收为止。有关垃圾回收的更多信息,请参阅 Red Hat Quay 垃圾回收

以下数据库表包含机构中 Red Hat Quay 仓库的配额存储库大小、配额命名空间大小和配额 registry 大小(以字节为单位):

  • QuotaRepositorySize
  • QuotaNameSpaceSize
  • QuotaRegistrySize

组织大小由回填 worker 计算,以确保不会重复。初始化镜像推送时,用户的机构存储会被验证,以检查它是否超过配置的配额限制。如果镜像推送超过定义的配额限制,则会出现软或硬检查:

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

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

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

13.2. 配额管理限制

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

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

表 13.1. worker 计数环境变量

变量Description

Postgres

8388608 TB

MySQL

8388608 TB

SQL Server

16777216 TB

13.3. Red Hat Quay 3.9 的配额管理

如果要升级到 Red Hat Quay 3.9,您必须重新配置配额管理功能。这是因为在 Red Hat Quay 3.9 中,计算方式不同。因此,Red Hat Quay 3.9 之前的总数不再有效。在 Red Hat Quay 3.9 中配置配额管理有两种方法,其在以下部分中详细介绍。

注意
  • 这是在升级到 Red Hat Quay 3.9 后必须完成的一个时间计算。
  • 创建、更新和删除配额需要超级用户权限。虽然可以为用户和机构设置配额,但您无法使用 Red Hat Quay UI 重新配置 用户配额,且必须使用 API。

13.3.1. 选项 A:通过调整 QUOTA_TOTAL_DELAY 功能标记,为 Red Hat Quay 3.9 配置配额管理

通过调整 QUOTA_TOTAL_DELAY 功能标记,使用以下步骤重新计算 Red Hat Quay 3.9 配额管理。

注意

通过重新计算选项,总数显示为 0.00 KB,直到为 QUOTA_TOTAL_DELAY 指定的分配时间为止。

先决条件

  • 您已升级到 Red Hat Quay 3.9。
  • 以超级用户身份登录到 Red Hat Quay 3.9。

流程

  1. 使用以下 config.yaml 设置部署 Red Hat Quay 3.9:

    FEATURE_QUOTA_MANAGEMENT: true
    FEATURE_GARBAGE_COLLECTION: true
    PERMANENTLY_DELETE_TAGS: true
    QUOTA_TOTAL_DELAY_SECONDS: 1800 1
    RESET_CHILD_MANIFEST_EXPIRATION: true
    1
    QUOTA_TOTAL_DELAY_SECONDS 标志默认为 1800 秒或 30 分钟。这允许 Red Hat Quay 3.9 在配额管理功能开始计算推送的每个 Blob 的存储消耗前成功部署。将此标志设置为较低数字可能会导致计算错误 ; 必须将其设置为一个大于 Red Hat Quay 部署启动的时间。1800 是推荐的设置,但启动时间大于 30 分钟的大型部署可能需要较长的时间超过 1800
  2. 导航到 Red Hat Quay UI,再点您的机构名称。
  3. 使用 的总配额数应为 0.00 KB。此外,也应当存在 Backfill Queued 指示符。
  4. 在分配的时间(例如 30 分钟)后,刷新您的 Red Hat Quay 部署页面并返回到您的机构。现在,应该会显示 Total Quota Consumed

13.3.2. 选项 B:通过将 QUOTA_TOTAL_DELAY_SECONDS 设置为 0 来为 Red Hat Quay 3.9 配置配额管理

使用以下步骤,通过将 QUOTA_TOTAL_DELAY_SECONDS 设置为 0 来重新计算 Red Hat Quay 3.9 配额管理。

注意

使用此选项可防止进行错误计算,但会更多时间密集型。当 Red Hat Quay 部署将 FEATURE_QUOTA_MANAGEMENT 参数从 false 改为 true 时,请使用以下步骤。大多数用户都会找到 xref:

先决条件

  • 您已升级到 Red Hat Quay 3.9。
  • 以超级用户身份登录到 Red Hat Quay 3.9。

流程

  1. 使用以下 config.yaml 设置部署 Red Hat Quay 3.9:

    FEATURE_GARBAGE_COLLECTION: true
    FEATURE_QUOTA_MANAGEMENT: true
    QUOTA_BACKFILL: false
    QUOTA_TOTAL_DELAY_SECONDS: 0
    PERMANENTLY_DELETE_TAGS: true
    RESET_CHILD_MANIFEST_EXPIRATION: true
  2. 导航到 Red Hat Quay UI,再点您的机构名称。
  3. 使用 的总配额数应为 0.00 KB
  4. 重新部署 Red Hat Quay,并将 QUOTA_BACKFILL 标志设为 true。例如:

    QUOTA_BACKFILL: true
    注意

    如果您选择在计算总数后禁用配额管理,Red Hat Quay 会将这些总数标记为 stale。如果您将来再次重新启用配额管理功能,则回填 worker 会重新计算这些命名空间和存储库。

13.4. 测试 Red Hat Quay 3.9 的配额管理

为 Red Hat Quay 3.9 配置配额管理后,复制镜像现在只计算在仓库总数中一次。

使用以下步骤测试 duplicative 镜像只计算到存储库总计一次。

先决条件

  • 您已为 Red Hat Quay 3.9 配置了配额管理。

流程

  1. 输入以下命令拉取示例镜像 ,如 iwl:18.04

    $ podman pull ubuntu:18.04
  2. 输入以下命令标记同一镜像两次:

    $ podman tag docker.io/library/ubuntu:18.04 quay-server.example.com/quota-test/ubuntu:tag1
    $ podman tag docker.io/library/ubuntu:18.04 quay-server.example.com/quota-test/ubuntu:tag2
  3. 输入以下命令将示例镜像推送到您的机构:

    $ podman push --tls-verify=false quay-server.example.com/quota-test/ubuntu:tag1
    $ podman push --tls-verify=false quay-server.example.com/quota-test/ubuntu:tag2
  4. 在 Red Hat Quay UI 上,导航到 Organization,再单击 Repository Name,例如 quota-test/ubuntu。然后,单击 标签。应当有两个存储库标签 tag1tag2,各自具有相同的清单。例如:

    Manifest example

    但是,通过单击 Organization 链接,可以看到 Total Quota Consumed27.94 MB,这意味着 Ubuntu 镜像仅被一次考虑:

    Total quota consumed

    如果您删除其中一个 Ubuntu 标签,则 总配额 Consumed 保持不变。

    注意

    如果您将 Red Hat Quay 时间机器配置为大于 0 秒,则只有这些标签通过时间窗时才会发生减法。如果要加快永久删除,请参阅 Red Hat Quay 3.9 中永久删除镜像标签。

13.5. 设置默认配额

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

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

有关 DEFAULT_SYSTEM_REJECT_QUOTA_BYTES 标志的更多信息,

请参阅链接:

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

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

先决条件

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

流程

  1. 创建新机构或选择一个现有组织。最初,没有配置配额,如 Organization Settings 选项卡中可以看到:

    No Quota Configured

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

    Organization options

  3. 单击 Configure Quota,再输入初始配额,例如 10 MB。然后点 ApplyClose

    Initial quota

  4. 检查超级用户面板中的 Manage Organizations 标签页上显示有 0 of 10 MB 的配额:

    Initial consumed quota

    所消耗的配额信息也可直接在 Organization 页面中可用:

    初始消耗的配额

    Initial consumed quota

  5. 要将配额增加到 100MB,请导航到超级用户面板上的 Manage Organizations 选项卡。单击 Options 图标,再选择 Configure Quota,将配额设置为 100 MB。点 Apply,然后点 Close

    Increase quota

  6. 输入以下命令拉取示例镜像:

    $ podman pull ubuntu:18.04
  7. 输入以下命令标记示例镜像:

    $ podman tag docker.io/library/ubuntu:18.04 example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:18.04
  8. 输入以下命令将示例镜像推送到机构:

    $ podman push --tls-verify=false example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:18.04
  9. 在超级用户面板中,会显示每个机构消耗的配额:

    Total Quota Consumed for first image

  10. Organization 页面显示镜像使用的配额的总比例:

    第一个镜像使用的总配额

    Total Quota Consumed for first image

  11. 输入以下命令拉取第二个示例镜像:

    $ podman pull nginx
  12. 输入以下命令标记第二个镜像:

    $ podman tag docker.io/library/nginx example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/nginx
  13. 输入以下命令将第二个镜像推送到机构:

    $ podman push --tls-verify=false example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/nginx
  14. Organization 页面显示该机构中每个存储库使用的配额的总比例:

    每个软件仓库使用的总配额

    Total Quota Consumed for each repository

  15. 创建 拒绝 和警告 限制:

    从超级用户面板中,导航到 Manage Organizations 选项卡。单击机构的 Options 图标,然后选择 Configure Quota。在 Quota Policy 部分,将 Action 类型设置为 Reject,将 Quota Threshold 设置为 80 并点 Add Limit

    Reject limit

  16. 要创建 警告 限制,请选择 Warning 作为 Action 类型,将 Quota Threshold 设置为 70,然后点 Add Limit

    Warning limit

  17. 点配额弹出窗口中的 Close。这些限制可在 Organization 页面的 Settings 选项卡中查看,但不能编辑:

    Quota policy in organization settings

  18. 推送超过拒绝限制的镜像:

    由于 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

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

    配额通知

    Quota notifications

13.7. 使用 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

输出示例

[]

13.7.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"

13.7.2. 查看配额

要查看应用的配额,GET 数据来自 /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": 10485760,
    "default_config": false,
    "limits": [],
    "default_config_exists": false
  }
]

13.7.3. 修改配额

要修改现有的配额(在这个实例中从 10 MB 改为 100 MB),使用到 /api/v1/organization/{orgname}/quota/{quota_id} 端点的 PUT 数据:

示例命令

$ 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
}

13.7.4. 推送镜像

要查看消耗的存储,请将各种镜像推送到机构。

13.7.4.1. Pushing 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

13.7.4.2. 使用 API 查看配额使用情况

要查看消耗的存储,针对 /api/v1/repository 端点使用 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/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
    }
  ]
}

13.7.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
      }
    }

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

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

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

13.7.5.1. 设置拒绝和警告限制

要设置 拒绝和警告 限制,请将数据 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

13.7.5.2. 查看拒绝和警告限制

要查看 拒绝和警告 限制,请使用 /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
  }
]

13.7.5.3. 超过拒绝限制时推送镜像

在本例中,拒绝限制(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

13.7.5.4. 超过限制的通知

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

配额通知

Quota notifications

13.8. 计算 Red Hat Quay 3.9 中 registry 的总大小

使用以下步骤对 registry 的总计算进行队列。

注意

这个功能是按需完成的,计算 registry 总计是数据库密集型。请谨慎使用。

先决条件

  • 您已升级到 Red Hat Quay 3.9。
  • 以 Red Hat Quay 超级用户身份登录。

流程

  1. 在 Red Hat Quay UI 中,点击您的 username → Super User Admin Panel
  2. 在导航窗格中,单击 Manage Organizations
  3. Calculate,单击 Total Registry Size: 0.00 KB, Updated: Never , Calculation required。然后,单击确定
  4. 几分钟后,根据 registry 的大小,刷新页面。现在,应计算 Total Registry Size。例如:

    Total registry size

13.9. 永久删除镜像标签

在某些情况下,用户可能想要删除时间窗外的镜像标签。使用以下步骤手动删除镜像标签。

重要

以下流程的结果无法撤消。请谨慎使用。

13.9.1. 使用 Red Hat Quay v2 UI 永久删除镜像标签

使用以下步骤通过 Red Hat Quay v2 UI 永久删除镜像标签。

先决条件

  • 您已在 config.yaml 文件中将 FEATURE_UI_V2 设置为 true

流程

  1. config.yaml 文件中,确保将 PERMANENTLY_DELETE_TAGSRESET_CHILD_MANIFEST_EXPIRATION 参数设置为 true。例如:

    PERMANENTLY_DELETE_TAGS: true
    RESET_CHILD_MANIFEST_EXPIRATION: true
  2. 在导航窗格中,单击 Repositories
  3. 单击存储库的名称,例如 quayadmin/busybox
  4. 选中要删除的镜像标签框,例如 test
  5. ActionsPermanently Delete

    重要

    此操作是永久的,无法撤销。

13.9.2. 使用 Red Hat Quay 传统 UI 永久删除镜像标签

使用以下步骤通过 Red Hat Quay legacy UI 永久删除镜像标签。

流程

  1. config.yaml 文件中,确保将 PERMANENTLY_DELETE_TAGSRESET_CHILD_MANIFEST_EXPIRATION 参数设置为 true。例如:

    PERMANENTLY_DELETE_TAGS: true
    RESET_CHILD_MANIFEST_EXPIRATION: true
  2. 在 Red Hat Quay UI 上,点 Repositories 以及包含要删除的镜像标签的存储库名称,如 quayadmin/busybox
  3. 在导航窗格中,点 Tags
  4. 选中您要删除的标签名称框,例如 test
  5. Actions 下拉菜单,再选择 Delete TagsDelete Tag
  6. 在导航窗格中,单击 Tag History
  7. 在刚删除的标签名称上,例如 test,单击 Permanently Delete 类别下的 Delete test。例如:

    永久删除镜像标签

    Permanently delete image tag

    重要

    此操作是永久的,无法撤销。

第 14 章 geo-replication

从客户端或用户的角度来看,geo-replication 允许多个地理分布式 Red Hat Quay 部署作为单个 registry 工作。它在全局分布式 Red Hat Quay 设置中显著提高推送和拉取性能。镜像数据在后台异步复制,且对客户端进行透明故障转移和重定向。

在独立和 Operator 部署中支持部署带有 geo-replication 的 Red Hat Quay。

14.1. 地理复制功能

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

14.2. 地区复制要求和限制

  • 在地理复制设置中,Red Hat Quay 要求所有区域都可以读取和写入所有其他区域对象存储。对象存储必须可以被所有其他区域访问。
  • 如果一个地理复制站点的对象存储系统失败,该站点的 Red Hat Quay 部署必须被关闭,以便客户端由全局负载均衡器重定向到具有完整存储系统的剩余站点。否则,客户端将遇到拉取和推送失败。
  • Red Hat Quay 没有内部感知连接的对象存储系统的健康状态或可用性。用户必须配置一个全局负载均衡器(LB),以监控分布式系统的健康状况,并根据存储状态将流量路由到不同的站点。
  • 要检查 geo-replication 部署的状态,您必须使用 /health/endtoend checkpoint,该检查点用于全局健康监控。您必须使用 /health/endtoend 端点手动配置重定向。/health/instance 端点仅检查本地实例健康状况。
  • 如果一个站点的对象存储系统不可用,则其余站点或站点没有自动重定向到剩余的存储系统或系统。
  • 地理复制(geo-replication)是异步的。如果一个站点永久丢失,则已存储在该站点的对象存储系统中,但在失败时还没有复制到剩余的站点的数据会丢失。
  • 因此,所有元数据和 Red Hat Quay 配置都会在所有区域间共享。

    地理复制不会复制数据库。如果出现停机,启用了地理复制功能的 Red Hat Quay 不会切换到另一个数据库。

  • 单个 Redis 缓存在整个 Red Hat Quay 设置间共享,需要被所有 Red Hat Quay pod 访问。
  • 所有区域应当使用相同的配置,但存储后端除外,这些后端可以使用 QUAY_DISTRIBUTED_STORAGE_PREFERENCE 环境变量明确进行配置。
  • geo-replication 需要每个地区中的对象存储。它不适用于本地存储。
  • 每个区域必须能够访问每个区域中的每个存储引擎,这需要一个网络路径。
  • 或者,可以使用存储代理选项。
  • 整个存储后端(如所有 blob)都会被复制。通过相反,存储库镜像可以限制为存储库或镜像。
  • 所有 Red Hat Quay 实例都必须通过负载均衡器共享相同的入口点。
  • 所有 Red Hat Quay 实例都必须具有相同的超级用户集合,因为它们在通用配置文件中定义。
  • geo-replication 需要将 Clair 配置设置为 unmanaged。非受管 Clair 数据库允许 Red Hat Quay Operator 在地理复制环境中工作,其中 Red Hat Quay Operator 的多个实例必须与同一数据库通信。如需更多信息,请参阅高级 Clair 配置
  • geo-Replication 需要 SSL/TLS 证书和密钥。如需更多信息,请参阅使用 SSL/TLS 保护到 Red Hat Quay 的连接

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

14.3. 使用独立 Red Hat Quay 进行区域复制

在以下镜像中,Red Hat Quay 在两个独立的区域独立运行,一个通用数据库和通用 Redis 实例。本地化镜像存储在每个区域中提供,镜像拉取是从最接近的可用存储引擎提供的。容器镜像推送被写入 Red Hat Quay 实例的首选存储引擎,然后在后台复制到其他存储引擎。

注意

如果 Clair 在一个集群中失败,例如 US 集群,则美国用户不会在 Red Hat Quay for the second cluster (EU)中看到漏洞报告。这是因为所有 Clair 实例都有相同的状态。当 Clair 失败时,通常是因为集群中的问题。

地理复制架构

Geo-replication

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

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

流程

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

    注意

    要启用每个命名空间的复制,请联络 Red Hat Quay 支持。

  5. 完成后,点 Save Configuration Changes。Red Hat Quay 重启后将生效。
  6. 在为 geo-replication 添加存储并在存储引擎 中启用复制后,您必须在所有存储中同步现有镜像数据。要做到这一点,您必须在容器中 oc exec (alternative, docker execkubectl exec),并输入以下命令:

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

    这是一个在添加新存储后同步内容的一次性操作。

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

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

    例如,对于在 Europe 中运行的机器,且主机上的 config 目录来自 $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.9.6
    注意

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

  3. 重启所有 Red Hat Quay 容器

14.3.3. 从独立的 Red Hat Quay 部署中删除地理复制站点

通过按照以下流程,Red Hat Quay 管理员可以删除地理复制设置中的站点。

先决条件

  • 您已为 Red Hat Quay geo-replication 配置至少两个站点,例如 usstorageeustorage
  • 每个站点都有自己的组织、存储库和镜像标签。

流程

  1. 运行以下命令,在所有定义的站点间同步 Blob:

    $ python -m util.backfillreplication
    警告

    在从 Red Hat Quay config.yaml 文件中删除存储引擎 前,您必须确保 所有 Blob 在所有定义的站点间同步。在继续操作前,请完成此步骤。

  2. 在站点 usstorage 的 Red Hat Quay config.yaml 文件中,删除 eustorage 站点的 DISTRIBUTED_STORAGE_CONFIG 条目。
  3. 输入以下命令获取正在运行的容器列表:

    $ podman ps

    输出示例

    CONTAINER ID  IMAGE                                                                     COMMAND         CREATED         STATUS             PORTS                                        NAMES
    92c5321cde38  registry.redhat.io/rhel8/redis-5:1                                        run-redis       11 days ago     Up 11 days ago     0.0.0.0:6379->6379/tcp                       redis
    4e6d1ecd3811  registry.redhat.io/rhel8/postgresql-13:1-109                              run-postgresql  33 seconds ago  Up 34 seconds ago  0.0.0.0:5432->5432/tcp                       postgresql-quay
    d2eadac74fda  registry-proxy.engineering.redhat.com/rh-osbs/quay-quay-rhel8:v3.9.0-131  registry        4 seconds ago   Up 4 seconds ago   0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp  quay

  4. 输入以下命令在 PostgreSQL 容器内执行 shell:

    $ podman exec -it postgresql-quay -- /bin/bash
  5. 运行以下命令来输入 psql :

    bash-4.4$ psql
  6. 输入以下命令在 geo-replicated 部署中显示站点列表:

    quay=# select * from imagestoragelocation;

    输出示例

     id |       name
    ----+-------------------
      1 | usstorage
      2 | eustorage

  7. 输入以下命令退出 postgres CLI 以重新输入 bash-4.4 :

    \q
  8. 输入以下命令永久删除 eustorage 站点:

    重要

    无法撤销以下操作。请谨慎使用。

    bash-4.4$ python -m util.removelocation eustorage

    输出示例

    WARNING: This is a destructive operation. Are you sure you want to remove eustorage from your storage locations? [y/n] y
    Deleted placement 30
    Deleted placement 31
    Deleted placement 32
    Deleted placement 33
    Deleted location eustorage

14.4. 使用 Red Hat Quay Operator 进行 geo-replication

Geo-replication architecture

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

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

14.4.1. 在 OpenShift Container Platform 中设置地理复制

使用以下步骤在 OpenShift Container Platform 上设置异地复制。

流程

  1. 为 Red Hat Quay 部署 postgres 实例。
  2. 输入以下命令登录到数据库:

    psql -U <username> -h <hostname> -p <port> -d <database_name>
  3. 为 Red Hat Quay 创建名为 quay 的数据库。例如:

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

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

    注意
    • 如果云供应商有自己的服务,则可能无法部署 Redis 实例。
    • 如果您使用 Builders,则需要部署 Redis 实例。
    1. 为 Redis 部署虚拟机
    2. 验证可以从运行 Red Hat Quay 的集群访问它
    3. 必须打开端口 6379/TCP
    4. 在实例内运行 Redis

      sudo dnf install -y podman
      podman run -d --name redis -p 6379:6379 redis
  6. 创建两个对象存储后端,每个集群一个。理想情况下,一个对象存储桶将接近第一个或主、集群,另一个将接近第二个或次要集群。
  7. 使用环境变量覆盖来部署具有相同配置捆绑包的集群,以便为单个集群选择适当的存储后端。
  8. 配置负载均衡器以为集群提供单一入口点。

14.4.1.1. 在 OpenShift Container Platform 上为 Red Hat Quay Operator 配置 geo-replication

使用以下步骤为 Red Hat Quay Operator 配置 geo-replication。

流程

  1. 创建在集群之间共享的 config.yaml 文件。此 config.yaml 文件包含常见 PostgreSQL、Redis 和存储后端的详情:

    geo-replication 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 Container Platform Operator 部署的 Clair 实例的配置文件,请参阅 检索 Clair 配置。
  2. 运行以下命令来创建 configBundleSecret

    $ oc create secret generic --from-file config.yaml=./config.yaml georep-config-bundle
  3. 在每个集群中,设置 configBundleSecret,并使用 QUAY_DISTRIBUTED_STORAGE_PREFERENCE 环境变量覆盖来配置该集群的相应存储。例如:

    注意

    两个部署之间的 config.yaml 文件都必须匹配。如果更改一个集群,还必须在另一个集群中更改它。

    美国集群 QuayRegistry 示例

    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

    注意

    因为 SSL/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

    注意

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

14.4.2. 从 Red Hat Quay Operator 部署中删除地理复制站点

通过按照以下流程,Red Hat Quay 管理员可以删除地理复制设置中的站点。

先决条件

  • 已登陆到 OpenShift Container Platform。
  • 您已为 Red Hat Quay geo-replication 配置至少两个站点,例如 usstorageeustorage
  • 每个站点都有自己的组织、存储库和镜像标签。

流程

  1. 运行以下命令,在所有定义的站点间同步 Blob:

    $ python -m util.backfillreplication
    警告

    在从 Red Hat Quay config.yaml 文件中删除存储引擎 前,您必须确保 所有 Blob 在所有定义的站点间同步。

    运行此命令时,会创建复制 worker 提取的复制作业。如果存在需要复制的 Blob,脚本会返回要复制的 Blob 的 UUID。如果您多次运行此命令,并且返回脚本的输出为空,这并不意味着复制过程已完成;这意味着没有为复制进行排队。在继续操作前,客户应该使用适当的 judgement,因为分配的时间复制取决于检测到的 Blob 数量。

    另外,您可以使用 Microsoft Azure 等第三方云工具来检查同步状态。

    在继续操作前,必须完成此步骤。

  2. 在站点 usstorage 的 Red Hat Quay config.yaml 文件中,删除 eustorage 站点的 DISTRIBUTED_STORAGE_CONFIG 条目。
  3. 输入以下命令识别您的 Quay 应用程序 pod:

    $ oc get pod -n <quay_namespace>

    输出示例

    quay390usstorage-quay-app-5779ddc886-2drh2
    quay390eustorage-quay-app-66969cd859-n2ssm

  4. 输入以下命令在 usstorage pod 中打开交互式 shell 会话:

    $ oc rsh quay390usstorage-quay-app-5779ddc886-2drh2
  5. 输入以下命令永久删除 eustorage 站点:

    重要

    无法撤销以下操作。请谨慎使用。

    sh-4.4$ python -m util.removelocation eustorage

    输出示例

    WARNING: This is a destructive operation. Are you sure you want to remove eustorage from your storage locations? [y/n] y
    Deleted placement 30
    Deleted placement 31
    Deleted placement 32
    Deleted placement 33
    Deleted location eustorage

14.5. 用于区域复制的混合存储

Red Hat Quay geo-replication 支持使用不同的和多个复制目标,例如在公共云上使用 AWS S3 存储并在内部使用 Ceph 存储。这导致从所有 Red Hat Quay pod 和集群节点授予对所有存储后端的访问权限的关键要求。因此,建议您使用以下方法:

  • 用于防止内部存储的可见性的 VPN,或者
  • 令牌对,仅允许访问 Red Hat Quay 使用的指定存储桶

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

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

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

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

15.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 \
       registry.redhat.io/quay/quay-rhel8:v3.9.6

    运行以下命令,切换到容器中的 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 \
      registry.redhat.io/quay/quay-rhel8:v3.9.6
  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 内容提取到备份 .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_CONFIGhostname/tmp/quay-backup/blob-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 文件中备份。

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

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

先决条件

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

流程

  1. 在 Red Hat Quay 容器中创建一个将 bind-mount 到 /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 并在 IANA10.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/quay 更新到 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>

第 16 章 将独立 Red Hat Quay 部署迁移到 Red Hat Quay Operator 部署

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

16.1. 备份独立 Red Hat Quay 部署

流程

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

    $ mkdir /tmp/quay-backup
    $ cp /path/to/Quay/config/directory/config.yaml /tmp/quay-backup
  2. 创建独立 Red Hat 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. 从独立部署的 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. config.yaml 文件中的 access_keysecret_key 存储在 ~/.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 目录中,创建一个 bucket_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 可以从位于 DISTRIBUTED_STORAGE_CONFIG 的主机名 下的 Red Hat Quay config.yaml 文件中读取。如果端点不安全,请在端点 URL 中使用 http 而不是 https

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

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

先决条件

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

本文档中的步骤使用以下命名空间: 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. 输入 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"}}'
    注意

    如果 Red Hat 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 上新的 Red Hat Quay 部署应包含旧部署具有的所有信息。您应能够拉取所有镜像。

第 17 章 配置工件类型

作为 Red Hat Quay 管理员,您可以通过 FEATURE_GENERAL_OCI_SUPPORTALLOWED_OCI_ARTIFACT_TYPESIGNORE_UNKNOWN_MEDIATYPES 配置字段来配置 Open Container Initiative (OCI)工件类型。

以下 Open Container Initiative (OCI)工件类型默认内置在 Red Hat Quay 中,并通过 FEATURE_GENERAL_OCI_SUPPORT 配置字段启用:

字段介质类型支持的内容类型

Helm

application/vnd.cncf.helm.config.v1+json

application/tar+gzip, application/vnd.cncf.helm.chart.content.v1.tar+gzip

Cosign

application/vnd.oci.image.config.v1+json

application/vnd.dev.cosign.simplesigning.v1+json, application/vnd.dsse.envelope.v1+json

SPDX

application/vnd.oci.image.config.v1+json

text/spdx, text/spdx+xml, text/spdx+json

Syft

application/vnd.oci.image.config.v1+json

application/vnd.syft+json

CycloneDX

application/vnd.oci.image.config.v1+json

application/vnd.cyclonedx,application/vnd.cyclonedx+xml,application/vnd.cyclonedx+json

in-toto

application/vnd.oci.image.config.v1+json

application/vnd.in-toto+json

Unknown

application/vnd.cncf.openpolicyagent.policy.layer.v1+rego

application/vnd.cncf.openpolicyagent.policy.layer.v1+rego,application/vnd.cncf.openpolicyagent.data.layer.v1+json

另外,Red Hat Quay 使用 ZStandardzstd 来缩小容器镜像的大小或其他相关工件。zstd 有助于优化存储并改进使用容器镜像的传输速度。

使用以下步骤配置对默认和实验性 OCI 介质类型的支持。

17.1. 配置 OCI 工件类型

使用以下步骤配置默认嵌入在 Red Hat Quay 中的工件类型。

先决条件

  • 您有 Red Hat Quay 管理员特权。

流程

  • 在 Red Hat Quay config.yaml 文件中,通过将 FEATURE_GENERAL_OCI_SUPPORT 字段设置为 true 来启用对常规 OCI 支持的支持。例如:

    FEATURE_GENERAL_OCI_SUPPORT: true

    FEATURE_GENERAL_OCI_SUPPORT 设置为 true 时,Red Hat Quay 用户现在可以将默认工件类型的推送和拉取到其 Red Hat Quay 部署中。

17.2. 配置额外的工件类型

使用以下步骤为您的 Red Hat Quay 部署配置额外的特定工件类型。

注意

使用 ALLOWED_OCI_ARTIFACT_TYPES 配置字段,您可以限制 Red Hat Quay registry 接受哪些工件类型。如果您希望 Red Hat Quay 部署接受所有工件类型,请参阅"配置未知介质类型"。

先决条件

  • 您有 Red Hat Quay 管理员特权。

流程

  • 添加 ALLOWED_OCI_ARTIFACT_TYPES 配置字段,以及配置和层类型:

    FEATURE_GENERAL_OCI_SUPPORT: true
    ALLOWED_OCI_ARTIFACT_TYPES:
      <oci config type 1>:
      - <oci layer type 1>
      - <oci layer type 2>
    
      <oci config type 2>:
      - <oci layer type 3>
      - <oci layer type 4>

    例如,您可以通过在 config.yaml 文件中添加以下内容来添加单性镜像格式(SIF)支持:

    ALLOWED_OCI_ARTIFACT_TYPES:
      application/vnd.oci.image.config.v1+json:
      - application/vnd.dev.cosign.simplesigning.v1+json
      application/vnd.cncf.helm.config.v1+json:
      - application/tar+gzip
      application/vnd.sylabs.sif.config.v1+json:
      - application/vnd.sylabs.sif.layer.v1+tar
    注意

    当添加不默认配置的 OCI 工件类型时,Red Hat Quay 管理员还需要手动添加对 Cosign 和 Helm 的支持。

    现在,用户可以为其 Red Hat Quay registry 标记 SIF 镜像。

17.3. 配置未知介质类型

使用以下步骤为您的 Red Hat Quay 部署启用所有工件类型。

注意

启用此字段后,您的 Red Hat Quay 部署接受所有工件类型。

先决条件

  • 您有 Red Hat Quay 管理员特权。

流程

  1. IGNORE_UNKNOWN_MEDIATYPES 配置字段添加到 Red Hat Quay config.yaml 文件中:

    IGNORE_UNKNOWN_MEDIATYPES: true

    启用此字段后,您的 Red Hat Quay 部署接受未知和未识别的工件类型。

第 18 章 Red Hat Quay 垃圾回收

Red Hat Quay 包括自动和持续镜像垃圾回收。垃圾回收通过删除可占用量磁盘空间(如悬停或未标记的镜像、存储库和 Blob)的对象(包括层和清单)来有效地将资源用于活跃对象。Red Hat Quay 执行垃圾回收可减少您组织的环境中的停机时间。

18.1. 在实践中 Red Hat Quay 垃圾回收

目前,所有垃圾回收都会意外地发生,没有命令来手动运行垃圾回收。Red Hat Quay 提供跟踪不同垃圾回收 worker 状态的指标。

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

注意

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

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

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

垃圾回收镜像的工作方式与命名空间或仓库上的垃圾回收不同。垃圾回收工作者不会处理项目队列,而是主动搜索带有不活跃或过期标签的存储库来清理。垃圾回收 worker 的每个实例都会获得一个存储库锁定,这样可为每个存储库生成一个 worker。

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

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

Garbage collection metrics

18.1.1. 测量存储重新声明

Red Hat Quay 无法跟踪垃圾回收所释放的空间。目前,这一点的最佳指示是检查提供的指标中已删除多少 Blob。

注意

Red Hat Quay 指标中的 UploadedBlob 表跟踪与存储库关联的各种 Blob。上传 Blob 时,在 PUSH_TEMP_TAG_EXPIRATION_SEC 参数指定的时间之前不会收集它。这是为了避免永久删除属于持续推送的 Blob。例如,如果将垃圾回收设置为频繁运行,且在一小时的 span 并删除标签,则相关的 Blob 可能会立即清理。相反,假设由 PUSH_TEMP_TAG_EXPIRATION_SEC 参数指定的时间已通过,相关的 Blob 将被删除在同一存储库上运行的垃圾回收。

18.2. 垃圾回收配置字段

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

Name描述模式

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

自动清理 S3 多部分上传中保留的过时的 Blob。默认情况下,每小时清理超过 2 天的 Blob 文件。

布尔值

+ 默认: true

18.3. 禁用垃圾回收

镜像标签、命名空间和存储库的垃圾回收功能存储在 config.yaml 文件中。这些功能默认为 true

在个别情况下,您可能想要禁用垃圾回收,例如,控制何时执行垃圾回收。您可以通过将 GARBAGE_COLLECTION 功能设置为 false 来禁用垃圾回收。禁用后,不会删除悬停或未标记的镜像、存储库、命名空间、层和清单。这可能会增加环境的停机时间。

注意

没有命令来手动运行垃圾回收。相反,您可以禁用,然后重新启用垃圾回收功能。

18.4. 垃圾回收和配额管理

Red Hat Quay 在 3.7 中引入了配额管理。通过配额管理,用户可以通过建立配置的存储配额限制来报告存储消耗并包含 registry 增长。

从 Red Hat Quay 3.7 开始,垃圾回收会重新声明在删除后分配给镜像、存储库和 Blob 的内存。因为垃圾回收功能会在删除后回收内存,所以在环境磁盘空间中存储的内容和报告配额管理作为总消耗量之间有一个差异。当前没有解决此问题的方法。

18.5. 实践中的垃圾回收

使用以下步骤检查 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
  2. 删除镜像标签。
  3. 输入以下命令以确保标签已被删除:

    $ 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"

18.6. Red Hat Quay 垃圾回收指标

以下指标显示垃圾回收删除了多少个资源。这些指标显示垃圾回收 worker 运行的次数以及删除了命名空间、存储库和 Blob 的数量。

指标名称描述

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

第 19 章 使用 Red Hat Quay v2 UI

使用以下步骤配置和使用 Red Hat Quay v2 UI。

19.1. v2 用户界面配置

启用 FEATURE_UI_V2 后,您可以在用户界面和用户界面的新版本间切换。

重要
  • 这个 UI 目前处于 beta 阶段,可能会有变化。在当前状态下,用户只能创建、查看和删除组织、存储库和镜像标签。
  • 在旧 UI 中运行 Red Hat Quay 时,超时会话要求用户在弹出窗口中再次输入密码。使用新的 UI 时,用户返回到主页面,需要输入其用户名和密码凭证。这是一个已知问题,并将在以后的 UI 版本中解决。
  • 在旧 UI 和新 UI 之间如何报告镜像清单大小有一个差异。在传统的 UI 中,以兆字节为单位报告镜像清单。在新的 UI 中,Red Hat Quay 使用 MB (MB)的标准定义来报告镜像清单大小。

流程

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

    ---
    FEATURE_TEAM_SYNCING: false
    FEATURE_UI_V2: true
    FEATURE_USER_CREATION: true
    ---
  2. 登录到您的 Red Hat Quay 部署。
  3. 在 Red Hat Quay 部署的导航窗格中,会给一个可以在 Current UINew UI 之间切换的选项。点切换按钮将其设置为新的 UI,然后点 Use Beta Environment,例如:

    Red Hat Quay v2 UI toggle

19.1.1. 在 Red Hat Quay v2 UI 中创建新机构

先决条件

  • 您已切换了 Red Hat Quay 部署以使用 v2 UI。

使用以下步骤使用 Red Hat Quay v2 UI 创建机构。

流程

  1. 在导航窗格中点 Organization
  2. Create Organization
  3. 输入 机构名称,如 testorg
  4. Create

现在,您的示例机构应该在 Organizations 页面下填充。

19.1.2. 使用 Red Hat Quay v2 UI 删除机构

使用以下步骤通过 Red Hat Quay v2 UI 删除机构。

流程

  1. Organizations 页面上,选择您要删除的机构的名称,例如 testorg
  2. More Actions 下拉菜单。
  3. Delete

    注意

    Delete 页面中,有一个 搜索 输入框。有了此框,用户可以搜索特定的组织,以确保它们被正确地安排删除。例如,如果用户删除 10 个机构,并希望确保删除了特定的机构,他们可以使用 搜索 输入框确认上述机构标记为要删除的。

  4. 通过在框中输入 confirm 来确认您要永久删除机构。
  5. Delete

    删除后,您将返回到 Organizations 页面。

    注意

    您可以通过选择多个机构,然后点 More ActionsDelete 来删除多个机构。

19.1.3. 使用 Red Hat Quay v2 UI 创建新存储库

使用以下步骤使用 Red Hat Quay v2 UI 创建存储库。

流程

  1. 单击导航窗格中的 Repositories
  2. 单击 Create Repository
  3. 选择一个命名空间,如 quayadmin,然后输入 Repository 名称,如 testrepo
  4. Create

    现在,您的示例存储库应该在 Repositories 页面下填充。

19.1.4. 使用 Red Hat Quay v2 UI 删除存储库

先决条件

  • 您已创建了存储库。

流程

  1. 在 Red Hat Quay v2 UI 的 Repositories 页面中,单击您要删除的镜像的名称,如 quay/admin/busybox
  2. More Actions 下拉菜单。
  3. Delete

    注意

    如果需要,您可以点击 Make PublicMake Private

  4. 在框中键入 confirm,然后单击 Delete
  5. 删除后,您将返回到 Repositories 页面。

19.1.5. 将镜像推送到 Red Hat Quay v2 UI

使用以下步骤将镜像推送到 Red Hat Quay v2 UI。

流程

  1. 从外部 registry 拉取示例镜像:

    $ podman pull busybox
  2. 标记镜像:

    $ podman tag docker.io/library/busybox quay-server.example.com/quayadmin/busybox:test
  3. 将镜像推送到 Red Hat Quay registry:

    $ podman push quay-server.example.com/quayadmin/busybox:test
  4. 导航到 Red Hat Quay UI 上的 Repositories 页面,并确保您的镜像已正确推送。
  5. 您可以通过选择镜像标签来查看安全详情,然后进入 Security Report 页面。

19.1.6. 使用 Red Hat Quay v2 UI 删除镜像

使用以下步骤通过 Red Hat Quay v2 UI 删除镜像。

先决条件

  • 您已将镜像推送到 Red Hat Quay registry。

流程

  1. 在 Red Hat Quay v2 UI 的 Repositories 页面中,单击您要删除的镜像的名称,如 quay/admin/busybox
  2. More Actions 下拉菜单。
  3. Delete

    注意

    如果需要,您可以点击 Make PublicMake Private

  4. 在框中键入 confirm,然后单击 Delete
  5. 删除后,您将返回到 Repositories 页面。

19.1.7. 使用 Red Hat Quay v2 UI 创建机器人帐户

使用以下步骤,使用 Red Hat Quay v2 UI 创建机器人帐户。

流程

  1. 在 Red Hat Quay v2 UI 上,单击 Organizations
  2. 单击您要为其创建机器人帐户的组织名称,如 test-org
  3. Robot accounts 选项卡 → Create robot account
  4. Provide a name for your robot account 框中,输入名称,如 robot1
  5. 可选。如果需要,可以使用以下选项:

    1. 将机器人添加到团队。
    2. 将机器人添加到存储库。
    3. 调整机器人的权限。
  6. Review and finish 页面中,查看您提供的信息,然后点 Review and finish
  7. 可选。您可以单击 ExpandCollapse 以显示有关机器人帐户的描述性信息。
  8. 可选。您可以点 kebab 菜单 → Set repository 权限来更改机器人帐户的权限
  9. 可选。要删除您的机器人帐户,请选中机器人帐户的复选框,然后单击回收站图标。此时会出现弹出窗口。在文本框中键入 confirm,然后单击 Delete。或者,您可以点 kebab 菜单 → Delete

19.1.8. Red Hat Quay v2 UI 的机构设置

使用以下步骤通过 Red Hat Quay v2 UI 更改您的机构设置。

流程

  1. 在 Red Hat Quay v2 UI 上,单击 Organizations
  2. 单击您要为其创建机器人帐户的组织名称,如 test-org
  3. Settings 选项卡。
  4. 可选。输入与机构关联的电子邮件地址。
  5. 可选。将 Time Machine 功能的分配时间设置为以下之一:

    • 1 周
    • 1 个月
    • 1 年
    • Never
  6. 点击 Save

19.1.9. 使用 Red Hat Quay v2 UI 查看镜像标签信息

使用以下步骤通过 Red Hat Quay v2 UI 查看镜像标签信息。

流程

  1. 在 Red Hat Quay v2 UI 上,单击 Repositories
  2. 点存储库的名称,例如 quayadmin/busybox
  3. 单击标签的名称,例如 test。您会进入标签的 Details 页面。该页面显示以下信息:

    • Name
    • 软件仓库
    • 摘要
    • 安全漏洞
    • 创建
    • modified
    • Size
    • 标签
    • 如何获取镜像标签
  4. 可选。点 Security Report 查看标签的漏洞。您可以扩展公告列以打开 CVE 数据。
  5. 可选。点 Packages 查看标签的软件包。
  6. 单击存储库的名称,如 busybox,以返回到 Tags 页面。
  7. 可选。将鼠标悬停在 Pull 图标上,以显示获取标签的方法。
  8. 选中标签框或多个标签,单击 Actions 下拉菜单,然后单击 Delete 以删除该标签。在弹出框中单击 Delete 来确认删除。

19.1.10. 使用 Red Hat Quay v2 UI 调整存储库设置

使用以下步骤使用 Red Hat Quay v2 UI 调整存储库的各种设置。

流程

  1. 在 Red Hat Quay v2 UI 上,单击 Repositories
  2. 点存储库的名称,例如 quayadmin/busybox
  3. Settings 选项卡。
  4. 可选。单击 User and robot permissions。您可以通过单击 权限 下的下拉菜单选项来调整用户或机器人帐户的设置。您可以将设置更改为 ReadWriteAdmin
  5. 可选。单击 Events 和 notification。您可以通过单击 Create Notification 来创建事件和通知。可用的事件选项如下:

    • 推送到存储库
    • 发现软件包漏洞
    • 镜像构建失败
    • 镜像构建已排队
    • 镜像构建已启动
    • 镜像构建成功
    • 镜像构建已取消

      然后,发出通知。可用的选项如下:

    • 电子邮件通知
    • Flowdock 团队通知
    • HipChat Room 通知
    • Slack 通知
    • Webhook POST

      选择事件选项和通知方法后,包括一个 Room ID #, a Room Notification Token,然后点 Submit

  6. 可选。单击 Repository visibility。您可以通过单击 Make Public 使存储库为私有或公共存储库。
  7. 可选。单击 Delete repository。您可以通过单击 Delete Repository 来删除存储库。

19.2. 启用 Red Hat Quay 旧 UI

  1. 在 Red Hat Quay 部署的导航窗格中,会给一个可以在 Current UINew UI 之间切换的选项。点击切换按钮,来将它设为 Current UI

    Red Hat Quay v2 UI toggle

第 20 章 在 Red Hat Quay 部署上执行健康检查

健康检查机制旨在评估系统、服务或组件的健康和功能。健康检查有助于确保一切正常工作,并可用于在潜在问题成为严重问题之前识别潜在问题。通过监控系统的健康状况,Red Hat Quay 管理员可以针对地域复制部署、Operator 部署、独立 Red Hat Quay 部署、对象存储问题等方面解决异常或潜在的故障。执行健康检查有助于降低遇到故障排除场景的可能性。

通过提供有关系统当前状态的宝贵信息,健康检查机制可以在诊断问题方面扮演角色。通过将健康检查结果与预期的基准测试或预定义的阈值进行比较,可以更快地识别 deviations 或 anomalies。

20.1. Red Hat Quay 健康检查端点

重要

此处包含的任何外部网站的链接仅为方便用户而提供。红帽没有审阅链接的内容,并不对其内容负责。包含到外部网站的任何链接并不意味着红帽认可该网站或其实体、产品或服务。您同意红帽对因您使用(或依赖)外部网站或内容而导致的任何损失或费用不承担任何责任。

Red Hat Quay 有几个健康检查端点。下表显示了健康检查、描述、端点和示例输出。

表 20.1. 健康检查端点

健康检查描述端点输出示例

实例

实例 端点获取特定 Red Hat Quay 实例的完整状态。返回带有以下键值对 的字典auth,database,disk_space,registry_gunicorn,service_key, 和 web_gunicorn。返回指示 200 的健康检查响应的数字,这表示实例处于健康状态,或者 503,这表示您的部署有问题。

https://{quay-ip-endpoint}/health/instance https://{quay-ip-endpoint}/health

{"data":{"services":{"auth":true,"database":true,"disk_space":true,"registry_gunicorn":true,"service_key":true,"web_gunicorn":true}},"status_code":200}

endtoend

端到端端点对 Red Hat Quay 实例的所有服务进行检查。使用以下的键值对返回 字典auth数据库redis存储。返回指示 200 的健康检查响应的数字,这表示实例处于健康状态,或者 503,这表示您的部署有问题。

https://{quay-ip-endpoint}/health/endtoend

{"data":{"services":{"auth":true,"database":true,"redis":true,"storage":true}},"status_code":200}

warning

警告 端点对警告进行检查。为以下内容返回一个带有键值对的字典: disk_space_warning返回指示 200 的健康检查响应的数字,这表示实例处于健康状态,或者 503,这表示您的部署有问题。

https://{quay-ip-endpoint}/health/warning

{"data":{"services":{"disk_space_warning":true}},"status_code":503}

20.2. 导航到 Red Hat Quay 健康检查端点

使用以下步骤导航到 实例 端点。对于 端到端 和警告 端点,这个过程可以重复。

流程

  1. 在 Web 浏览器中,导航到 https://{quay-ip-endpoint}/health/instance
  2. 您使用健康实例页面,它会返回类似如下的信息:

    {"data":{"services":{"auth":true,"database":true,"disk_space":true,"registry_gunicorn":true,"service_key":true,"web_gunicorn":true}},"status_code":200}

    对于 Red Hat Quay,"status_code": 200 表示实例是健康的。相反,如果您收到 "status_code": 503,则部署有问题。

第 21 章 在旧 UI 上品牌 Red Hat Quay 部署

您可以通过更改 registry 标题、徽标、页脚镜像,并将用户定向到嵌入在页镜像中的网站来品牌 Red Hat Quay 部署的 UI。

流程

  1. 更新 Red Hat Quay config.yaml 文件以添加以下参数:

    BRANDING:
        logo: 1
        footer_img: 2
        footer_url: 3
    ---
    REGISTRY_TITLE: 4
    REGISTRY_TITLE_SHORT: 5
    1
    Red Hat Quay 部署的顶部将显示镜像的 URL。
    2
    Red Hat Quay 部署底部的镜像的 URL。
    3
    在点击 footer 镜像时用户要定向到的网站的 URL。
    4
    registry 的长期标题。这在 Red Hat Quay 部署的前端中显示,例如在机构的登录页面中。
    5
    registry 的短格式标题。这个标题显示在您的机构的不同页面中,例如,作为您所在机构的教程页面上的 教程 的标题。
  2. 重启 Red Hat Quay 部署。重启后,您的 Red Hat Quay 部署会使用新的徽标、页脚镜像和页脚镜像 URL 进行更新。

第 22 章 schema for Red Hat Quay 配置

大多数 Red Hat Quay 配置信息都存储在 config.yaml 文件中,该文件是在首次部署 Red Hat Quay 时使用浏览器的配置工具创建的。

配置选项在 Red Hat Quay 配置指南 中进行了描述。

其他资源

法律通告

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.