管理 Red Hat Quay

Red Hat Quay 3.6

管理 Red Hat Quay

摘要

管理 Red Hat Quay

前言

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

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

第 1 章 高级 Red Hat Quay 配置

您可以使用几个不同接口在初始部署后配置 Red Hat Quay:

  • Red Hat Quay Config Tool: 在 config 模式下运行 Quay 容器会显示一个基于 Web 的界面来配置 Red Hat Quay 集群。这是大多数配置 Red Hat Quay 服务本身的建议方法。
  • 编辑 config.yamlconfig.yaml 文件包含 Red Hat Quay 集群的大部分配置信息。可以直接编辑该文件,但建议仅建议通过 Config 工具提供高级调节和性能功能。
  • Red Hat Quay API:可以通过 API 完成一些 Red Hat Quay 配置。

虽然在单独的部分中阐述了特定功能的配置,但本节介绍了如何使用这些接口并执行一些更高级的配置。

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

Red Hat Quay Config Tool 可以在 config 模式下运行 Quay 容器以及常规的 Red Hat Quay 服务来提供。运行 Config Tool 对于在 OpenShift 上运行的 Red Hat Quay 集群与直接在主机系统上运行的 Quay 集群不同。

1.1.1. 从 Red Hat Quay Operator 运行 Config Tool

如果您从 OpenShift 中运行 Red Hat Quay Operator,则配置工具可能已经可用。要访问配置工具,请执行以下操作:

  1. 在 OpenShift 控制台中,选择运行 Red Hat Quay 的项目。例如,quay-enterprise.
  2. 在左侧列中选择 Networking → Routes。您应该会看到指向 Red Hat Quay 应用程序和配置工具的路由,如以下镜像所示:

    View the route to the Red Hat Quay Config Tool

  3. 选择到 Config Tool 的路由(例如 example-quayecosystem-quay-config)并选中它。Config 工具 Web UI 应在浏览器中打开。
  4. 选择 Modify configuration for this cluster。您应该看到配置工具,您可以更改 Red Hat Quay 集群的功能,如下镜像所示:

    Modify Red Hat Quay cluster settings from the Config Tool

  5. 进行更改后,选择 Save Configuration Changes。配置工具将验证您的更改。
  6. 选择 继续编辑 或选择" 下一步 "使其根据需要进行更正。
  7. 提示时,建议您选择 Download Configuration。这将下载新 config.yaml 的 tarball,以及与 Red Hat Quay 设置搭配使用的任何证书和密钥。
  8. 选择 Go to deployment rollout,然后将 配置填充到部署。Red Hat Quay Pod 将重启,其更改将生效。

您保存的 config.yaml 文件可用于对配置进行高级更改,或者仅保留下来以备将来参考。

1.1.2. 从命令行运行 Config Tool

如果您在初始 Red Hat Quay 部署之后使用 podmandocker 命令等工具直接从主机系统运行 Red Hat Quay,您可以重启 Config Tool 修改 Red Hat Quay 集群。以下是如何:

  1. 以配置 模式 启动 quay: 在第一个 quay 节点上运行以下命令,将 my-secret-password 替换为您的密码。如果要修改现有配置捆绑包,只需将配置目录挂载到 Quay 容器中,就像在 registry 模式中一样。

    # podman run --rm -it --name quay_config -p 8080:8080 \
        -v path/to/config-bundle:/conf/stack \
        registry.redhat.io/quay/quay-rhel8:v3.6.8 config my-secret-password
  2. 打开浏览器 :当 quay 配置工具启动时,打开浏览器到您要运行配置工具的系统的 URL 和端口 8080(例如 https://myquay.example.com:8080)。系统会提示您输入用户名和密码。

此时,您可以开始修改 Red Hat Quay 集群,如前面所述。

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 配置。Red Hat Quay 配置的 Schema 包括了 可用的设置。以下是您可以在 config.yaml 文件中直接更改的设置示例。

1.3.1. 将 name 和 company 添加到 Red Hat Quay Sign-in

设置以下内容将导致用户在首次登录时提示其名字和公司。虽然这是可选的,但您可以提供有关 Red Hat Quay 用户的额外数据:

+ FEATURE_USER_METADATA: true

1.3.2. 禁用 TLS 协议

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

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

1.3.3. 速率限制 API 调用

config.yaml 中添加 FEATURE_RATE_LIMITS 参数会导致 nginx 将特定的 API 调用限制为每秒 30 秒。如果没有设置该功能,API 调用将每秒消除为 300(具有无限数量)。如果需要确保资源不用在流量不足,则速率限制是一个重要功能。

有些命名空间可能需要无限的访问权限(例如,CI/CD 并具有优先权)。在这种情况下,这些命名空间可以放在 config.yaml 中的 NON_RATE_LIMITED_NAMESPACES 中的列表中。

1.3.4. 调整数据库连接池

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

如果启用,与数据库交互的每个进程都将包含一个连接池。这些每个进程连接池配置为保持最多 20 个连接。在重度负载下,可以为 Red Hat Quay 容器中的每个进程填写连接池。在某些部署和加载下,这可能需要分析,以确保 Red Hat Quay 不超过数据库配置的最大连接数。

现在,连接池将释放闲置连接。要立即释放所有连接,Red Hat Quay 需要重启。

可以通过设置环境变量 DB_CONNECTION_POOLING={true|false}来切换数据库连接池。

如果启用了数据库连接池,可以更改连接池的最大大小。这可以通过以下 config.yaml 选项完成:

DB_CONNECTION_ARGS:
  max_connections: 10

1.3.4.1. 数据库连接参数

您可以在 config.yaml 文件中自定义 Red Hat Quay 数据库连接设置。这些完全依赖于底层的数据库驱动程序,如 Postgres 和 pymysqlpsycopg2。您也可以传递 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 连接参数

下面提供了 PostgreSQL SSL 配置示例:

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

sslmode 选项确定是否存在与服务器协商安全 SSL TCP/IP 连接的安全 SSL TCP/IP 连接。有六个模式:

  • disable: 只尝试非 SSL 连接
  • Allow: 首先尝试非 SSL 连接 ; 如果失败,请尝试 SSL 连接
  • prefer: (默认)首先尝试 SSL 连接;如果失败,请尝试非 SSL 连接
  • Requires: 仅尝试 SSL 连接。如果存在 root CA 文件,验证证书的方式与是否指定了 verify-ca 的方式相同
  • verify-ca: 仅尝试 SSL 连接,并验证服务器证书是否由可信证书颁发机构(CA)发出。
  • verify-full: 仅尝试 SSL 连接,验证服务器证书是否由受信任的 CA 发布,并且请求的服务器主机名与证书中的服务器主机名匹配

有关 PostgreSQL 的有效参数的更多信息,请参阅 https://www.postgresql.org/docs/current/libpq-connect.html

1.3.4.2.2. MySQL SSL 连接参数

MySQL SSL 配置示例如下:

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

有关 MySQL 的有效连接参数的信息,请参考 https://dev.mysql.com/doc/refman/8.0/en/connecting-using-uri-or-key-value-pairs.html

1.3.4.3. HTTP 连接计数

可以使用环境变量同时指定 HTTP 连接的数量。这些可指定为整个组件,也可以指定为特定的组件。每个进程的默认值为 50 个并行连接。

环境变量:

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

1.3.4.5. 环境变量

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

表 1.1. worker 计数环境变量

变量描述

WORKER_COUNT_REGISTRY

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

8 和 64 之间的整数

WORKER_COUNT_WEB

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

2 到 32 之间的整数

WORKER_COUNT_SECSCAN

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

2 到 4 之间的整数

DB_CONNECTION_POOLING

切换数据库连接池。在 3.4 中,默认禁用它。

"true" 或 "false"

1.3.4.6. 关闭连接池

具有大量用户活动的 Red Hat Quay 部署定期按 2K 最大数据库连接限制。在这种情况下,Red Hat Quay 默认启用的连接池可能会导致数据库连接数量呈指数级增长,并要求您关闭连接池。

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

第 2 章 使用配置 API

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

2.1. 检索默认配置

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

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

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

$ 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.6.8 config secret

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

$ 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. 选择您的用户名(右上角)来查看红帽客户和客户门户网站选择: View account and portal selections
  3. 选择通知.此时会出现您的配置集活动页面。
  4. 选择通知选项卡。
  5. 选择管理通知。
  6. 选择 Follow,然后从下拉列表中选择 Products。
  7. 从产品旁边的下拉菜单中,搜索并选择 Red Hat Quay: Select Products from notifications box
  8. 选择 SAVE ROKS 按钮。以后,当对 Red Hat Quay 产品有变化时,您将收到通知,如新版本。

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

4.1. 使用 SSL 简介

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

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

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

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

在此过程结束时,您将分别具有名为 ssl.certssl.key 的证书文件和主密钥文件。

4.2.1. 创建证书颁发机构

  1. 生成 root CA 密钥:

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

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

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

4.2.2. 签署证书

  1. 生成服务器密钥:

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

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

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

    openssl.cnf

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

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

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

4.3. 使用命令行配置 SSL

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

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

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

    config.yaml

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

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

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

4.4. 使用 UI 配置 SSL

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

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

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

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

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

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

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

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

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

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

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

Potential risk

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

Connection not secure

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

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

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

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

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

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

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

$ sudo podman login quay-server.example.com

Username: quayadmin
Password:
Login Succeeded!

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

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

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

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

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

    现在,当您访问位于 https://quay-server.example.com 的 registry 时,锁定图标会显示连接的安全:

    Connection not secure

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

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

如需了解更多信息,请参见《 使用共享系统证书 "一章中的 RHEL 8 文档。

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

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

5.1. 在 Red Hat Quay 中添加 TLS 证书

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

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

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

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

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

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

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

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

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

  1. 首先使用 base64 编码证书内容:

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

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

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

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

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

可使用 Red Hat Quay Config 工具在 Red Hat Quay 部署或部署后启用 Elasticsearch 日志记录。生成的配置存储在 config.yaml 文件中。配置后,使用日志访问将继续以同样的方式提供,通过 Web UI 为存储库和组织提供。

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

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

    Choose Elasticsearch to view settings to store logs

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

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

      On AWS optionally set up an intermediate Kinesis stream

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

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

第 7 章 Clair 安全扫描

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

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

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

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

注意

在 Red Hat Quay 3.4 发行版本中,新的 Clair V4(镜像 registry.redhat.io/quay/clair-rhel8 将完全取代前面的 Clair V2(image quay.io/redhat/clair-jwt))。有关在 V4 更新期间如何以只读模式运行 V2。

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

7.1.1. 部署 Via Quay Operator

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

7.1.2. 手动部署 Clair

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

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

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

    clairv4-postgres.yaml

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

  3. 按如下方式部署 postgres 数据库:

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

    config.yaml

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

    1
    要生成 Clair 预共享密钥(PSK),请在 用户界面的 Security Scanner 部分中启用扫描,并点 Generate PSK

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

  1. 从 Clair config.yaml 创建 secret:

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

    clair-combo.yaml

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

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

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

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

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

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

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

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

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

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

    config.yaml

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

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

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

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

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

7.3. 使用 Clair

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

    Security scan information appears for scanned repository images

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

    See all vulnerabilities or only those that are fixable

7.4. 国家漏洞数据库中的 CVE 等级

现在,Quay UI 中可以看到 Clair v4.2 的数据。此外,Clair v4.2 为检测到的漏洞添加国家漏洞数据库中的 CVSS 分数。

在这个版本中,如果漏洞的 CVSS 分数在 distro 分数中的 2 个级别,则默认存在的 Quay UI 分数。例如:

Clair v4.2 data display

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

Clair v4 data display

7.5. 为断开连接的环境配置 Clair

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

这些步骤如下所示。

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

    config.yaml

    matcher:
      disable_updaters: true

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

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

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

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

7.6. Clair 更新器 URL

以下是 Clair 在默认配置中尝试与 对话的 HTTP 主机和路径。这个列表并不完善,因为一些服务器会发布重定向,一些服务器会动态构造一些请求 URL。

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

7.7. 其它信息

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

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

通过使用 Container Security Operator,(CSO)可以扫描与活跃 pod 关联的容器镜像,在 OpenShift(4.2 或更高版本)和其他 Kubernetes 平台上运行,以了解已知漏洞。CSO:

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

根据这里的说明,CSO 安装在 marketplace-operators 命名空间中,因此 OpenShift 集群上的所有命名空间都可以使用它。

注意

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

8.1. 在 OpenShift 中运行 CSO

要在 OpenShift 中使用 CSO,请执行以下操作:

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

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

    Access SCO scanning data from OpenShift dashboard

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

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

      The CSO points you to a registry containing the vulnerable image

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

      View namespaces a vulnerable image is running in

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

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

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

8.2. 通过 CLI 查询镜像漏洞

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

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

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

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

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

使用 Quay Bridge Operator,您可以将 OpenShift 中的集成容器 registry 替换为 Red Hat Quay registry。通过这样做,集成的 OpenShift registry 变得高度可用,企业级 Red Hat Quay registry,具有增强的基于角色的访问控制(RBAC)功能。

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

  • 作为 Red Hat Quay 组织同步 OpenShift 命名空间。

    • 为每个默认命名空间服务帐户创建 Robot 帐户
    • 为每个创建的 Robot 帐户创建机密(将每个 Robot Secret 合并到一个服务帐户,作为可挂载和 Image Pull Secret)
    • 同步 OpenShift ImageStreams 作为 Quay 存储库
  • 自动重写新构建以使用 ImageStreams 输出到 Red Hat Quay
  • 构建完成后会自动导入 ImageStream 标签

通过 Quay Bridge Operator 使用此流程,您可以在 Red Hat Quay 和 OpenShift 集群间启用双向通信。

9.1. 运行 Quay Bridge Operator

9.1.1. 先决条件

在设置 Bridge Operator 前,请保留以下内容:

  • 具有超级用户权限的现有 Red Hat Quay 环境
  • 具有集群管理员权限的 Red Hat OpenShift Container Platform 环境(4.2 或更高版本)
  • OpenShift 命令行工具(oc 命令)

9.1.2. 设置和配置 OpenShift 和 Red Hat Quay

Red Hat Quay 和 OpenShift 配置都是必需的:

9.1.3. Red Hat Quay 设置

创建一个专用的 Red Hat Quay 组织,并从该机构中创建的新应用程序,生成与 OpenShift 中的 Quay Bridge Operator 搭配使用的 OAuth 令牌

  1. 以具有超级用户访问权限的用户身份登录 Red Hat Quay,再选择要为其配置外部应用程序的组织。
  2. 在左侧导航中,选择 Applications。
  3. 选择 Create New Application 并输入新应用的名称(如 openshift)。
  4. 显示新应用程序后,将其选中。
  5. 在左侧导航中,选择 Generate Token 以创建新的 OAuth2 令牌。
  6. 选择所有复选框,授予集成所需的访问权限。
  7. 检查分配的权限,然后选择 Authorize Application,然后进行确认。
  8. 复制并保存要在下一节中使用的生成的 Access Token。

9.1.4. OpenShift 设置

为 Quay Bridge Operator 设置 OpenShift 需要几个步骤,包括:

9.1.4.1. 部署 Operator

部署 Operator 的最快方法是从 OperatorHub 部署。从 OpenShift Web 控制台中的 Administrator 视角,导航到 Operators 选项卡,然后选择 OperatorHub。

搜索 Quay Bridge Operator,然后选择 Install。

选择一个 Approval Strategy,然后选择 Install,它将 Operator 部署到集群中。

9.1.4.2. 为 OAuth 令牌创建 OpenShift secret

Operator 将使用前面获取的 Access Token 与 Quay 通信。将此令牌存储在 OpenShift 中,作为机密。

执行以下命令,在 openshift-operators 命名空间中创建一个名为 quay-integration 的 secret,其键 包含访问令牌:

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

9.1.4.3. 创建 QuayIntegration 自定义资源

最后,为了完成 OpenShift 和 Quay 之间的集成,需要创建 QuayIntegration 自定义资源。这可以在 Web 控制台中或命令行完成。

quay-integration.yaml

apiVersion: quay.redhat.com/v1
kind: QuayIntegration
metadata:
  name: example-quayintegration
spec:
  clusterID: openshift  1
  credentialsSecret:
    namespace: openshift-operators
    name: quay-integration2
  quayHostname: https://<QUAY_URL>   3
  insecureRegistry: false 4

1
clusterID 值应该在整个生态系统中唯一。这个值是可选的,默认为 openshift
2
credentialsSecret 属性引用包含之前创建的令牌的 secret 的命名空间和名称。
3
使用 Red Hat Quay 实例的主机名替换 QUAY_URL。
4
如果 Quay 使用自签名证书,请设置属性 insecureRegistry: true

创建 QuayIntegration 自定义资源:

$ oc create -f quay-integration.yaml

此时会创建 Quay 集成资源,将 OpenShift 集群链接到 Red Hat Quay 实例。Quay 中的机构应该从 OpenShift 环境为相关的命名空间创建

第 10 章 存储库镜像

10.1. 存储库镜像

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

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

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

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

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

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

10.2. 存储库镜像与 geo-replication

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

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

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

  • 不同数据中心或区域中的独立 registry 部署,整个内容的特定子集应该在数据中心/地区间共享
  • 自动同步或镜像(来自外部 registry 的上游存储库)到本地 Quay 部署中
注意

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

表 10.1. Red Hat Quay Repository 镜像与跨地域复制功能

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

旨在执行哪些功能?

共享、全局 registry

不同的 registry

如果复制或镜像还没有完成,会发生什么?

使用远程副本(Slower)

没有提供镜像

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

是(所有 Red Hat Quay 节点)

否(有存储)

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

所有 registry 内容都相同(共享数据库)

用户能否选择要镜像的个别命名空间或存储库?

no, default

用户是否可以应用过滤器进行同步规则?

10.3. 使用存储库镜像

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

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

10.4. 镜像配置 UI

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

    Enable mirroring and require HTTPS and verified certificates

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

10.5. 镜像配置字段

表 10.2. 镜像配置

字段类型描述

FEATURE_REPO_MIRROR

布尔值

启用或禁用存储库镜像

Default: false

 

 

 

REPO_MIRROR_INTERVAL

Number

检查存储库镜像候选时的秒数

Default: 30

REPO_MIRROR_SERVER_HOSTNAME

字符串

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

Default: None

示例:
openshift-quay-service

REPO_MIRROR_TLS_VERIFY

布尔值

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

默认: false

10.6. 镜像 worker

  • 要运行存储库镜像 worker,首先使用 repomirror 选项运行 Quay pod:

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

10.7. 创建已镜像的存储库

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

从外部容器 registry 对存储库进行镜像(mirror)时,创建一个新的私有存储库。名称与目标存储库相同,例如 quay-rhel8

Create new Red Hat Quay repo

10.7.1. 存储库镜像设置

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

    Create a new Red Hat Quay repo mirror

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

    Repository mirroring

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

    • registry Location: 您要镜像的外部仓库,如 registry.redhat.io/quay/quay-rhel8
    • tags: 此字段是必需的。您可以输入各个标签或标签模式的逗号分隔列表。(请参阅 Tag Patterns 部分以了解详细信息。)

      注意

      要让 Quay 获取远程存储库中的标签列表,必须满足以下要求之一:

      • 远程存储库中必须存在带有"latest"标签的镜像
      • 至少一个没有模式匹配的显式标签必须存在于您指定的标签列表中
    • 起始日期: 镜像开始的日期。默认使用当前的日期和时间。
    • 同步间隔: 默认每 24 小时同步。您可以根据小时或天更改。
    • 机器人用户: 创建新机器人帐户或选择现有的机器人帐户来进行镜像。
    • Username: 用于访问包含您要镜像的存储库的外部 registry 的用户名。
    • password: 与 Username 关联的密码。请注意,密码不能包含需要转义字符(\)的字符。

10.7.2. 高级设置

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

10.7.3. 现在同步

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

    Usage logs

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

    Repository mirroring tags

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

    Repository mirroring details

10.8. 镜像的事件通知

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

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

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

10.9. 镜像标签模式

如上方所述,必须明确输入至少一个 Tag(例如,标签模式不是标签模式),或者 报告存储库中必须存在标签 "latest"。(标签 "latest" 将不同步,除非标签列表中指定。)Quay 需要此项才能获取远程存储库中的标签列表,以便与指定的列表与镜像进行比较。

10.9.1. 模式语法

pattern

描述

*

匹配所有字符

?

匹配任何单个字符

[seq]

匹配 seq中的任何字符

[!seq]

匹配不在 seq中的任何字符

10.9.2. 标签模式示例

Pattern 示例

Matches 示例

v3*

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

v3.*

v3.1、v3.2、v3.2-4beta

v3.?

v3.1、v3.2、v3.3

v3.[12]

v3.1、v3.2

v3.[12]*

v3.1、v3.2、v3.2-4beta

v3.[!1]*

v3.2、v3.2-4beta、v3.3

10.10. 使用已镜像的存储库

创建经过镜像的存储库后,您可以可以通过多种方式使用该存储库。从 Repositories 页面选择您的镜像存储库,并进行以下任一操作:

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

    View logs for your Red Hat Quay repo mirror

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

    您可以通过进入 Account Settings 将现有机器机器分配到存储库,然后在左列中选择 Robot Accounts 图标。对于 robot 账户,选择 REPOSITORIES 列下的链接。在弹出窗口中,您可以:

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

    Assign permission to a robot

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

10.11. 存储库镜像建议

  • 存储库镜像 Pod 可以在任何节点上运行,包括已运行 Quay 的其他节点
  • 存储库镜像被调度到数据库中,并在批处理中运行。因此,更多 worker 意味着更快的镜像(mirror),因为处理更多批处理。
  • 镜像 pod 的最佳数量取决于:

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

第 11 章 在 OpenShift Container Platform 部署中备份和恢复 Red Hat Quay

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

11.1. 备份 Red Hat Quay

此流程只适用于 OpenShift Container Platform 和 NooBaa 部署。

先决条件

  • 在 OpenShift Container Platform 上部署 Red Hat Quay。

流程

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

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

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

    注意

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

    $ oc get secret -n <quay-namespace> <quay-registry-name>-quay-registry-managed-secret-keys -o yaml > managed-secret-keys.yaml
  4. 编辑生成的 managed-secret-keys.yaml 文件并删除所有所有者引用。您的 managed-secret-keys.yaml 文件应类似于如下:

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

    data 属性下的所有信息都应保持不变。

  5. 备份当前的 Quay 配置:

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

    $ oc exec -it quay-pod-name -- cat /conf/stack/config.yaml > quay-config.yaml
  7. 缩减 Quay Operator:

    $  oc scale --replicas=0 deployment $(oc get deployment -n <quay-operator-namespace> |awk '/^quay-operator/ {print $1}') -n <quay-operator-namespace>
  8. 缩减 Quay 命名空间:

    $ oc scale --replicas=0 deployment $(oc get deployment -n <quay-namespace> -l quay-component=quay -o jsonpath='{.items[0].metadata.name}') -n <quay-namespace>
  9. 等待 registry-quay-app pod 消失。您可以运行以下命令来检查其状态:

    $ oc get pods -n <quay-namespace>

    输出示例:

    registry-quay-config-editor-77847fc4f5-nsbbv   1/1     Running            0          9m1s
    registry-quay-database-66969cd859-n2ssm        1/1     Running            0          6d1h
    registry-quay-mirror-758fc68ff7-5wxlp          1/1     Running            0          8m29s
    registry-quay-mirror-758fc68ff7-lbl82          1/1     Running            0          8m29s
    registry-quay-redis-7cc5f6c977-956g8           1/1     Running            0          5d21h
  10. 识别 Quay PostgreSQL pod 名称:

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

    exampe 输出:

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

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

    $ oc exec quayregistry-quay-database-59f54bb7-58xs7 -- /usr/bin/pg_dump -C quayregistry-quay-database  > backup.sql
  3. 解码并导出 AWS_ACCESS_KEY_ID

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

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

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

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

  1. 扩展 Quay Operator:

    $  oc scale --replicas=1 deployment $(oc get deployment -n <quay-operator-namespace> |awk '/^quay-operator/ {print $1}') -n <quay-operator-namespace>
  2. 扩展 Quay 命名空间:

    $ oc scale --replicas=1 deployment $(oc get deployment -n <quay-namespace> -l quay-component=quay -o jsonpath='{.items[0].metadata.name}') -n <quay-namespace>
  3. 检查 Operator 的状态:

    $ oc get quayregistry <quay-registry-name> -n <quay-namespace> -o yaml

    输出示例:

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      ...
      name: example-registry
      namespace: <quay-namespace>
      ...
    spec:
      components:
      - kind: quay
        managed: true
      ...
      - kind: clairpostgres
        managed: true
      configBundleSecret: init-config-bundle-secret
    status:
      configEditorCredentialsSecret: example-registry-quay-config-editor-credentials-fg2gdgtm24
      configEditorEndpoint: https://example-registry-quay-config-editor-quay-enterprise.apps.docs.gcp.quaydev.org
      currentVersion: 3.7.0
      lastUpdated: 2022-05-11 13:28:38.199476938 +0000 UTC
      registryEndpoint: https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org
         0          5d21h

11.2. 恢复 Red Hat Quay

当 Red Hat Quay Operator 管理数据库时,这个流程用于恢复 Red Hat Quay。它应该在执行 Quay registry 备份后执行。

先决条件

  • Red Hat Quay 使用 Quay Operator 在 OpenShift Container Platform 上部署。
  • 您的 Red Hat Quay 数据库已被备份。

流程

  1. 恢复备份的 Quay 配置和随机生成的密钥:

    $ oc create -f ./config-bundle.yaml
    $ oc create -f ./managed-secret-keys.yaml
    注意

    如果您收到错误 Error from server (AlreadyExists):创建 "./config-bundle.yaml": secrets "config-bundle-secret" already exists 时的错误,您必须使用 $ oc delete Secret config-bundle-secret -n <quay -namespace > 重新创建它。

  2. 恢复 QuayRegistry 自定义资源:

    $ oc create -f ./quay-registry.yaml
  3. 缩减 Quay Operator:

    $  oc scale --replicas=0 deployment $(oc get deployment -n <quay-operator-namespace> |awk '/^quay-operator/ {print $1}') -n <quay-operator-namespace>
  4. 缩减 Quay 命名空间:

    $ oc scale --replicas=0 deployment $(oc get deployment -n <quay-namespace> -l quay-component=quay -o jsonpath='{.items[0].metadata.name}') -n <quay-namespace>
  5. 识别您的 Quay 数据库 pod:

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

    输出示例:

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

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

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

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

    postgres=# \l

    输出示例:

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

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

    输出示例:

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

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

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

    sh-4.4$ exit
  14. 导出 AWS_ACCESS_KEY_ID

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

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

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

    $  oc scale --replicas=1 deployment $(oc get deployment -n <quay-operator-namespace> |awk '/^quay-operator/ {print $1}') -n <quay-operator-namespace>
  18. 扩展 Quay 命名空间:

    $ oc scale --replicas=1 deployment $(oc get deployment -n <quay-namespace> -l quay-component=quay -o jsonpath='{.items[0].metadata.name}') -n <quay-namespace>
  19. 检查 Operator 的状态,并确保它重新上线:

    $ oc get quayregistry -n <quay-namespace> <registry-name> -o yaml

    输出示例:

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      ...
      name: example-registry
      namespace: quay-enterprise
      ...
    spec:
      components:
      - kind: quay
        managed: true
      ...
      - kind: clairpostgres
        managed: true
      configBundleSecret: init-config-bundle-secret
    status:
      configEditorCredentialsSecret: example-registry-quay-config-editor-credentials-fg2gdgtm24
      configEditorEndpoint: https://example-registry-quay-config-editor-quay-enterprise.apps.docs.gcp.quaydev.org
      currentVersion: 3.7.0
      lastUpdated: 2022-05-11 13:28:38.199476938 +0000 UTC
      registryEndpoint: https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org
         0          5d21h

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

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

12.1. 启用 LDAP 之前的注意事项

12.1.1. 现有的 Quay 部署

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

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

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

12.2. 设置 LDAP 配置

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

Fill in LDAP information

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

12.2.1. 完整 LDAP URI

LDAP server URI LDAP server SSL

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

12.2.2. 团队同步

Team synchronization

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

Team synchronization

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

12.2.3. 基本和依赖关系名称

Distinguished Names

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

12.2.4. 其他用户过滤器

User filters

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

12.2.5. 管理员 DN

Administrator DN

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

12.2.6. UID 和 Mail 属性

UID and Mail

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

12.2.7. 验证

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

Fill in LDAP information

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

12.3. 常见问题

无效凭证

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

超级用户 %USERNAME% 的验证失败:用户名找不到远程身份验证系统中没有该用户,或者 LDAP auth 配置错误。

Red Hat Quay 可以通过 Administrator DN 字段中指定的用户名/密码连接到 LDAP 服务器,但是,使用用户 Relative DN Path 中的 UID Attribute 或 mail Attribute 字段找到当前登录的用户。当前登录用户都没有用户相关 DN 路径,或者 Administrator DN 用户没有搜索/读取此 LDAP 路径的权限。

12.4. 将 LDAP 用户配置为超级用户

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

Confirm LDAP username for Red Hat Quay

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

SUPER_USERS:
- testadmin

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

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

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

13.1. 公开 Prometheus 端点

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

现在,指标将可用:

$ curl quay.example.com:9091/metrics

有关配置 Prometheus 和 Grafana 来监控 Quay 存储库数的详细信息,请参阅 Prometheus 和 Grafana 的 Monitoring Quay。

13.1.2. Red Hat Quay Operator

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

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

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

$ oc debug node/master-0

sh-4.4# curl 172.30.37.76:9091/metrics

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

13.1.3. 将 Prometheus 设置为消耗指标

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

13.1.4. Kubernetes 下的 DNS 配置

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

13.1.5. 手动集群的 DNS 配置

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

13.2. 指标简介

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

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

13.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: Queue for Quay docker build
    • imagestoragereplication: 要在多个存储之间复制 Queued blob
    • chunk_cleanup: 需要删除的 Queued blob 片段。这仅由某些存储实施使用,例如 Swift。

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

  • quay_queue_items_locked 是当前要删除的存储库的数量。
  • quay_queue_items_available_unlocked 是等待由 worker 处理的存储库数量。

指标输出示例

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

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

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

13.2.3. 垃圾收集指标

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

指标名称描述

quay_gc_iterations_total

GCWorker 的迭代数

quay_gc_namespaces_purged_total

NamespaceGCWorker 清除的命名空间数量

quay_gc_repos_purged_total

RepositoryGCWorker 或 NamespaceGCWorker 清除的软件仓库数量

quay_gc_storage_blobs_deleted_total

已删除存储 Blob 的数量

指标输出示例

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

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

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

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

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

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

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

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

13.2.3.1. 多部分上传指标

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

指标名称描述

quay_multipart_uploads_started_total

完成了多部分到 Quay 存储的数量

quay_multipart_uploads_completed_total

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

指标输出示例

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

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

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

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

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

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

13.2.4.1. 镜像拉取总计

指标名称描述

quay_registry_image_pulls_total

从 registry 中下载的镜像数量。

指标标签

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

13.2.4.2. 拉取的镜像字节数

指标名称描述

quay_registry_image_pulled_estimated_bytes_total

从 registry 下载的字节数

指标标签

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

13.2.4.3. 镜像推送总计

指标名称描述

quay_registry_image_pushes_total

从 registry 中上传的镜像数量。

指标标签

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

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

13.2.5. 身份验证指标

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

指标名称描述

quay_authentication_attempts_total

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

指标标签

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

    • Basic
    • oauth
    • credentials
  • success: true 或 false

指标输出示例

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

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

第 14 章 geo-replication

从客户端或用户的视角,地域复制允许多个地理位置分散的 Quay 部署作为单个 registry 工作。它在全局分布式 Quay 设置中显著提高推送和提升性能。镜像数据在后台异步复制,并且为客户端提供透明故障转移/重定向。

注意

Operator 不支持在 OpenShift 上使用异地复制部署 Red Hat Quay。

14.1. 异地复制功能

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

14.2. 异地复制要求和限制

  • 因此,在所有地区间共享所有元数据和 Quay 配置。
  • 单一 Redis 缓存在整个 Quay 设置间共享,需要可以被所有 Quay pod 访问。
  • 所有区域应使用完全相同的配置,但存储后端除外,可以使用 QUAY_DISTRIBUTED_STORAGE_PREFERENCE 环境变量进行显式配置。
  • 异地复制需要每个地区中的对象存储。它无法使用本地存储或 NFS。
  • 每个区域必须能够访问每个地区中的每个存储引擎(需要网络路径)。
  • 另外,也可以使用 storage proxy 选项。
  • 整个存储后端(所有 blob)被复制。这与存储库镜像(mirror)不同,它们仅限于机构或存储库或镜像。
  • 所有 Quay 实例都必须共享同一入口点,通常通过负载均衡器。
  • 所有 Quay 实例都必须有一组相同的超级用户,因为它们在通用配置文件中定义。

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

14.3. 异地复制架构

Georeplication

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

14.4. 启用存储复制

  1. 向下滚动到标题 Registry Storage 的部分。
  2. Enable Storage Replication
  3. 添加每个要复制数据的存储引擎。必须列出要使用的所有存储引擎。
  4. 如果需要将所有镜像复制到所有存储引擎,请在各个存储引擎配置中单击 Replicate 到存储引擎。这将确保所有镜像都复制到该存储引擎。要改为启用按命名空间复制,请联系支持。
  5. 完成后,单击 Save Configuration Changes。配置更改将在 Red Hat Quay 下次重启时生效。
  6. 为 Georeplications 添加存储并启用"Replicate to存储引擎"后,您需要在所有存储间同步现有镜像数据。要做到这一点,您需要 oc exec (或 docker/kubectl exec)到容器中,并运行:

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

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

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

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

    例如,对于在欧洲中运行的机器,使用主机上的 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.6.8
    注意

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

  3. 重启所有 Red Hat Quay 容器

第 15 章 Red Hat Quay 故障排除

常见故障模式和恢复最佳实践。

第 16 章 Red Hat Quay 配置的架构

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

Red Hat Quay Configuration Guide 中介绍了配置选项。

其他资源