Red Hat Quay Operator 的功能

Red Hat Quay 3.9

高级 Red Hat Quay Operator 功能

Red Hat OpenShift Documentation Team

摘要

高级 Red Hat Quay Operator 功能

第 1 章 联邦信息处理标准(FIPS)就绪和合规性

由国家标准与技术(NIST)开发的联邦信息处理标准(FIPS)被认为是保护和加密敏感数据的高度关注,特别是在美国、企业和公共领域。Red Hat Enterprise Linux (RHEL)和 OpenShift Container Platform 通过提供 FIPS 模式 来支持 FIPS,系统只允许使用特定 FIPS 验证的加密模块,如 openssl。这样可确保 FIPS 合规性。

1.1. 启用 FIPS 合规性

使用以下步骤在 Red Hat Quay 部署中启用 FIPS 合规性。

前提条件

  • 如果您正在运行独立部署 Red Hat Quay,您的 Red Hat Enterprise Linux (RHEL)部署是版本 8 或更高版本,启用了 FIPS。
  • 如果使用 Red Hat Quay Operator,OpenShift Container Platform 为 4.10 或更高版本。
  • 您的 Red Hat Quay 版本为 3.5.0 或更高版本。
  • 您有 Red Hat Quay 部署的管理特权。

流程

  • 在 Red Hat Quay config.yaml 文件中,将 FEATURE_FIPS 配置字段设置为 true。例如:

    ---
    FEATURE_FIPS = true
    ---

    FEATURE_FIPS 设置为 true 时,Red Hat Quay 会使用 FIPS 兼容的哈希功能运行。

第 2 章 控制台监控和警报

Red Hat Quay 支持从 OpenShift Container Platform 控制台内部使用 Red Hat Quay Operator 部署监控实例。新的监控功能包括 Grafana 仪表板、访问单个指标和警报,以通知频繁重启 Quay pod。

注意

要启用监控功能,必须在 All Namespaces 模式中安装 Red Hat Quay Operator。

2.1. Dashboard

在 OpenShift Container Platform 控制台中,点 MonitoringDashboards 并搜索所需 Red Hat Quay registry 实例的仪表板:

Choose Quay dashboard

仪表板显示各种统计信息,包括:

  • 机构存储库用户和 Robot 帐户的数量
  • CPU 用量
  • 最大内存用量
  • 拉取和推送率,以及身份验证请求
  • API 请求率
  • 延迟

Console dashboard

2.2. 指标

您可以通过在 UI 中访问 MonitoringMetrics 来查看 Red Hat Quay 仪表板后面的底层指标。在 Expression 字段中,输入文本 quay_ 以查看可用指标列表:

Quay metrics

选择一个指标示例,如 quay_org_rows

Number of Quay organizations

此指标显示 registry 中的机构数量。它在仪表板中也直接显示。

2.3. 警报

如果 Quay Pod 重启太频繁,则会引发警报。通过在控制台 UI 中从 MonitoringAlerting 访问 Alerting rules 选项卡并搜索 Quay 特定警报,可以配置警报:

Alerting rules

选择 QuayPodFrequentlyRestarting 规则详情来配置警报:

Alerting rule details

第 3 章 在 OpenShift Container Platform 上配置 Red Hat Quay

部署后,您可以通过编辑 Red Hat Quay 配置捆绑包 secret spec.configBundleSecret 来配置 Red Hat Quay 应用程序。您还可以更改 QuayRegistry 资源的 spec.components 对象中组件的受管状态。

或者,您可以使用 config 编辑器 UI 来配置 Red Hat Quay 应用程序。如需更多信息,请参阅使用配置工具在 OpenShift Container Platform 上重新配置 Red Hat Quay

3.1. 在 OpenShift Container Platform 控制台中编辑 config bundle secret

使用以下步骤编辑 OpenShift Container Platform 控制台中的配置捆绑包 secret。

流程

  1. 在 Red Hat Quay Registry 概述屏幕上,单击 Config Bundle Secret 的链接。

    Red Hat Quay Registry overview

  2. 要编辑 secret,请点击 ActionsEdit Secret

    Edit secret

  3. 修改配置并保存更改。

    Save changes

  4. 监控部署以确保成功完成,并且配置更改已生效。

3.2. 确定 QuayRegistry 端点和 secret

使用以下步骤查找 QuayRegistry 端点和 secret。

流程

  1. 您可以通过输入以下命令来查找当前的端点和 secret,使用 oc describe quayregistryoc get quayregistry -o yaml 检查 QuayRegistry 资源:

    $ oc get quayregistry example-registry -n quay-enterprise -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 1
    status:
      configEditorCredentialsSecret: example-registry-quay-config-editor-credentials-fg2gdgtm24 2
      configEditorEndpoint: https://example-registry-quay-config-editor-quay-enterprise.apps.docs.gcp.quaydev.org 3
      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 4

    1
    config bundle secret,其中包含 config.yaml 文件和任何 SSL/TLS 证书。
    2
    包含用户名(通常是 quayconfig)和密码的 secret。
    3
    config 编辑器工具的 URL,用于浏览器访问配置工具,以及配置 API。
    4
    registry 的 URL,用于浏览器访问 registry UI,以及 registry API 端点。

3.2.1. 查找配置编辑器工具的用户名和密码

使用以下步骤查找配置编辑器工具的用户名和密码。

流程

  1. 输入以下命令来检索 secret:

    $ oc get secret -n quay-enterprise example-registry-quay-config-editor-credentials-fg2gdgtm24 -o yaml

    输出示例

    apiVersion: v1
    data:
      password: SkZwQkVKTUN0a1BUZmp4dA==
      username: cXVheWNvbmZpZw==
    kind: Secret

  2. 输入以下命令解码用户名:

    $ echo 'cXVheWNvbmZpZw==' | base64 --decode

    输出示例

    quayconfig

  3. 输入以下命令解码密码:

    $ echo 'SkZwQkVKTUN0a1BUZmp4dA==' | base64 --decode

    输出示例

    JFpBEJMCtkPTfjxt

3.3. 下载现有配置

以下流程详细介绍了如何使用不同的策略下载现有配置。

3.3.1. 使用配置编辑器端点下载现有配置

使用以下步骤通过配置编辑器端点下载现有配置。

流程

  • 输入以下命令,指定配置编辑器的用户名和密码来下载现有配置:

    $ curl -k -u quayconfig:JFpBEJMCtkPTfjxt https://example-registry-quay-config-editor-quay-enterprise.apps.docs.quayteam.org/api/v1/config

    输出示例

    {
        "config.yaml": {
            "ALLOW_PULLS_WITHOUT_STRICT_LOGGING": false,
            "AUTHENTICATION_TYPE": "Database",
            ...
            "USER_RECOVERY_TOKEN_LIFETIME": "30m"
        },
        "certs": {
            "extra_ca_certs/service-ca.crt": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURVVENDQWptZ0F3SUJBZ0lJRE9kWFhuUXFjMUF3RFFZSktvWklodmNOQVFFTEJRQXdOakUwTURJR0ExVUUKQXd3cmIzQmxibk5vYVdaMExYTmxjblpwWTJVdGMyVnlkbWx1WnkxemFXZHVaWEpBTVRZek1UYzNPREV3TXpBZQpGdzB5TVRBNU1UWXdOelF4TkRKYUZ..."
        }
    }

3.3.2. 使用 config bundle secret 下载现有配置

您可以使用 config bundle secret 下载现有配置。

流程

  1. 输入以下命令来获取 secret 数据:

    $ oc get secret -n quay-enterprise init-config-bundle-secret -o jsonpath='{.data}'

    输出示例

    {
        "config.yaml": "RkVBVFVSRV9VU0 ... MDAwMAo="
    }

  2. 输入以下命令解码数据:

    $ echo 'RkVBVFVSRV9VU0 ... MDAwMAo=' | base64 --decode

    输出示例

    FEATURE_USER_INITIALIZE: true
    BROWSER_API_CALLS_XHR_ONLY: false
    SUPER_USERS:
    - quayadmin
    FEATURE_USER_CREATION: false
    FEATURE_QUOTA_MANAGEMENT: true
    FEATURE_PROXY_CACHE: true
    FEATURE_BUILD_SUPPORT: true
    DEFAULT_SYSTEM_REJECT_QUOTA_BYTES: 102400000

3.4. 使用配置捆绑包配置自定义 SSL/TLS 证书

您可以在初始部署前配置自定义 SSL/TLS 证书,或者在 OpenShift Container Platform 上部署 Red Hat Quay 后配置。这可以通过创建或更新配置捆绑包 secret 来完成。

如果要将证书添加到现有部署中,则必须在新配置捆绑包 secret 中包含现有的 config.yaml 文件,即使您没有进行任何更改。

使用以下步骤添加自定义 SSL/TLS 证书。

流程

  1. QuayRegistry YAML 文件中,将 kind: tls 设置为 managed:false,例如:

      - kind: tls
        managed: false
  2. 导航到 Events 页面,这应该显示更改被阻止,直到您设置适当的配置为止。例如:

        - lastTransitionTime: '2022-03-28T12:56:49Z'
          lastUpdateTime: '2022-03-28T12:56:49Z'
          message: >-
            required component `tls` marked as unmanaged, but `configBundleSecret`
            is missing necessary fields
          reason: ConfigInvalid
          status: 'True'
  3. 使用嵌入式数据或使用文件创建 secret。

    1. 直接将配置详情嵌入到 Secret 资源 YAML 文件中。例如:

      custom-ssl-config-bundle.yaml

      apiVersion: v1
      kind: Secret
      metadata:
        name: custom-ssl-config-bundle-secret
        namespace: quay-enterprise
      data:
        config.yaml: |
          FEATURE_USER_INITIALIZE: true
          BROWSER_API_CALLS_XHR_ONLY: false
          SUPER_USERS:
          - quayadmin
          FEATURE_USER_CREATION: false
          FEATURE_QUOTA_MANAGEMENT: true
          FEATURE_PROXY_CACHE: true
          FEATURE_BUILD_SUPPORT: true
          DEFAULT_SYSTEM_REJECT_QUOTA_BYTES: 102400000
        extra_ca_cert_my-custom-ssl.crt: |
          -----BEGIN CERTIFICATE-----
          MIIDsDCCApigAwIBAgIUCqlzkHjF5i5TXLFy+sepFrZr/UswDQYJKoZIhvcNAQEL
          BQAwbzELMAkGA1UEBhMCSUUxDzANBgNVBAgMBkdBTFdBWTEPMA0GA1UEBwwGR0FM
          ....
          -----END CERTIFICATE-----

    2. 从 YAML 文件创建 secret:

      $ oc create  -f custom-ssl-config-bundle.yaml

      ..

  4. 另外,您可以创建包含所需信息的文件,然后从这些文件创建 secret。

    1. 输入以下命令创建一个包含 config.yaml 文件和 custom-ssl.crt 文件的通用 Secret 对象:

      $ oc create secret generic custom-ssl-config-bundle-secret \
        --from-file=config.yaml \
        --from-file=extra_ca_cert_my-custom-ssl.crt=my-custom-ssl.crt
    2. 创建或更新 QuayRegistry YAML 文件,引用创建的 Secret,例如:

      QuayRegistry YAML 文件示例

      apiVersion: quay.redhat.com/v1
      kind: QuayRegistry
      metadata:
        name: example-registry
        namespace: quay-enterprise
      spec:
        configBundleSecret: custom-ssl-config-bundle-secret

    3. 输入以下命令使用 YAML 文件部署或更新 registry:

      oc apply -f quayregistry.yaml

第 4 章 使用配置工具在 OpenShift Container Platform 上重新配置 Red Hat Quay

4.1. 访问配置编辑器

QuayRegistry 对象的 Details 部分中,提供了配置编辑器的端点,以及包含登录配置编辑器凭证的 Secret 对象的链接。例如:

Config editor details

4.1.1. 检索配置编辑器凭证

使用以下步骤检索配置编辑器凭证。

流程

  1. 点配置编辑器 secret 的链接:

    Config editor secret

  2. Secret 详情页面的 Data 部分中,点 Reveal 值 来查看用于登录到配置编辑器的凭证。例如:

    Config editor secret reveal

4.1.2. 登录到配置编辑器

使用以下步骤登录到配置编辑器。

流程

  • 进入配置编辑器端点。出现提示时,输入用户名,如 quayconfig 和密码。例如:

    Config editor user interface

4.1.3. 更改配置

在以下示例中,您可以通过更改已删除标签的默认过期周期来更新配置文件。

流程

  1. 在配置编辑器中,找到 Time Machine 部分。
  2. Allowed expiration period 框中添加一个过期周期,例如 4w

    Add expiration period

  3. 选择 Validate Configuration Changes 以确保更改有效。
  4. Reconfigure Quay 来应用更改:

    Reconfigure

应用更改后,配置工具会通知您已向 Red Hat Quay 部署提交了更改:

Reconfigured

注意

使用配置工具 UI 重新配置 Red Hat Quay 可能会导致 registry 在应用更新的配置时短时间内不可用。

4.2. 监控 Red Hat Quay UI 中的重新配置

您可以实时监控 Red Hat Quay 的重新配置。

4.2.1. QuayRegistry 资源

重新配置 Red Hat Quay Operator 后,您可以在 QuayRegistry 的特定实例的 YAML 选项卡中跟踪重新部署的进度,本例中为 example-registry

ui monitor deploy update

每次状态更改时,系统会提示您重新载入数据以查看更新的版本。最后,Red Hat Quay Operator 会协调更改,且没有报告不健康的组件。

ui monitor deploy done

4.2.2. 事件

QuayRegistryEvents 选项卡显示与重新部署相关的一些事件。例如:

ui monitor deploy streaming events

对于受重新配置影响的命名空间中的所有资源,流事件位于 HomeEvents 下的 OpenShift Container Platform 控制台中。例如:

ui monitor deploy streaming events

4.3. 重新配置后访问更新的信息

使用以下步骤,使用 Red Hat Quay UI 和配置捆绑包访问更新的 config.yaml 文件。

流程

  1. QuayRegistry Details 屏幕上,点 Config Bundle Secret
  2. Secret details 屏幕的 Data 部分,点 Reveal values 查看 config.yaml 文件。
  3. 检查是否应用了更改。在这种情况下,4w 应位于 TAG_EXPIRATION_OPTIONS 列表中。例如:

    ---
    SERVER_HOSTNAME: example-quay-openshift-operators.apps.docs.quayteam.org
    SETUP_COMPLETE: true
    SUPER_USERS:
    - quayadmin
    TAG_EXPIRATION_OPTIONS:
    - 2w
    - 4w
    ---

4.4. 自定义 SSL/TLS 证书 UI

配置工具可用于加载自定义证书,以方便访问外部数据库等资源。选择要上传的自定义证书,确保它们采用 PEM 格式,其扩展名为 .crt

Custom SSL/TLS certificates

配置工具还显示任何上传的证书列表。上传自定义 SSL/TLS 证书后,它将出现在列表中。例如:

Custom SSL/TLS certificates

4.5. 对 Registry 的外部访问

在 OpenShift Container Platform 上运行时,Routes API 可用,并自动用作受管组件。创建 QuayRegistry 对象后,外部访问点可在 QuayRegistry 对象的 status 块中找到。例如:

status:
  registryEndpoint: some-quay.my-namespace.apps.mycluster.com

4.6. QuayRegistry API

Red Hat Quay Operator 提供 QuayRegistry 自定义资源 API,以声明性地管理集群中的 Quay 容器 registry。使用 OpenShift Container Platform UI 或命令行工具与 API 交互。

  • 创建 QuayRegistry 会导致 Red Hat Quay Operator 在集群中部署并配置运行 Red Hat Quay 所需的所有资源。
  • 编辑 QuayRegistry 会导致 Red Hat Quay Operator 协调更改并创建、更新和删除对象以匹配所需的配置。
  • 删除 QuayRegistry 会导致所有之前创建的资源进行垃圾回收。删除后,Quay 容器注册表不再可用。

QuayRegistry API 字段在以下部分中概述。

第 5 章 Clair for Red Hat Quay

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

5.1. Clair 安全漏洞数据库

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

  • Ubuntu Oval 数据库
  • Debian Oval 数据库
  • Red Hat Enterprise Linux (RHEL) Oval 数据库
  • Dan Oval 数据库
  • Oracle Oval 数据库
  • alpine SecDB 数据库
  • VMware Photon OS 数据库
  • Amazon Web Services (AWS) UpdateInfo
  • Pyup.io (Python)数据库

有关 Clair 如何使用不同数据库进行安全映射的详情,请参考 ClairCore严重性映射

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

5.3. 测试 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 漏洞报告,且不会作为程序错误解决。

5.4. 高级 Clair 配置

使用以下部分中的步骤配置高级 Clair 设置。

5.4.1. 非受管 Clair 配置

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

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

5.4.1.1. 使用非受管 Clair 数据库运行自定义 Clair 配置

使用以下步骤将 Clair 数据库设置为 unmanaged。

流程

  • 在 Quay Operator 中,将 QuayRegistry 自定义资源的 clairpostgres 组件设置为 managed: false

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

5.4.1.2. 使用非受管 Clair 数据库配置自定义 Clair 数据库

用于 OpenShift Container Platform 的 Red Hat Quay Operator 允许用户提供自己的 Clair 数据库。

使用以下步骤创建自定义 Clair 数据库。

注意

以下流程使用 SSL/TLS 认证设置 Clair。要查看没有使用 SSL/TSL 认证设置 Clair 的类似流程,请参阅"使用受管 Clair 配置自定义 Clair 数据库"。

流程

  1. 输入以下命令创建一个包含 clair-config.yaml 的 Quay 配置捆绑包 secret:

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

    Clair config.yaml 文件示例

    indexer:
        connstring: host=quay-server.example.com port=5432 dbname=quay user=quayrdsdb password=quayrdsdb sslrootcert=/run/certs/rds-ca-2019-root.pem sslmode=verify-ca
        layer_scan_concurrency: 6
        migrations: true
        scanlock_retry: 11
    log_level: debug
    matcher:
        connstring: host=quay-server.example.com port=5432 dbname=quay user=quayrdsdb password=quayrdsdb sslrootcert=/run/certs/rds-ca-2019-root.pem sslmode=verify-ca
        migrations: true
    metrics:
        name: prometheus
    notifier:
        connstring: host=quay-server.example.com port=5432 dbname=quay user=quayrdsdb password=quayrdsdb sslrootcert=/run/certs/rds-ca-2019-root.pem sslmode=verify-ca
        migrations: true

    注意
    • 数据库证书挂载到 clair-config.yaml 中的 Clair 应用程序 pod 上的 /run/certs/rds-ca-2019-root.pem 下。它必须在配置 clair-config.yaml 时指定。
    • Clair on OpenShift config 中包括了一个 clair-config.yaml 示例。
  2. clair-config.yaml 文件添加到捆绑包 secret 中,例如:

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

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

  3. 您可以点击 Build History 页面中的提交或运行 oc get pods -n <namespace > 来检查 Clair pod 的状态。例如:

    $ oc get pods -n <namespace>

    输出示例

    NAME                                               READY   STATUS    RESTARTS   AGE
    f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2   1/1     Running   0          7s

5.4.2. 使用受管 Clair 数据库运行自定义 Clair 配置

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

  • 当用户想要禁用特定的更新器资源时。
  • 当用户在断开连接的环境中运行 Red Hat Quay 时。有关在断开连接的环境中运行 Clair 的更多信息,请参阅 在 air-gapped OpenShift 集群中配置对 Clair 数据库的访问

    注意
    • 如果您在断开连接的环境中运行 Red Hat Quay,则 clair-config.yamlairgap 参数必须设置为 true
    • 如果您在断开连接的环境中运行 Red Hat Quay,您应该禁用所有更新器组件。

5.4.2.1. 将 Clair 数据库设置为 managed

使用以下步骤将 Clair 数据库设置为 managed。

流程

  • 在 Quay Operator 中,将 QuayRegistry 自定义资源的 clairpostgres 组件设置为 managed: true

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

5.4.2.2. 使用受管 Clair 配置配置自定义 Clair 数据库

用于 OpenShift Container Platform 的 Red Hat Quay Operator 允许用户提供自己的 Clair 数据库。

使用以下步骤创建自定义 Clair 数据库。

流程

  1. 输入以下命令创建一个包含 clair-config.yaml 的 Quay 配置捆绑包 secret:

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

    Clair config.yaml 文件示例

    indexer:
        connstring: host=quay-server.example.com port=5432 dbname=quay user=quayrdsdb password=quayrdsdb sslmode=disable
        layer_scan_concurrency: 6
        migrations: true
        scanlock_retry: 11
    log_level: debug
    matcher:
        connstring: host=quay-server.example.com port=5432 dbname=quay user=quayrdsdb password=quayrdsdb sslmode=disable
        migrations: true
    metrics:
        name: prometheus
    notifier:
        connstring: host=quay-server.example.com port=5432 dbname=quay user=quayrdsdb password=quayrdsdb sslmode=disable
        migrations: true

    注意
    • 数据库证书挂载到 clair-config.yaml 中的 Clair 应用程序 pod 上的 /run/certs/rds-ca-2019-root.pem 下。它必须在配置 clair-config.yaml 时指定。
    • Clair on OpenShift config 中包括了一个 clair-config.yaml 示例。
  2. clair-config.yaml 文件添加到捆绑包 secret 中,例如:

    apiVersion: v1
    kind: Secret
    metadata:
      name: config-bundle-secret
      namespace: quay-enterprise
    data:
      config.yaml: <base64 encoded Quay config>
      clair-config.yaml: <base64 encoded Clair config>
    注意
    • 更新后,提供的 clair-config.yaml 文件会挂载到 Clair pod 中。不提供的任何字段都会使用 Clair 配置模块自动填充默认值。
  3. 您可以点击 Build History 页面中的提交或运行 oc get pods -n <namespace > 来检查 Clair pod 的状态。例如:

    $ oc get pods -n <namespace>

    输出示例

    NAME                                               READY   STATUS    RESTARTS   AGE
    f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2   1/1     Running   0          7s

5.4.3. 在断开连接的环境中的 Clair

Clair 使用一组名为 updaters 的组件来处理从各种漏洞数据库获取和解析数据。默认设置更新程序,以直接从互联网拉取漏洞数据,并可以立即使用。但是,一些用户可能需要 Red Hat Quay 在断开连接的环境中运行,或者在没有直接访问互联网的环境中运行。Clair 通过处理不同类型的更新工作流来支持断开连接的环境。这可以通过使用 clairctl 命令行界面工具来工作,该工具使用开放主机从互联网获取更新器数据,安全地将数据传送到隔离的主机上,然后将隔离主机上的更新器数据变为 Clair。

使用本指南在断开连接的环境中部署 Clair。

注意

目前,Clair 增强数据是 CVSS 数据。目前在断开连接的环境中不支持增强数据。

有关 Clair updaters 的更多信息,请参阅"Clair updaters"。

5.4.3.1. 在断开连接的 OpenShift Container Platform 集群中设置 Clair

使用以下步骤在断开连接的 OpenShift Container Platform 集群中设置 OpenShift Container Platform 置备的 Clair pod。

5.4.3.1.1. 为 OpenShift Container Platform 部署安装 clairctl 命令行工具

使用以下步骤为 OpenShift Container Platform 部署安装 clairctl CLI 工具。

流程

  1. 输入以下命令在 OpenShift Container Platform 集群中为 Clair 部署安装 clairctl 程序:

    $ oc -n quay-enterprise exec example-registry-clair-app-64dd48f866-6ptgw -- cat /usr/bin/clairctl > clairctl
    注意

    未正式,可以下载 clairctl 工具

  2. 设置 clairctl 文件的权限,以便用户可以由用户执行并运行,例如:

    $ chmod u+x ./clairctl
5.4.3.1.2. 为 OpenShift Container Platform 上的 Clair 部署检索和解码 Clair 配置 secret

使用以下步骤检索和解码 OpenShift Container Platform 上置备的 Clair 实例的配置 secret。

先决条件

  • 已安装 clairctl 命令行工具工具。

流程

  1. 输入以下命令来检索和解码配置 secret,然后将其保存到 Clair 配置 YAML 中:

    $ oc get secret -n quay-enterprise example-registry-clair-config-secret  -o "jsonpath={$.data['config\.yaml']}" | base64 -d > clair-config.yaml
  2. 更新 clair-config.yaml 文件,以便 disable_updatersairgap 参数设置为 true,例如:

    ---
    indexer:
      airgap: true
    ---
    matcher:
      disable_updaters: true
    ---
5.4.3.1.3. 从连接的 Clair 实例导出更新程序捆绑包

使用以下步骤从可访问互联网的 Clair 实例导出 updaters 捆绑包。

先决条件

  • 已安装 clairctl 命令行工具工具。
  • 您已检索并解码了 Clair 配置 secret,并将其保存到 Clair config.yaml 文件中。
  • 在 Clair config.yaml 文件中,disable_updatersairgap 参数被设置为 true

流程

  • 从可访问互联网的 Clair 实例中,使用 clairctl CLI 工具和配置文件导出更新器捆绑包。例如:

    $ ./clairctl --config ./config.yaml export-updaters updates.gz
5.4.3.1.4. 在断开连接的 OpenShift Container Platform 集群中配置对 Clair 数据库的访问

使用以下步骤在断开连接的 OpenShift Container Platform 集群中配置对 Clair 数据库的访问。

先决条件

  • 已安装 clairctl 命令行工具工具。
  • 您已检索并解码了 Clair 配置 secret,并将其保存到 Clair config.yaml 文件中。
  • 在 Clair config.yaml 文件中,disable_updatersairgap 参数被设置为 true
  • 您已从可访问互联网的 Clair 实例导出 updaters 捆绑包。

流程

  1. 使用 oc CLI 工具确定 Clair 数据库服务,例如:

    $ oc get svc -n quay-enterprise

    输出示例

    NAME                                  TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                             AGE
    example-registry-clair-app            ClusterIP      172.30.224.93    <none>        80/TCP,8089/TCP                     4d21h
    example-registry-clair-postgres       ClusterIP      172.30.246.88    <none>        5432/TCP                            4d21h
    ...

  2. 转发 Clair 数据库端口,使其可从本地机器访问。例如:

    $ oc port-forward -n quay-enterprise service/example-registry-clair-postgres 5432:5432
  3. 更新 Clair config.yaml 文件,例如:

    indexer:
        connstring: host=localhost port=5432 dbname=postgres user=postgres password=postgres sslmode=disable 1
        scanlock_retry: 10
        layer_scan_concurrency: 5
        migrations: true
        scanner:
          repo:
            rhel-repository-scanner: 2
              repo2cpe_mapping_file: /data/cpe-map.json
          package:
            rhel_containerscanner: 3
              name2repos_mapping_file: /data/repo-map.json
    1
    在多 connstring 字段中使用 localhost 替换 host 的值。
    2
    有关 rhel-repository-scanner 参数的更多信息,请参阅 "Mapping repository to Common Product Enumeration"。
    3
    有关 rhel_containerscanner 参数的更多信息,请参阅 "Mapping repository to Common Product Enumeration information"。
5.4.3.1.5. 将 updaters 捆绑包导入到断开连接的 OpenShift Container Platform 集群中

使用以下步骤将更新器捆绑包导入到断开连接的 OpenShift Container Platform 集群中。

先决条件

  • 已安装 clairctl 命令行工具工具。
  • 您已检索并解码了 Clair 配置 secret,并将其保存到 Clair config.yaml 文件中。
  • 在 Clair config.yaml 文件中,disable_updatersairgap 参数被设置为 true
  • 您已从可访问互联网的 Clair 实例导出 updaters 捆绑包。
  • 您已将更新器捆绑包传送到断开连接的环境中。

流程

  • 使用 clairctl CLI 工具将 updaters 捆绑包导入到 OpenShift Container Platform 部署的 Clair 数据库中。例如:

    $ ./clairctl --config ./clair-config.yaml import-updaters updates.gz

5.4.3.2. 为断开连接的 OpenShift Container Platform 集群设置 Clair 的自我管理部署

使用以下步骤为断开连接的 OpenShift Container Platform 集群设置 Clair 的自我管理部署。

5.4.3.2.1. 为 OpenShift Container Platform 上的自我管理的 Clair 部署安装 clairctl 命令行工具

使用以下步骤在 OpenShift Container Platform 上安装 clairctl CLI 工具进行自我管理的 Clair 部署。

流程

  1. 使用 podman cp 命令为自我管理的 Clair 部署安装 clairctl 程序,例如:

    $ sudo podman cp clairv4:/usr/bin/clairctl ./clairctl
  2. 设置 clairctl 文件的权限,以便用户可以由用户执行并运行,例如:

    $ chmod u+x ./clairctl
5.4.3.2.2. 为断开连接的 OpenShift Container Platform 集群部署自我管理的 Clair 容器

使用以下步骤为断开连接的 OpenShift Container Platform 集群部署自我管理的 Clair 容器。

先决条件

  • 已安装 clairctl 命令行工具工具。

流程

  1. 为您的 Clair 配置文件创建一个文件夹,例如:

    $ mkdir /etc/clairv4/config/
  2. 创建一个 Clair 配置文件,将 disable_updaters 参数设置为 true,例如:

    ---
    indexer:
      airgap: true
    ---
    matcher:
      disable_updaters: true
    ---
  3. 使用容器镜像启动 Clair,从您创建的文件中挂载在配置中:

    $ sudo podman run -it --rm --name clairv4 \
    -p 8081:8081 -p 8088:8088 \
    -e CLAIR_CONF=/clair/config.yaml \
    -e CLAIR_MODE=combo \
    -v /etc/clairv4/config:/clair:Z \
    registry.redhat.io/quay/clair-rhel8:v3.9.0
5.4.3.2.3. 从连接的 Clair 实例导出更新程序捆绑包

使用以下步骤从可访问互联网的 Clair 实例导出 updaters 捆绑包。

先决条件

  • 已安装 clairctl 命令行工具工具。
  • 您已部署了 Clair。
  • 在 Clair config.yaml 文件中,disable_updatersairgap 参数被设置为 true

流程

  • 从可访问互联网的 Clair 实例中,使用 clairctl CLI 工具和配置文件导出更新器捆绑包。例如:

    $ ./clairctl --config ./config.yaml export-updaters updates.gz
5.4.3.2.4. 在断开连接的 OpenShift Container Platform 集群中配置对 Clair 数据库的访问

使用以下步骤在断开连接的 OpenShift Container Platform 集群中配置对 Clair 数据库的访问。

先决条件

  • 已安装 clairctl 命令行工具工具。
  • 您已部署了 Clair。
  • 在 Clair config.yaml 文件中,disable_updatersairgap 参数被设置为 true
  • 您已从可访问互联网的 Clair 实例导出 updaters 捆绑包。

流程

  1. 使用 oc CLI 工具确定 Clair 数据库服务,例如:

    $ oc get svc -n quay-enterprise

    输出示例

    NAME                                  TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                             AGE
    example-registry-clair-app            ClusterIP      172.30.224.93    <none>        80/TCP,8089/TCP                     4d21h
    example-registry-clair-postgres       ClusterIP      172.30.246.88    <none>        5432/TCP                            4d21h
    ...

  2. 转发 Clair 数据库端口,使其可从本地机器访问。例如:

    $ oc port-forward -n quay-enterprise service/example-registry-clair-postgres 5432:5432
  3. 更新 Clair config.yaml 文件,例如:

    indexer:
        connstring: host=localhost port=5432 dbname=postgres user=postgres password=postgres sslmode=disable 1
        scanlock_retry: 10
        layer_scan_concurrency: 5
        migrations: true
        scanner:
          repo:
            rhel-repository-scanner: 2
              repo2cpe_mapping_file: /data/cpe-map.json
          package:
            rhel_containerscanner: 3
              name2repos_mapping_file: /data/repo-map.json
    1
    在多 connstring 字段中使用 localhost 替换 host 的值。
    2
    有关 rhel-repository-scanner 参数的更多信息,请参阅 "Mapping repository to Common Product Enumeration"。
    3
    有关 rhel_containerscanner 参数的更多信息,请参阅 "Mapping repository to Common Product Enumeration information"。
5.4.3.2.5. 将 updaters 捆绑包导入到断开连接的 OpenShift Container Platform 集群中

使用以下步骤将更新器捆绑包导入到断开连接的 OpenShift Container Platform 集群中。

先决条件

  • 已安装 clairctl 命令行工具工具。
  • 您已部署了 Clair。
  • 在 Clair config.yaml 文件中,disable_updatersairgap 参数被设置为 true
  • 您已从可访问互联网的 Clair 实例导出 updaters 捆绑包。
  • 您已将更新器捆绑包传送到断开连接的环境中。

流程

  • 使用 clairctl CLI 工具将 updaters 捆绑包导入到 OpenShift Container Platform 部署的 Clair 数据库中:

    $ ./clairctl --config ./clair-config.yaml import-updaters updates.gz

5.4.4. 启用 Clair CRDA

Java 扫描取决于一个公共的、红帽提供的 API 服务,称为 Code Ready Dependency Analytics (CRDA)。CRDA 仅适用于互联网访问,默认情况下不启用。

使用以下步骤将 CRDA 服务与自定义 API 密钥集成,并为 Java 和 Python 扫描启用 CRDA。

先决条件

  • Red Hat Quay 3.7 或更高版本

流程

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

    matchers:
      config:
        crda:
          url: https://gw.api.openshift.io/api/v2/
          key: <CRDA_API_KEY> 1
          source: <QUAY_SERVER_HOSTNAME> 2
    1
    在此处从 API 密钥请求表单插入特定于 Quay 的 CRDA 远程匹配程序。
    2
    Quay 服务器的主机名。

5.4.5. 将存储库映射到通用产品枚举信息

Clair 的 Red Hat Enterprise Linux (RHEL)扫描程序依赖于通用产品枚举(CPE)文件,将 RPM 软件包映射到对应的安全数据,以生成匹配的结果。这些文件归产品安全所有,每天更新。

必须允许 cpe 文件或访问该文件,以便扫描程序能够正确处理 RPM 软件包。如果文件不存在,则不会扫描容器镜像中安装的 RPM 软件包。

表 5.1. Clair cp 映射文件

CPE到 JSON 映射文件的链接

repos2cpe

Red Hat Repository-to-CPE JSON

names2repos

Red Hat Name-to-Repos JSON.

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

  • 对于独立的 Red Hat Quay 和 Clair 部署,映射文件必须加载到 Clair pod 中。
  • 对于在 OpenShift Container Platform 和 Clair 部署上部署 Red Hat Quay Operator,您必须将 Clair 组件设置为 非受管。然后,必须手动部署 Clair,设置配置来加载映射文件的本地副本。

5.4.5.1. 将存储库映射到通用产品枚举示例配置

在 Clair 配置中使用 repo2cpe_mapping_filename2repos_mapping_file 字段,使其包含 cp JSON 映射文件。例如:

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

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

5.5. 在基础架构节点上部署 Red Hat Quay

默认情况下,在使用 Red Hat Quay Operator 部署 registry 时,Quay 相关的 pod 会放置在任意 worker 节点上。有关如何使用机器集将节点配置为仅托管基础架构组件的更多信息,请参阅 创建基础架构机器集

如果您不使用 OpenShift Container Platform 机器集资源来部署 infra 节点,本文档中的部分演示了如何手动标记和污点节点用于基础架构目的。在手动配置基础架构节点或使用机器集后,您可以使用节点选择器和容限来控制在这些节点上放置 Quay pod。

5.5.1. 为基础架构使用标记和污点节点

使用以下步骤为基础架构使用标记和包含节点。

  1. 输入以下命令显示 master 和 worker 节点。在本例中,有三个 master 节点和 6 个 worker 节点。

    $ oc get nodes

    输出示例

    NAME                                               STATUS   ROLES    AGE     VERSION
    user1-jcnp6-master-0.c.quay-devel.internal         Ready    master   3h30m   v1.20.0+ba45583
    user1-jcnp6-master-1.c.quay-devel.internal         Ready    master   3h30m   v1.20.0+ba45583
    user1-jcnp6-master-2.c.quay-devel.internal         Ready    master   3h30m   v1.20.0+ba45583
    user1-jcnp6-worker-b-65plj.c.quay-devel.internal   Ready    worker   3h21m   v1.20.0+ba45583
    user1-jcnp6-worker-b-jr7hc.c.quay-devel.internal   Ready    worker   3h21m   v1.20.0+ba45583
    user1-jcnp6-worker-c-jrq4v.c.quay-devel.internal   Ready    worker   3h21m   v1.20.0+ba45583
    user1-jcnp6-worker-c-pwxfp.c.quay-devel.internal   Ready    worker   3h21m   v1.20.0+ba45583
    user1-jcnp6-worker-d-h5tv2.c.quay-devel.internal   Ready    worker   3h22m   v1.20.0+ba45583
    user1-jcnp6-worker-d-m9gg4.c.quay-devel.internal   Ready    worker   3h21m   v1.20.0+ba45583

  2. 输入以下命令为基础架构使用标记三个 worker 节点:

    $ oc label node --overwrite user1-jcnp6-worker-c-pwxfp.c.quay-devel.internal node-role.kubernetes.io/infra=
    $ oc label node --overwrite user1-jcnp6-worker-d-h5tv2.c.quay-devel.internal node-role.kubernetes.io/infra=
    $ oc label node --overwrite user1-jcnp6-worker-d-m9gg4.c.quay-devel.internal node-role.kubernetes.io/infra=
  3. 现在,当列出集群中的节点时,最后三个 worker 节点具有 infra 角色。例如:

    $ oc get nodes

    示例

    NAME                                               STATUS   ROLES          AGE     VERSION
    user1-jcnp6-master-0.c.quay-devel.internal         Ready    master         4h14m   v1.20.0+ba45583
    user1-jcnp6-master-1.c.quay-devel.internal         Ready    master         4h15m   v1.20.0+ba45583
    user1-jcnp6-master-2.c.quay-devel.internal         Ready    master         4h14m   v1.20.0+ba45583
    user1-jcnp6-worker-b-65plj.c.quay-devel.internal   Ready    worker         4h6m    v1.20.0+ba45583
    user1-jcnp6-worker-b-jr7hc.c.quay-devel.internal   Ready    worker         4h5m    v1.20.0+ba45583
    user1-jcnp6-worker-c-jrq4v.c.quay-devel.internal   Ready    worker         4h5m    v1.20.0+ba45583
    user1-jcnp6-worker-c-pwxfp.c.quay-devel.internal   Ready    infra,worker   4h6m    v1.20.0+ba45583
    user1-jcnp6-worker-d-h5tv2.c.quay-devel.internal   Ready    infra,worker   4h6m    v1.20.0+ba45583
    user1-jcnp6-worker-d-m9gg4.c.quay-devel.internal   Ready    infra,worker   4h6m    v1.20.0+ba4558

  4. 当为 worker 节点分配 infra 角色时,用户工作负载可能会意外地分配给 infra 节点。要避免这种情况,您可以将污点应用到 infra 节点,然后为您要控制的 pod 添加容限。例如:

    $ oc adm taint nodes user1-jcnp6-worker-c-pwxfp.c.quay-devel.internal node-role.kubernetes.io/infra:NoSchedule
    $ oc adm taint nodes user1-jcnp6-worker-d-h5tv2.c.quay-devel.internal node-role.kubernetes.io/infra:NoSchedule
    $ oc adm taint nodes user1-jcnp6-worker-d-m9gg4.c.quay-devel.internal node-role.kubernetes.io/infra:NoSchedule

5.5.2. 使用节点选择器和容限创建项目

使用以下步骤创建带有节点选择器和容限的项目。

注意

如果您已经使用 Operator 部署 Red Hat Quay,请删除已安装的 Operator 以及您为部署创建的任何特定命名空间。

步骤

  1. 创建项目资源,指定节点选择器和容限。例如:

    quay-registry.yaml

    kind: Project
    apiVersion: project.openshift.io/v1
    metadata:
      name: quay-registry
      annotations:
        openshift.io/node-selector: 'node-role.kubernetes.io/infra='
        scheduler.alpha.kubernetes.io/defaultTolerations: >-
          [{"operator": "Exists", "effect": "NoSchedule", "key":
          "node-role.kubernetes.io/infra"}]

  2. 运行以下命令来创建项目:

    $ oc apply -f quay-registry.yaml

    输出示例

    project.project.openshift.io/quay-registry created

quay-registry 命名空间中创建的后续资源现在应调度到专用基础架构节点上。

5.5.3. 在命名空间中安装 Red Hat Quay Operator

使用以下步骤在命名空间中安装 Red Hat Quay Operator。

  • 要在特定命名空间中安装 Red Hat Quay Operator,您必须明确指定适当的项目命名空间,如以下命令所示。在本例中,我们使用 quay-registry。ths 会导致 Operator pod 登录三个基础架构节点之一。例如:

    $ oc get pods -n quay-registry -o wide

    输出示例

    NAME                                    READY   STATUS    RESTARTS   AGE   IP            NODE                                              
    quay-operator.v3.4.1-6f6597d8d8-bd4dp   1/1     Running   0          30s   10.131.0.16   user1-jcnp6-worker-d-h5tv2.c.quay-devel.internal

5.5.4. 创建 Red Hat Quay registry

使用以下步骤创建 Red Hat Quay registry。

  • 运行以下命令来创建 Red Hat Quay registry。然后,等待部署标记为 就绪。在以下示例中,您应看到它们仅调度到为基础架构目的标记的三个节点上。

    $ oc get pods -n quay-registry -o wide

    输出示例

    NAME                                                   READY   STATUS      RESTARTS   AGE     IP            NODE                                                
    example-registry-clair-app-789d6d984d-gpbwd            1/1     Running     1          5m57s   10.130.2.80   user1-jcnp6-worker-d-m9gg4.c.quay-devel.internal
    example-registry-clair-postgres-7c8697f5-zkzht         1/1     Running     0          4m53s   10.129.2.19   user1-jcnp6-worker-c-pwxfp.c.quay-devel.internal
    example-registry-quay-app-56dd755b6d-glbf7             1/1     Running     1          5m57s   10.129.2.17   user1-jcnp6-worker-c-pwxfp.c.quay-devel.internal
    example-registry-quay-config-editor-7bf9bccc7b-dpc6d   1/1     Running     0          5m57s   10.131.0.23   user1-jcnp6-worker-d-h5tv2.c.quay-devel.internal
    example-registry-quay-database-8dc7cfd69-dr2cc         1/1     Running     0          5m43s   10.129.2.18   user1-jcnp6-worker-c-pwxfp.c.quay-devel.internal
    example-registry-quay-mirror-78df886bcc-v75p9          1/1     Running     0          5m16s   10.131.0.24   user1-jcnp6-worker-d-h5tv2.c.quay-devel.internal
    example-registry-quay-postgres-init-8s8g9              0/1     Completed   0          5m54s   10.130.2.79   user1-jcnp6-worker-d-m9gg4.c.quay-devel.internal
    example-registry-quay-redis-5688ddcdb6-ndp4t           1/1     Running     0          5m56s   10.130.2.78   user1-jcnp6-worker-d-m9gg4.c.quay-devel.internal
    quay-operator.v3.4.1-6f6597d8d8-bd4dp                  1/1     Running     0          22m     10.131.0.16   user1-jcnp6-worker-d-h5tv2.c.quay-devel.internal

5.6. 在单一命名空间中安装 Red Hat Quay Operator 时启用监控

当在一个命名空间中安装 Red Hat Quay Operator 时,监控组件被设置为 unmanaged。要配置监控,您必须为 OpenShift Container Platform 中的用户定义的命名空间启用它。

如需更多信息,请参阅有关 配置监控堆栈为用户定义的项目启用监控 的 OpenShift Container Platform 文档。

以下小节介绍了如何根据 OpenShift Container Platform 文档为 Red Hat Quay 启用监控。

5.6.1. 创建集群监控配置映射

使用以下步骤检查 cluster-monitoring-config ConfigMap 对象是否存在。

步骤

  1. 输入以下命令检查 cluster-monitoring-config ConfigMap 对象是否存在:

    $ oc -n openshift-monitoring get configmap cluster-monitoring-config

    输出示例

    Error from server (NotFound): configmaps "cluster-monitoring-config" not found

  2. 可选:如果 ConfigMap 对象不存在,请创建一个 YAML 清单。在以下示例中,该文件名为 cluster-monitoring-config.yaml

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cluster-monitoring-config
      namespace: openshift-monitoring
    data:
      config.yaml: |
  3. 可选:如果 ConfigMap 对象不存在,请创建 ConfigMap 对象:

    $ oc apply -f cluster-monitoring-config.yaml configmap/cluster-monitoring-config created
  4. 运行以下命令,确保 ConfigMap 对象存在:

    $ oc -n openshift-monitoring get configmap cluster-monitoring-config

    输出示例

    NAME                        DATA   AGE
    cluster-monitoring-config   1      12s

5.6.2. 创建用户定义的工作负载监控 ConfigMap 对象

使用以下步骤检查 user-workload-monitoring-config ConfigMap 对象是否存在。

步骤

  1. 输入以下命令检查 user-workload-monitoring-config ConfigMap 对象是否存在:

    $ oc -n openshift-user-workload-monitoring get configmap user-workload-monitoring-config

    输出示例

    Error from server (NotFound): configmaps "user-workload-monitoring-config" not found

  2. 如果 ConfigMap 对象不存在,请创建一个 YAML 清单。在以下示例中,该文件名为 user-workload-monitoring-config.yaml

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: user-workload-monitoring-config
      namespace: openshift-user-workload-monitoring
    data:
      config.yaml: |
  3. 可选:输入以下命令来创建 ConfigMap 对象:

    $ oc apply -f user-workload-monitoring-config.yaml

    输出示例

    configmap/user-workload-monitoring-config created

5.6.3. 为用户定义的项目启用监控

使用以下步骤为用户定义的项目启用监控。

步骤

  1. 输入以下命令检查监控用户定义的项目是否正在运行:

    $ oc get pods -n openshift-user-workload-monitoring

    输出示例

    No resources found in openshift-user-workload-monitoring namespace.

  2. 输入以下命令编辑 cluster-monitoring-config ConfigMap

    $ oc -n openshift-monitoring edit configmap cluster-monitoring-config
  3. config.yaml 文件中设置 enableUserWorkload: true,以便在集群中为用户定义的项目启用监控:

    apiVersion: v1
    data:
      config.yaml: |
        enableUserWorkload: true
    kind: ConfigMap
    metadata:
      annotations:
  4. 输入以下命令保存文件,应用更改并确保适当的 pod 正在运行:

    $ oc get pods -n openshift-user-workload-monitoring

    输出示例

    NAME                                   READY   STATUS    RESTARTS   AGE
    prometheus-operator-6f96b4b8f8-gq6rl   2/2     Running   0          15s
    prometheus-user-workload-0             5/5     Running   1          12s
    prometheus-user-workload-1             5/5     Running   1          12s
    thanos-ruler-user-workload-0           3/3     Running   0          8s
    thanos-ruler-user-workload-1           3/3     Running   0          8s

5.6.4. 创建 Service 对象以公开 Red Hat Quay 指标

使用以下步骤创建 Service 对象来公开 Red Hat Quay 指标。

步骤

  1. 为 Service 对象创建 YAML 文件:

    $ cat <<EOF >  quay-service.yaml
    
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
      labels:
        quay-component: monitoring
        quay-operator/quayregistry: example-registry
      name: example-registry-quay-metrics
      namespace: quay-enterprise
    spec:
      ports:
      - name: quay-metrics
        port: 9091
        protocol: TCP
        targetPort: 9091
      selector:
        quay-component: quay-app
        quay-operator/quayregistry: example-registry
      type: ClusterIP
    EOF
  2. 运行以下命令来创建 Service 对象:

    $  oc apply -f quay-service.yaml

    输出示例

    service/example-registry-quay-metrics created

5.6.5. 创建 ServiceMonitor 对象

使用以下步骤配置 OpenShift Monitoring,以通过创建 ServiceMonitor 资源来提取指标。

步骤

  1. ServiceMonitor 资源创建 YAML 文件:

    $ cat <<EOF >  quay-service-monitor.yaml
    
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      labels:
        quay-operator/quayregistry: example-registry
      name: example-registry-quay-metrics-monitor
      namespace: quay-enterprise
    spec:
      endpoints:
      - port: quay-metrics
      namespaceSelector:
        any: true
      selector:
        matchLabels:
          quay-component: monitoring
    EOF
  2. 运行以下命令来创建 ServiceMonitor 资源:

    $ oc apply -f quay-service-monitor.yaml

    输出示例

    servicemonitor.monitoring.coreos.com/example-registry-quay-metrics-monitor created

5.6.6. 查看 OpenShift Container Platform 中的指标

您可以在 MonitoringMetrics 下的 OpenShift Container Platform 控制台中访问指标。在 Expression 字段中,输入 quay_ 以查看可用指标列表:

Quay metrics

例如,如果您将用户添加到 registry 中,请选择 quay-users_rows 指标:

Quay metrics

5.7. 调整受管存储的大小

Red Hat Quay Operator 在创建 NooBaa 对象(50 Gib)时使用 Red Hat OpenShift Data Foundation 提供的默认值创建默认对象存储。

扩展 NooBaa 对象存储的方法有两种:

  1. 您可以调整现有持久性卷声明(PVC)的大小。
  2. 您可以在新存储池中添加更多 PVC。

5.7.1. 重新定义 NooBaa PVC 的大小

使用以下步骤重新定义 NooBaa PVC 的大小。

步骤

  1. 登录到 OpenShift Container Platform 控制台并选择 StoragePersistent Volume Claims
  2. 选择名为 noobaa-default-backing-store-noobaa-pvc bang 的 PersistentVolumeClaim
  3. Action 菜单中,选择 Expand PVC
  4. 输入持久性卷声明的新大小,然后选择 Expand

几分钟后(取决于 PVC 的大小),扩展的大小应反映在 PVC 的 Capacity 字段中。

5.8. 自定义默认 Operator 镜像

在某些情况下,覆盖 Red Hat Quay Operator 使用的默认镜像可能会很有用。这可以通过在 Red Hat Quay Operator ClusterServiceVersion 中设置一个或多个环境变量来完成。

重要

在 Red Hat Quay 环境中不支持使用此机制,强烈建议仅用于开发或测试目的。在 Red Hat Quay Operator 中使用非默认镜像时,您的部署无法正常工作。

5.8.1. 环境变量

Red Hat Quay Operator 中使用以下环境变量来覆盖组件镜像:

环境变量

组件

RELATED_IMAGE_COMPONENT_QUAY

base

RELATED_IMAGE_COMPONENT_CLAIR

clair

RELATED_IMAGE_COMPONENT_POSTGRES

postgresclair 数据库

RELATED_IMAGE_COMPONENT_REDIS

redis

注意

覆盖的镜像 必须被 清单(@sha256:)引用,而不是通过 tag (:latest)引用。

5.8.2. 将覆盖应用到正在运行的 Operator

当通过 Operator Lifecycle Manager (OLM) 安装 Red Hat Quay Operator 时,可以通过修改 ClusterServiceVersion 对象来轻松覆盖受管组件容器镜像。

使用以下步骤将覆盖应用到正在运行的 Red Hat Quay Operator。

步骤

  1. ClusterServiceVersion 对象是集群中正在运行的 Operator 的 Operator 的表示。使用 Kubernetes UI 或 kubectl/oc CLI 工具查找 Red Hat Quay Operator 的 ClusterServiceVersion。例如:

    $ oc get clusterserviceversions -n <your-namespace>
  2. 使用 UI、oc edit 或其他方法,修改 Red Hat Quay ClusterServiceVersion,使其包含上面概述的环境变量以指向覆盖镜像:

    json Path :spec.install.spec.deployments[0].spec.template.spec.containers[0].env

    - name: RELATED_IMAGE_COMPONENT_QUAY
      value: quay.io/projectquay/quay@sha256:c35f5af964431673f4ff5c9e90bdf45f19e38b8742b5903d41c10cc7f6339a6d
    - name: RELATED_IMAGE_COMPONENT_CLAIR
      value: quay.io/projectquay/clair@sha256:70c99feceb4c0973540d22e740659cd8d616775d3ad1c1698ddf71d0221f3ce6
    - name: RELATED_IMAGE_COMPONENT_POSTGRES
      value: centos/postgresql-10-centos7@sha256:de1560cb35e5ec643e7b3a772ebaac8e3a7a2a8e8271d9e91ff023539b4dfb33
    - name: RELATED_IMAGE_COMPONENT_REDIS
      value: centos/redis-32-centos7@sha256:06dbb609484330ec6be6090109f1fa16e936afcf975d1cbc5fff3e6c7cae7542
注意

这在 Operator 级别上完成,因此每个 QuayRegistry 都将使用相同的覆盖进行部署。

5.9. AWS S3 CloudFront

如果您使用 AWS S3 Cloudfront 进行后端 registry 存储,请使用以下步骤。

步骤

  1. 输入以下命令指定 registry 密钥:

    $ oc create secret generic --from-file config.yaml=./config_awss3cloudfront.yaml --from-file default-cloudfront-signing-key.pem=./default-cloudfront-signing-key.pem test-config-bundle

第 6 章 Red Hat Quay 构建增强

Red Hat Quay 构建可以在虚拟平台上运行。也可以使用向后兼容来运行以前的构建配置。

6.1. Red Hat Quay 构建限制

在非特权上下文中在 Red Hat Quay 中运行构建可能会导致一些在以前的构建策略下工作的命令失败。尝试更改构建策略可能会导致构建出现性能问题和可靠性。

直接在容器中运行构建与使用虚拟机的隔离没有相同的隔离。更改构建环境也可能会导致之前工作的构建失败。

6.2. 使用 OpenShift Container Platform 创建 Red Hat Quay 构建器环境

本节中的步骤解释了如何使用 OpenShift Container Platform 创建 Red Hat Quay 虚拟构建器环境。

6.2.1. OpenShift Container Platform TLS 组件

tls 组件允许您控制 TLS 配置。

注意

当 TLS 组件由 Operator 管理时,Red Hat Quay 3.9 不支持构建器。

如果将 tls 设置为 unmanaged,则提供自己的 ssl.certssl.key 文件。在本实例中,如果希望集群支持构建器,您必须将 Quay 路由和构建器路由名称添加到证书中的 SAN 列表中,或使用通配符。

要添加构建器路由,请使用以下格式:

[quayregistry-cr-name]-quay-builder-[ocp-namespace].[ocp-domain-name]:443

6.2.2. 将 OpenShift Container Platform 用于 Red Hat Quay 构建器

构建器需要 SSL/TLS 证书。有关 SSL/TLS 证书的更多信息,请参阅 向 Red Hat Quay 容器添加 TLS 证书

如果使用 Amazon Web Service (AWS) S3 存储,您必须在运行构建器前修改 AWS 控制台中的存储桶。如需所需参数,请参阅以下部分的"修改 AWS S3 存储桶"。

6.2.2.1. 为虚拟构建器准备 OpenShift Container Platform

使用以下步骤为 Red Hat Quay 虚拟构建器准备 OpenShift Container Platform。

注意
  • 此流程假设您已置备集群并运行 Quay Operator。
  • 此流程是在 OpenShift Container Platform 上设置虚拟命名空间。

流程

  1. 使用集群管理员帐户登录到您的 Red Hat Quay 集群。
  2. 运行以下命令,创建一个新项目,其中将运行您的虚拟构建器(如 virtual-builders ):

    $ oc new-project virtual-builders
  3. 输入以下命令,在将用于运行构建的项目中创建一个 ServiceAccount

    $ oc create sa -n virtual-builders quay-builder
  4. 为创建的服务帐户提供编辑权限,以便它可以运行构建:

    $ oc adm policy -n virtual-builders add-role-to-user edit system:serviceaccount:virtual-builders:quay-builder
  5. 输入以下命令授予 Quay builder anyuid scc 权限:

    $ oc adm policy -n virtual-builders add-scc-to-user anyuid -z quay-builder
    注意

    此操作需要集群管理员特权。这是必要的,因为构建器必须以 Podman 用户身份运行,才能使非特权或无根构建正常工作。

  6. 获取 Quay builder 服务帐户的令牌。

    1. 如果使用 OpenShift Container Platform 4.10 或更早的版本,请输入以下命令:

      oc sa get-token -n virtual-builders quay-builder
    2. 如果使用 OpenShift Container Platform 4.11 或更高版本,请输入以下命令:

      $ oc create token quay-builder -n virtual-builders

      输出示例

      eyJhbGciOiJSUzI1NiIsImtpZCI6IldfQUJkaDVmb3ltTHZ0dGZMYjhIWnYxZTQzN2dJVEJxcDJscldSdEUtYWsifQ...

  7. 输入以下命令确定构建器路由:

    $ oc get route -n quay-enterprise

    输出示例

    NAME                                  HOST/PORT                                                                    PATH   SERVICES                              PORT   TERMINATION     WILDCARD
    ...
    example-registry-quay-builder         example-registry-quay-builder-quay-enterprise.apps.docs.quayteam.org                example-registry-quay-app             grpc   edge/Redirect   None
    ...

  8. 输入以下命令使用 .crt 扩展生成自签名 SSL/TlS 证书:

    $ oc extract cm/kube-root-ca.crt -n openshift-apiserver

    输出示例

    ca.crt

  9. 输入以下命令将 ca.crt 文件重命名为 extra_ca_cert_build_cluster.crt

    $ mv ca.crt extra_ca_cert_build_cluster.crt
  10. 控制台中找到配置捆绑包的 secret,然后选择 ActionsEdit Secret 并添加适当的构建程序配置:

    FEATURE_USER_INITIALIZE: true
    BROWSER_API_CALLS_XHR_ONLY: false
    SUPER_USERS:
    - <superusername>
    FEATURE_USER_CREATION: false
    FEATURE_QUOTA_MANAGEMENT: true
    FEATURE_BUILD_SUPPORT: True
    BUILDMAN_HOSTNAME: <sample_build_route> 1
    BUILD_MANAGER:
      - ephemeral
      - ALLOWED_WORKER_COUNT: 1
        ORCHESTRATOR_PREFIX: buildman/production/
        JOB_REGISTRATION_TIMEOUT: 3600 2
        ORCHESTRATOR:
          REDIS_HOST: <sample_redis_hostname> 3
          REDIS_PASSWORD: ""
          REDIS_SSL: false
          REDIS_SKIP_KEYSPACE_EVENT_SETUP: false
        EXECUTORS:
          - EXECUTOR: kubernetesPodman
            NAME: openshift
            BUILDER_NAMESPACE: <sample_builder_namespace> 4
            SETUP_TIME: 180
            MINIMUM_RETRY_THRESHOLD: 0
            BUILDER_CONTAINER_IMAGE: <sample_builder_container_image> 5
            # Kubernetes resource options
            K8S_API_SERVER: <sample_k8s_api_server> 6
            K8S_API_TLS_CA: <sample_crt_file> 7
            VOLUME_SIZE: 8G
            KUBERNETES_DISTRIBUTION: openshift
            CONTAINER_MEMORY_LIMITS: 300m 8
            CONTAINER_CPU_LIMITS: 1G 9
            CONTAINER_MEMORY_REQUEST: 300m 10
            CONTAINER_CPU_REQUEST: 1G 11
            NODE_SELECTOR_LABEL_KEY: ""
            NODE_SELECTOR_LABEL_VALUE: ""
            SERVICE_ACCOUNT_NAME: <sample_service_account_name>
            SERVICE_ACCOUNT_TOKEN: <sample_account_token> 12
    1
    构建路由是通过使用 OpenShift Operator 命名空间的名称运行 oc get route -n 获取的。在路由末尾必须提供一个端口,它应使用以下格式:[ quayregistry-cr-name]-quay-builder-[ocp-namespace].[ocp-domain-name]:443
    2
    如果 设置了 job _REGISTRATION_TIMEOUT 参数过低,您可能会收到以下错误: failed to register job to build manager: rpc error: code = Unauthenticated desc = Invalid build token: Signature has expired。建议将此参数设置为至少 240。
    3
    如果您的 Redis 主机有密码或 SSL/TLS 证书,您必须相应地更新。
    4
    设置为与虚拟构建器命名空间的名称匹配,如 virtual-builders
    5
    对于早期访问,BUILDER_CONTAINER_IMAGE 目前为 quay.io/projectquay/quay-builder:3.7.0-rc.2。请注意,这可能会在早期访问窗口内有所变化。如果发生这种情况,则会提醒客户。
    6
    K8S_API_SERVER 通过运行 oc cluster-info 获取。
    7
    您必须手动创建并添加自定义 CA 证书,如 K8S_API_TLS_CA: /conf/stack/extra_ca_certs/build_cluster.crt
    8
    如果未指定,则默认为 5120Mi
    9
    对于虚拟构建,您必须确保集群中有足够的资源。如果未指定,则默认为 1000m
    10
    如果未指定,则默认为 3968Mi
    11
    如果未指定,则默认为 500m
    12
    运行 oc create sa 时获取。

    配置示例

    FEATURE_USER_INITIALIZE: true
    BROWSER_API_CALLS_XHR_ONLY: false
    SUPER_USERS:
    - quayadmin
    FEATURE_USER_CREATION: false
    FEATURE_QUOTA_MANAGEMENT: true
    FEATURE_BUILD_SUPPORT: True
    BUILDMAN_HOSTNAME: example-registry-quay-builder-quay-enterprise.apps.docs.quayteam.org:443
    BUILD_MANAGER:
      - ephemeral
      - ALLOWED_WORKER_COUNT: 1
        ORCHESTRATOR_PREFIX: buildman/production/
        JOB_REGISTRATION_TIMEOUT: 3600
        ORCHESTRATOR:
          REDIS_HOST: example-registry-quay-redis
          REDIS_PASSWORD: ""
          REDIS_SSL: false
          REDIS_SKIP_KEYSPACE_EVENT_SETUP: false
        EXECUTORS:
          - EXECUTOR: kubernetesPodman
            NAME: openshift
            BUILDER_NAMESPACE: virtual-builders
            SETUP_TIME: 180
            MINIMUM_RETRY_THRESHOLD: 0
            BUILDER_CONTAINER_IMAGE: quay.io/projectquay/quay-builder:3.7.0-rc.2
            # Kubernetes resource options
            K8S_API_SERVER: api.docs.quayteam.org:6443
            K8S_API_TLS_CA: /conf/stack/extra_ca_certs/build_cluster.crt
            VOLUME_SIZE: 8G
            KUBERNETES_DISTRIBUTION: openshift
            CONTAINER_MEMORY_LIMITS: 1G
            CONTAINER_CPU_LIMITS: 1080m
            CONTAINER_MEMORY_REQUEST: 1G
            CONTAINER_CPU_REQUEST: 580m
            NODE_SELECTOR_LABEL_KEY: ""
            NODE_SELECTOR_LABEL_VALUE: ""
            SERVICE_ACCOUNT_NAME: quay-builder
            SERVICE_ACCOUNT_TOKEN: "eyJhbGciOiJSUzI1NiIsImtpZCI6IldfQUJkaDVmb3ltTHZ0dGZMYjhIWnYxZTQzN2dJVEJxcDJscldSdEUtYWsifQ"

6.2.2.2. 手动添加 SSL/TLS 证书

由于配置工具的已知问题,您必须手动添加自定义 SSL/TLS 证书来正确运行构建器。使用以下步骤手动添加自定义 SSL/TLS 证书。

有关创建 SSL/TLS 证书的更多信息,请参阅在 Red Hat Quay 容器中添加 TLS 证书

6.2.2.2.1. 创建和签名的证书

使用以下步骤创建和签署 SSL/TLS 证书。

流程

  • 创建证书颁发机构并签署证书。如需更多信息,请参阅创建证书颁发机构和签署证书

    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 = example-registry-quay-quay-enterprise.apps.docs.quayteam.org 1
    DNS.2 = example-registry-quay-builder-quay-enterprise.apps.docs.quayteam.org 2

    1
    必须包含 Red Hat Quay registry 的 URL 的 alt_name
    2
    BUILDMAN_HOSTNAMEalt_name

    示例命令

    $ openssl genrsa -out rootCA.key 2048
    $ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem
    $ openssl genrsa -out ssl.key 2048
    $ openssl req -new -key ssl.key -out ssl.csr
    $ openssl x509 -req -in ssl.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out ssl.cert -days 356 -extensions v3_req -extfile openssl.cnf

6.2.2.2.2. 将 TLS 设置为非受管

使用以下步骤将 king:tls 设置为 unmanaged。

流程

  1. 在 Red Hat Quay Registry YAML 中,将 kind: tls 设置为 managed: false

      - kind: tls
        managed: false
  2. Events 页面中,更改会被阻断,直到您设置适当的 config.yaml 文件。例如:

        - lastTransitionTime: '2022-03-28T12:56:49Z'
          lastUpdateTime: '2022-03-28T12:56:49Z'
          message: >-
            required component `tls` marked as unmanaged, but `configBundleSecret`
            is missing necessary fields
          reason: ConfigInvalid
          status: 'True'
6.2.2.2.3. 创建临时 secret

使用以下步骤为 CA 证书创建临时 secret。

流程

  1. 在默认命名空间中为 CA 证书创建一个 secret:

    $ oc create secret generic -n quay-enterprise temp-crt --from-file extra_ca_cert_build_cluster.crt
  2. 在 default 命名空间中为 ssl.keyssl.cert 文件创建一个 secret:

    $ oc create secret generic -n quay-enterprise quay-config-ssl --from-file ssl.cert --from-file ssl.key
6.2.2.2.4. 将 secret 数据复制到配置 YAML 中

使用以下步骤将 secret 数据复制到 config.yaml 文件中。

流程

  1. 在控制台 UI 中找到位于 WorkloadsSecrets 的新 secret。
  2. 对于每个 secret,找到 YAML 视图:

    kind: Secret
    apiVersion: v1
    metadata:
      name: temp-crt
      namespace: quay-enterprise
      uid: a4818adb-8e21-443a-a8db-f334ace9f6d0
      resourceVersion: '9087855'
      creationTimestamp: '2022-03-28T13:05:30Z'
    ...
    data:
      extra_ca_cert_build_cluster.crt: >-
        LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNakNDQWhxZ0F3SUJBZ0l....
    type: Opaque
    kind: Secret
    apiVersion: v1
    metadata:
      name: quay-config-ssl
      namespace: quay-enterprise
      uid: 4f5ae352-17d8-4e2d-89a2-143a3280783c
      resourceVersion: '9090567'
      creationTimestamp: '2022-03-28T13:10:34Z'
    ...
    data:
      ssl.cert: >-
        LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVaakNDQTA2Z0F3SUJBZ0lVT...
      ssl.key: >-
        LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBc...
    type: Opaque
  3. 在 UI 中找到 Red Hat Quay registry 配置捆绑包的 secret,或运行以下命令从命令行:

    $ oc get quayregistries.quay.redhat.com -o jsonpath="{.items[0].spec.configBundleSecret}{'\n'}"  -n quay-enterprise
  4. 在 OpenShift Container Platform 控制台中,选择配置捆绑包 secret 的 YAML 选项卡,并从您创建的两个 secret 中添加数据:

    kind: Secret
    apiVersion: v1
    metadata:
      name: init-config-bundle-secret
      namespace: quay-enterprise
      uid: 4724aca5-bff0-406a-9162-ccb1972a27c1
      resourceVersion: '4383160'
      creationTimestamp: '2022-03-22T12:35:59Z'
    ...
    data:
      config.yaml: >-
        RkVBVFVSRV9VU0VSX0lOSVRJQUxJWkU6IHRydWUKQlJ...
      extra_ca_cert_build_cluster.crt: >-
        LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNakNDQWhxZ0F3SUJBZ0ldw....
      ssl.cert: >-
        LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVaakNDQTA2Z0F3SUJBZ0lVT...
      ssl.key: >-
        LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBc...
    type: Opaque
  5. 点击 Save
  6. 输入以下命令查看 pod 是否重启:

    $ oc get pods -n quay-enterprise

    输出示例

    NAME                                                   READY   STATUS              RESTARTS   AGE
    ...
    example-registry-quay-app-6786987b99-vgg2v             0/1     ContainerCreating   0          2s
    example-registry-quay-app-7975d4889f-q7tvl             1/1     Running             0          5d21h
    example-registry-quay-app-7975d4889f-zn8bb             1/1     Running             0          5d21h
    example-registry-quay-app-upgrade-lswsn                0/1     Completed           0          6d1h
    example-registry-quay-config-editor-77847fc4f5-nsbbv   0/1     ContainerCreating   0          2s
    example-registry-quay-config-editor-c6c4d9ccd-2mwg2    1/1     Running             0          5d21h
    example-registry-quay-database-66969cd859-n2ssm        1/1     Running             0          6d1h
    example-registry-quay-mirror-764d7b68d9-jmlkk          1/1     Terminating         0          5d21h
    example-registry-quay-mirror-764d7b68d9-jqzwg          1/1     Terminating         0          5d21h
    example-registry-quay-redis-7cc5f6c977-956g8           1/1     Running             0          5d21h

  7. 重新配置 Red Hat Quay registry 后,输入以下命令检查 Red Hat Quay app pod 是否在运行:

    $ oc get pods -n quay-enterprise

    输出示例

    example-registry-quay-app-6786987b99-sz6kb             1/1     Running            0          7m45s
    example-registry-quay-app-6786987b99-vgg2v             1/1     Running            0          9m1s
    example-registry-quay-app-upgrade-lswsn                0/1     Completed          0          6d1h
    example-registry-quay-config-editor-77847fc4f5-nsbbv   1/1     Running            0          9m1s
    example-registry-quay-database-66969cd859-n2ssm        1/1     Running            0          6d1h
    example-registry-quay-mirror-758fc68ff7-5wxlp          1/1     Running            0          8m29s
    example-registry-quay-mirror-758fc68ff7-lbl82          1/1     Running            0          8m29s
    example-registry-quay-redis-7cc5f6c977-956g8           1/1     Running            0          5d21h

  8. 在浏览器中,访问 registry 端点并验证证书是否已正确更新。例如:

    Common Name (CN)	example-registry-quay-quay-enterprise.apps.docs.quayteam.org
    Organisation (O)	DOCS
    Organisational Unit (OU)	QUAY

6.2.2.3. 使用 UI 创建构建触发器

使用以下步骤使用 UI 创建构建触发器。

流程

  1. 登录您的 Red Hat Quay 存储库。
  2. 单击 Create New Repository 并创建新 registry,如 testrepo
  3. Repositories 页面中,点导航窗格中的 Builds 选项卡。或者,直接使用对应的 URL:

    https://example-registry-quay-quay-enterprise.apps.docs.quayteam.org/repository/quayadmin/testrepo?tab=builds
    重要

    在某些情况下,构建器可能会遇到解析主机名的问题。此问题可能与作业对象上的 dnsPolicy 设置为 default 相关。目前,这个问题还没有临时解决方案。它将在以后的 Red Hat Quay 版本中解决。

  4. Create Build TriggerCustom Git Repository Push
  5. 输入用于克隆 Git 存储库的 HTTPS 或 SSH 风格 URL,然后单击 Continue。例如:

    https://github.com/gabriel-rh/actions_test.git
  6. 使用分支或标签名称检查 Tag 清单,然后单击 Continue
  7. 在调用触发器时输入要构建的 Dockerfile 位置,例如 /Dockerfile 并点 Continue
  8. 输入 Docker 构建的上下文位置,如 /,然后单击 Continue
  9. 如果保证,请创建一个受限帐户。否则,点 Continue
  10. Continue 验证参数。
  11. Builds 页面中,点 Trigger Name 的 Options 图标,然后点 Run Trigger Now
  12. 从 Git 存储库输入提交 SHA,然后单击 Start Build
  13. 您可以通过单击 Build History 页面中的提交或运行 oc get pods -n virtual-builders 来检查构建的状态。例如:

    $ oc get pods -n virtual-builders

    输出示例

    NAME                                               READY   STATUS    RESTARTS   AGE
    f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2   1/1     Running   0          7s

    $ oc get pods -n virtual-builders

    输出示例

    NAME                                               READY   STATUS        RESTARTS   AGE
    f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2   1/1     Terminating   0          9s

    $ oc get pods -n virtual-builders

    输出示例

    No resources found in virtual-builders namespace.

  14. 构建完成后,您可以在导航窗格中的 Tags 下检查标签的状态。

    注意

    使用早期访问权限时,构建的完整构建日志和时间戳当前不可用。

6.2.2.4. 修改 AWS S3 存储桶

如果使用 AWS S3 存储,则必须在运行构建器前在 AWS 控制台中更改存储桶。

流程

  1. 登录到位于 s3.console.aws.com 的 AWS 控制台。
  2. 在搜索栏中,搜索 S3,然后单击 S3
  3. 点存储桶的名称,如 myawsbucket
  4. 单击权限选项卡。
  5. 在跨原始资源共享(CORS) 下,包括以下参数:

      [
          {
              "AllowedHeaders": [
                  "Authorization"
              ],
              "AllowedMethods": [
                  "GET"
              ],
              "AllowedOrigins": [
                  "*"
              ],
              "ExposeHeaders": [],
              "MaxAgeSeconds": 3000
          },
          {
              "AllowedHeaders": [
                  "Content-Type",
                  "x-amz-acl",
                  "origin"
              ],
              "AllowedMethods": [
                  "PUT"
              ],
              "AllowedOrigins": [
                  "*"
              ],
              "ExposeHeaders": [],
              "MaxAgeSeconds": 3000
          }
      ]

6.2.2.5. 修改 Google Cloud Platform 对象存储桶

使用以下步骤为虚拟构建器配置跨原始资源共享(CORS)。

注意

如果没有 CORS 配置,上传构建 Dockerfile 会失败。

步骤

  1. 使用以下引用来创建 JSON 文件,以满足您的特定 CORS 需求。例如:

    $ cat gcp_cors.json

    输出示例

    [
        {
          "origin": ["*"],
          "method": ["GET"],
          "responseHeader": ["Authorization"],
          "maxAgeSeconds": 3600
        },
        {
          "origin": ["*"],
          "method": ["PUT"],
          "responseHeader": [
                  "Content-Type",
                  "x-goog-acl",
                  "origin"],
          "maxAgeSeconds": 3600
        }
    ]

  2. 输入以下命令更新 GCP 存储桶:

    $ gcloud storage buckets update gs://<bucket_name> --cors-file=./gcp_cors.json

    输出示例

    Updating
      Completed 1

  3. 您可以运行以下命令来显示 GCP 存储桶的更新 CORS 配置:

    $ gcloud storage buckets describe gs://<bucket_name>  --format="default(cors)"

    输出示例

    cors:
    - maxAgeSeconds: 3600
      method:
      - GET
      origin:
      - '*'
      responseHeader:
      - Authorization
    - maxAgeSeconds: 3600
      method:
      - PUT
      origin:
      - '*'
      responseHeader:
      - Content-Type
      - x-goog-acl
      - origin

第 7 章 geo-replication

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

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

7.1. 地理复制功能

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

7.2. 地区复制要求和限制

  • 在地理复制设置中,Red Hat Quay 要求所有区域都可以读取和写入所有其他区域对象存储。对象存储必须可以被所有其他区域访问。
  • 如果一个地理复制站点的对象存储系统失败,该站点的 Red Hat Quay 部署必须被关闭,以便客户端由全局负载均衡器重定向到具有完整存储系统的剩余站点。否则,客户端将遇到拉取和推送失败。
  • Red Hat Quay 没有内部感知连接的对象存储系统的健康状态或可用性。如果一个站点的对象存储系统不可用,则其余站点或站点没有自动重定向到剩余的存储系统或系统。
  • 地理复制(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 部署,并利用存储库镜像功能。

7.2.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. 配置负载均衡器以为集群提供单一入口点。

7.2.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 和路由

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

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

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

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

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

7.3. 升级 Red Hat Quay Operator 的 geo-replication 部署

使用以下步骤升级地理复制的 Red Hat Quay Operator。

重要
  • 当将 geo-replicated Red Hat Quay Operator 部署升级到下一个 y-stream 版本(例如,Red Hat Quay 3.7 → Red Hat Quay 3.8),您必须在升级前停止操作。
  • 故障时间从一个 y-stream 版本升级到下一个版本会间歇性。
  • 在升级前,强烈建议您备份 Red Hat Quay Operator 部署。
步骤

此流程假设您在三个(或更多)系统上运行 Red Hat Quay Operator。对于此过程,我们将假设三个名为 System A、 System BSystem C 的系统。系统 A 将充当部署 Red Hat Quay Operator 的主要系统。

  1. 在 System B 和 System C 上,缩减您的 Red Hat Quay Operator 部署。这可以通过禁用自动扩展并覆盖 Red Hat Quay、镜像 worker 和 Clair 的副本计数(如果被管理)来实现。使用以下 quayregistry.yaml 文件作为参考:

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      name: registry
      namespace: ns
    spec:
      components:
        …
        - kind: horizontalpodautoscaler
          managed: false 1
        - kind: quay
          managed: true
          overrides: 2
            replicas: 0
        - kind: clair
          managed: true
          overrides:
            replicas: 0
        - kind: mirror
          managed: true
          overrides:
            replicas: 0
        …
    1
    禁用 Quay、Clair 和 mirroring worker 的自动扩展
    2
    将访问数据库和对象的组件的副本数设置为 0
    注意

    您必须保留在 System A 上运行的 Red Hat Quay Operator。不要更新 System A 上的 quayregistry.yaml 文件。

  2. 等待 registry-quay-appregistry-quay-mirrorregistry-clair-app pod 消失。输入以下命令检查其状态:

    oc get pods -n <quay-namespace>

    输出示例

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

  3. 在 System A 上,启动 Red Hat Quay Operator 升级到最新的 y-stream 版本。这是手动过程。有关升级安装的 Operator 的更多信息,请参阅 升级已安装的 Operator。如需有关 Red Hat Quay 升级路径的更多信息,请参阅升级 Red Hat Quay Operator
  4. 安装新的 Red Hat Quay Operator 后,集群上所需的升级会自动完成。之后,新的 Red Hat Quay pod 会使用最新的 y-stream 版本启动。另外,还会调度并启动新的 Quay pod。
  5. 通过进入到 Red Hat Quay UI 确认更新是否正常工作:

    1. OpenShift 控制台中,导航到 OperatorsInstalled Operators,然后点击 Registry Endpoint 链接。

      重要

      在 Red Hat Quay UI 可用前,不要执行以下步骤。在系统 A 上提供 UI 前,不要升级 System B 和 System C 上的 Red Hat Quay Operator。

  6. 确认更新在 System A 上正常工作后,在 System B 和 System C 上启动 Red Hat Quay Operator。Operator 升级会导致升级的 Red Hat Quay 安装,并重启 pod。

    注意

    因为数据库架构对于新的 y-stream 安装正确,System B 和 System C 上的新 pod 应该快速启动。

7.3.1. 从 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 在所有定义的站点间同步。在继续操作前,请完成此步骤。

  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

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

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

8.1. 备份 Red Hat Quay

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

先决条件

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

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

8.1.1. Red Hat Quay 配置备份

使用以下步骤备份 Red Hat Quay 配置。

步骤

  1. 要通过导出 QuayRegistry 自定义资源来支持 QuayRegistry 自定义资源,请输入以下命令:

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

      metadata.creationTimestamp
      metadata.finalizers
      metadata.generation
      metadata.resourceVersion
      metadata.uid
  3. 输入以下命令备份受管密钥 secret:

    注意

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

    $ oc get secret -n <quay_namespace> <quay_registry_name>_quay_registry_managed_secret_keys -o yaml > managed_secret_keys.yaml
  4. 编辑生成的 managed_secret_keys.yaml 文件,并删除条目 metadata.ownerReferencesmanaged_secret_keys.yaml 文件应该类似如下:

    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
      name: <quayname>_quay_registry_managed_secret_keys
      namespace: <quay_namespace>
    data:
      CONFIG_EDITOR_PW: <redacted>
      DATABASE_SECRET_KEY: <redacted>
      DB_ROOT_PW: <redacted>
      DB_URI: <redacted>
      SECRET_KEY: <redacted>
      SECURITY_SCANNER_V4_PSK: <redacted>

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

  5. 输入以下命令重定向当前的 Quay 配置文件:

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

    $ oc exec -it quay_pod_name -- cat /conf/stack/config.yaml > quay_config.yaml

8.1.2. 缩减 Red Hat Quay 部署

使用以下步骤缩减 Red Hat Quay 部署。

重要

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

步骤

  1. 根据 Red Hat Quay 部署的版本,使用以下选项之一缩减部署。

    1. 对于 Operator 版本 3.7 及更新版本: 通过禁用自动扩展并覆盖 Red Hat Quay、mirror worker 和 Clair 的副本数来缩减 Red Hat Quay 部署。您的 QuayRegistry 资源应类似如下:

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

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

    $ oc get pods -n <quay_namespace>

    输出示例:

    $ oc get pod

    输出示例

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

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

使用以下步骤备份 Red Hat Quay 管理的数据库。

注意

如果您的 Red Hat Quay 部署配置了外部或不需要的 PostgreSQL 数据库,请参阅您的厂商文档,了解如何创建这些数据库的一致性备份。

步骤

  1. 识别 Quay PostgreSQL pod 名称:

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

    输出示例:

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

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

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

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

使用以下步骤备份 Red Hat Quay 管理的对象存储。本节中的说明适用于以下配置:

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

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

步骤

  1. 输入以下命令解码并导出 AWS_ACCESS_KEY_ID

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

    $ export AWS_SECRET_ACCESS_KEY=$(oc get secret -l app=noobaa -n <quay-namespace> -o jsonpath='{.items[0].data.AWS_SECRET_ACCESS_KEY}' |base64 -d)
  3. 创建新目录:

    $ mkdir blobs
注意

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

  1. 输入以下命令将所有 Blob 复制到目录中:

    $ 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

8.1.4. 扩展 Red Hat Quay 部署备份

  1. 根据 Red Hat Quay 部署的版本,使用以下选项之一扩展部署。

    1. 对于 Operator 版本 3.7 及更新版本: 根据需要重新启用自动扩展(如果需要),并删除 Quay、镜像 worker 和 Clair 的副本覆盖来扩展 Red Hat Quay 部署。您的 QuayRegistry 资源应类似如下:

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

      $ oc scale --replicas=1 deployment $(oc get deployment -n <quay_operator_namespace> | awk '/^quay-operator/ {print $1}') -n <quay_operator_namespace>
  2. 输入以下命令检查 Red Hat Quay 部署的状态:

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

    输出示例:

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

8.2. 恢复 Red Hat Quay

当 Red Hat Quay Operator 管理数据库时,请使用以下步骤恢复 Red Hat Quay。它应在执行 Red Hat Quay registry 备份后执行。如需更多信息,请参阅 备份 Red Hat Quay

先决条件

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

如果您的部署包含部分非受管数据库或存储组件,且您使用外部服务进行 PostgreSQL 或 S3 兼容对象存储来运行 Red Hat Quay 部署,则必须在恢复 Red Hat Quay 前从备份中恢复其数据。

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

使用以下步骤从备份中恢复 Red Hat Quay 及其配置文件。

注意

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

步骤

  1. 输入以下命令恢复备份的 Red Hat Quay 配置:

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

    如果您接收到错误 Error from server (AlreadyExists): error when creating "./config-bundle.yaml": secrets "config-bundle-secret" already exists,您需要使用 $ oc delete Secret config-bundle-secret -n <quay-namespace> 删除现有的资源,并使用 $ oc create -f ./config-bundle.yaml 重新创建它。

  2. 输入以下命令从备份中恢复生成的密钥:

    $ oc create -f ./managed-secret-keys.yaml
  3. 恢复 QuayRegistry 自定义资源:

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

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

8.2.2. 缩减 Red Hat Quay 部署

使用以下步骤缩减 Red Hat Quay 部署。

步骤

  1. 根据 Red Hat Quay 部署的版本,使用以下选项之一缩减部署。

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

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

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

    $ oc get pods -n <quay-namespace>

    输出示例:

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

8.2.3. 恢复 Red Hat Quay 数据库

使用以下步骤恢复您的 Red Hat Quay 数据库。

步骤

  1. 输入以下命令识别您的 Quay 数据库 pod:

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

    输出示例:

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

    $ oc cp ./backup.sql -n <quay-namespace> registry-quay-database-66969cd859-n2ssm:/tmp/backup.sql
  3. 输入以下命令在数据库中打开远程终端:

    $ oc rsh -n <quay-namespace> registry-quay-database-66969cd859-n2ssm
  4. 运行以下命令来输入 psql :

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

    postgres=# \l

    输出示例

                                                      List of databases
               Name            |           Owner            | Encoding |  Collate   |   Ctype    |   Access privileges
    ----------------------------+----------------------------+----------+------------+------------+-----------------------
    postgres                   | postgres                   | UTF8     | en_US.utf8 | en_US.utf8 |
    quayregistry-quay-database | quayregistry-quay-database | UTF8     | en_US.utf8 | en_US.utf8 |

  6. 输入以下命令丢弃数据库:

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

    输出示例

    DROP DATABASE

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

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

    sh-4.4$ psql < /tmp/backup.sql
  9. 输入以下命令退出 bash:

    sh-4.4$ exit

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

使用以下步骤恢复 Red Hat Quay 对象存储数据。

步骤

  1. 输入以下命令导出 AWS_ACCESS_KEY_ID

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

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

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

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

8.2.5. 扩展 Red Hat Quay 部署

  1. 根据 Red Hat Quay 部署的版本,使用以下选项之一扩展部署。

    1. 对于 Operator 版本 3.7 及更新版本: 根据需要重新启用自动扩展(如果需要),并删除 Quay、镜像 worker 和 Clair 的副本覆盖来扩展 Red Hat Quay 部署。您的 QuayRegistry 资源应类似如下:

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

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

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

    输出示例:

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

第 9 章 使用 Red Hat Quay Operator 启用 OCI 支持

使用以下步骤为 Red Hat Quay 配置 Open Container Initiative (OCI)支持。

流程

  1. 创建一个包含以下内容的 quay-config-bundle YAML 文件:

    apiVersion: v1
    stringData:
      config.yaml: |
        FEATURE_GENERAL_OCI_SUPPORT: true
    kind: Secret
    metadata:
      name: quay-config-bundle
      namespace: quay-enterprise
    type: Opaque
  2. 输入以下命令在适当的命名空间中创建 quay-config-bundle 对象,传递必要的属性以启用 OCI 支持。例如:

    $ oc create -n quay-enterprise -f quay-config-bundle.yaml
  3. quay-registry.yaml 文件中,引用 spec.configBundleSecret 字段的 secret。例如:

    apiVersion: quay.redhat.com/v1
    kind: QuayRegistry
    metadata:
      name: example-registry
      namespace: quay-enterprise
    spec:
      configBundleSecret: quay-config-bundle

其他资源

如需更多信息,请参阅 OCI 支持和 Red Hat Quay

第 10 章 卷大小覆盖

您可以指定为受管组件置备的存储资源大小。Clair 和 PostgreSQL 数据库的默认大小为 50Gi。现在,您可以选择足够大的容量领导,出于性能原因,或者在存储后端没有重新定义大小时选择。

在以下示例中,Clair 和 Quay PostgreSQL 数据库的卷大小已设置为 70Gi

apiVersion: quay.redhat.com/v1
kind: QuayRegistry
metadata:
  name: quay-example
  namespace: quay-enterprise
spec:
  configBundleSecret: config-bundle-secret
  components:
    - kind: objectstorage
      managed: false
    - kind: route
      managed: true
    - kind: tls
      managed: false
    - kind: clair
      managed: true
      overrides:
        volumeSize: 70Gi
    - kind: postgres
      managed: true
      overrides:
        volumeSize: 70Gi
    - kind: clairpostgres
      managed: true
注意

clairpostgres 组件的卷大小无法被覆盖。这是一个已知问题,将在以后的 Red Hat Quay 版本中解决。(PROJQUAY-Json1)

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

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

注意

没有 Red Hat Quay 和 Clair,CSO 无法正常工作。

Container Security Operator (CSO)包括以下功能:

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

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

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

使用以下步骤下载 Container Security Operator (CSO)。

注意

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

流程

  1. 在 OpenShift Container Platform 控制台页面中,选择 OperatorsOperatorHub 并搜索 Container Security Operator
  2. 选择 Container Security Operator,然后选择 Install 进入 Create Operator Subscription 页面。
  3. 检查设置(默认所有命名空间和自动批准策略),然后选择 Subscribe容器安全性 会在 Installed Operators 屏幕中几分钟后出现。
  4. 可选:您可以在 CSO 中添加自定义证书。在本例中,在当前目录中创建一个名为 quay.crt 的证书。然后,运行以下命令将证书添加到 CSO 中:

    $ oc create secret generic container-security-operator-extra-certs --from-file=quay.crt -n openshift-operators
    注意

    您必须重启 Operator pod 才能使新证书生效。

  5. 导航到 HomeDashboardsImage Security 的链接会出现在 status 部分,其中列出了目前发现的漏洞数。选择链接来查看安全分类,如下图所示:

    Access CSO scanning data from the OpenShift Container Platform dashboard

    重要

    Container Security Operator 目前为红帽安全公告提供损坏的链接。例如,可能提供以下链接 :https://access.redhat.com/errata/RHSA-2023:1842%20https://access.redhat.com/security/cve/CVE-2023-23916。URL 中的 %20 代表空格字符,但目前将两个 URL 的组合成一个不完整的 URL,例如 https://access.redhat.com/errata/RHSA-2023:1842https://access.redhat.com/security/cve/CVE-2023-23916。作为临时解决方案,您可以将每个 URL 复制到浏览器中,以导航到正确的页面。这是一个已知问题,并将在以后的 Red Hat Quay 版本中解决。

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

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

      The CSO points you to a registry containing the vulnerable image

    2. 选择 namespaces 链接以进入 ImageManifestVuln 界面,您可以在其中查看所选镜像的名称以及该镜像正在运行的所有命名空间。下图显示了特定存在漏洞的镜像在两个命名空间中运行:

      View namespaces a vulnerable image is running in

执行此步骤后,您会了解哪些镜像存在安全漏洞,您必须做什么才能修复这些漏洞,以及镜像在其中运行的每个命名空间。了解这一点,您可以执行以下操作:

  • 运行镜像需要更正该漏洞的警报用户。
  • 通过删除部署或启动镜像所在 pod 的对象来停止镜像运行。

    注意

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

11.2. 通过 CLI 查询镜像漏洞

使用以下步骤从命令行界面(CLI)查询镜像漏洞。

步骤

  1. 输入以下命令查询检测到的漏洞:

    $ oc get vuln --all-namespaces

    输出示例

    NAMESPACE     NAME              AGE
    default       sha256.ca90...    6m56s
    skynet        sha256.ca90...    9m37s

  2. 可选。要显示特定漏洞的详情,识别特定的漏洞及其命名空间,并使用 oc 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...

第 12 章 在 Red Hat Quay Operator 上部署 IPv6

您的 Red Hat Quay Operator 部署现在可以在只支持 IPv6 的位置提供,如 Telco 和 Edge 环境。

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

12.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 和双栈限制的影响

警告

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

12.2. IPv6 限制

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

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

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

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

  • 目前,当在 IPv6 单堆栈环境中部署 Red Hat Quay 时,Red Hat OpenShift Data Foundation 不被支持。因此,Red Hat OpenShift Data Foundation 无法在 IPv6 环境中使用。计划在以后的 OpenShift Data Foundation 版本中修复这个限制。
  • 目前,双栈(IPv4 和 IPv6)支持无法在 Red Hat Quay OpenShift Container Platform 部署中工作。当在启用了双栈支持的 OpenShift Container Platform 上部署 Red Hat Quay 3.8 时,Red Hat Quay Operator 生成的 Quay 路由只生成 IPv4 地址,而不是 IPv6 地址。因此,具有 IPv6 地址的客户端无法访问 OpenShift Container Platform 上的 Red Hat Quay 应用程序。这个限制计划在以后的 OpenShift Container Platform 版本中修复。

第 13 章 当在 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 替换为新证书数据。

第 14 章 升级 Red Hat Quay Operator 概述

Red Hat Quay Operator 遵循一个 同步的版本 方案,这意味着每个 Operator 版本都绑定到 Red Hat Quay 的版本及其管理的组件。QuayRegistry 自定义资源中没有字段,它设置要部署的 Red Hat Quay 版本 ; Operator 只能部署所有组件的单一版本。选择这个方案来确保所有组件都可以正常工作,并降低 Operator 的复杂性,了解如何管理 Kubernetes 上不同版本的 Red Hat Quay 的生命周期。

14.1. Operator Lifecycle Manager

Red Hat Quay Operator 应使用 Operator Lifecycle Manager (OLM) 来安装和升级。当使用默认 approvalStrategy: Automatic 创建订阅时,每当有新版本可用时,OLM 将自动升级 Red Hat Quay Operator。

警告

当 Operator Lifecycle Manager 安装 Red Hat Quay Operator 时,可能会将其配置为支持自动或手动升级。这个选项在安装过程中显示在 Red Hat Quay Operator 的 Operator Hub 页面中。它还可以通过 approvalStrategy 字段在 Red Hat Quay Operator Subscription 对象中找到。选择 Automatic 意味着,当发布新的 Operator 版本时,您的 Red Hat Quay Operator 将自动升级。如果这不必要,则应选择 Manual 批准策略。

14.2. 升级 Quay Operator

在 OpenShift Container Platform 上升级已安装的 Operator 的标准方法包括在 升级安装的 Operator 中。

通常,Red Hat Quay 仅支持从之前的(N-1)次版本进行升级。例如,不支持直接从 Red Hat Quay 3.0.5 升级到 3.5 的最新版本。用户必须按如下方式升级:

  1. 3.0.5 → 3.1.3
  2. 3.1.3 → 3.2.2
  3. 3.2.2 → 3.3.4
  4. 3.3.4 → 3.4.z
  5. 3.4.z → 3.5.z

这需要确保正确完成任何必要的数据库迁移,并在升级过程中按正确顺序完成。

在某些情况下,Red Hat Quay 支持从之前(N-2、N-3)次版本直接进行单步骤升级。这简化了旧版本客户的升级过程。支持以下升级路径:

  1. 3.3.z → 3.6.z
  2. 3.4.z → 3.6.z
  3. 3.4.z → 3.7.z
  4. 3.5.z → 3.7.z
  5. 3.7.z → 3.8.z
  6. 3.6.z → 3.9.z
  7. 3.7.z → 3.9.z
  8. 3.8.z → 3.9.z

有关 Red Hat Quay 的 独立部署的用户,请参阅 独立升级指南

14.2.1. 升级 Quay

要将 Red Hat Quay 从一个次版本升级到下一个次版本,如 3.4 → 3.5,您必须更改 Red Hat Quay Operator 的更新频道。

对于 z 流升级,如 3.4.2 → 3.4.3,更新会在安装过程中在最初选择的主频道中发布。执行 z 流升级的步骤取决于以上所述的 approvalStrategy。如果批准策略被设置为 Automatic,则 Quay Operator 将自动升级到最新的 z 流。这会导致自动的、滚动式的到较新的 z 流的 Quay 更新,几乎没有或只有非常短的停机时间。否则,在开始安装前,必须手动批准更新。

14.2.2. 从 3.8 → 3.9 更新 Red Hat Quay

重要

如果您的 Red Hat Quay 部署从一个 y-stream 升级到下一个(例如从 3.8.10 → 3.8.11),则不得将升级频道从 stable-3.8 切换到 stable-3.9。在 y-stream 升级过程中更改升级频道将不允许 Red Hat Quay 升级到 3.9。这是一个已知问题,并将在以后的 Red Hat Quay 版本中解决。

更新 Red Hat Quay 3.8 → 3.9 时,Operator 会自动为 Clair 和 Red Hat Quay 从版本 10 升级到 13 的现有 PostgreSQL 数据库。

重要
  • 这个升级不可逆。强烈建议您升级到 PostgreSQL 13。PostgreSQL 10 在 2022 年 11 月 10 日有其最终发行版本,不再被支持。如需更多信息,请参阅 PostgreSQL 版本策略
  • 默认情况下,Red Hat Quay 配置为从 PostgreSQL 10 中删除旧的持久性卷声明(PVC)。要禁用此设置和备份旧的 PVC,您必须在 quay-operator Subscription 对象中将 POSTGRES_UPGRADE_RETAIN_BACKUP 设置为 True

先决条件

  • 您已在 OpenShift Container Platform 上安装了 Red Hat Quay 3.8。
  • 100 GB 可用,额外存储.

    在升级过程中,会置备额外的持久性卷声明(PVC)来存储迁移的数据。这有助于防止对用户数据进行破坏性操作。升级过程为 Red Hat Quay 数据库升级和 Clair 数据库升级推出 50 GB 的 PVC。

步骤

  1. 可选。通过将 POSTGRES_UPGRADE_RETAIN_BACKUP 设置为 True your quay-operator Subscription 对象,从 PostgreSQL 10 备份旧的 PVC。例如:

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: quay-operator
      namespace: quay-enterprise
    spec:
      channel: stable-3.8
      name: quay-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      config:
        env:
        - name: POSTGRES_UPGRADE_RETAIN_BACKUP
          value: "true"
  2. 在 OpenShift Container Platform Web 控制台中,进入到 OperatorsInstalled Operators
  3. 点 Red Hat Quay Operator。
  4. 进入 Subscription 选项卡。
  5. Subscription details 下点 Update channel
  6. 选择 stable-3.9 并保存更改。
  7. Upgrade status 下检查新安装的进度。等待升级状态更改为 1, 然后继续。
  8. 在 OpenShift Container Platform 集群中,进入到 WorkloadsPods。现有 pod 应该被终止,或者在终止过程中终止。
  9. 等待以下 pod (负责升级现有数据的数据库和 alembic 迁移)以加速: clair-postgres-upgradequay-postgres-upgradequay-app-upgrade
  10. clair-postgres-upgradequay-postgres-upgradequay-app-upgrade pod 标记为 Completed 后,您的 Red Hat Quay 部署的剩余 pod 会启动。这大约需要十分钟。
  11. 验证 quay-databaseclair-postgres 容器集现在是否使用 postgresql-13 镜像。
  12. quay-app pod 标记为 Running 后,您可以访问 Red Hat Quay registry。

14.2.3. 直接从 3.3.z 或 3.4.z 升级到 3.6

下面的部分提供了在从 Red Hat Quay 3.3.z 或 3.4.z 升级到 3.6 时的重要信息。

14.2.3.1. 启用边缘路由升级

  • 在以前的版本中,当运行启用了边缘路由的 Red Hat Quay 的 3.3.z 版本时,用户无法升级到 3.4.z 版本的 Red Hat Quay。这个问题已在 Red Hat Quay 3.6 发行版本中解决。
  • 当从 3.3.z 升级到 3.6 时,如果在 Red Hat Quay 3.3.z 部署中将 tls.termination 设置为 none,它将改为使用 TLS 边缘终止的 HTTPS,并使用默认集群通配符证书。例如:

    apiVersion: redhatcop.redhat.io/v1alpha1
    kind: QuayEcosystem
    metadata:
      name: quay33
    spec:
      quay:
        imagePullSecretName: redhat-pull-secret
        enableRepoMirroring: true
        image: quay.io/quay/quay:v3.3.4-2
        ...
        externalAccess:
          hostname: quayv33.apps.devcluster.openshift.com
          tls:
            termination: none
        database:
    ...

14.2.3.2. 使用自定义 SSL/TLS 证书/密钥对升级,而无需 Subject Alternative Names

从 Red Hat Quay 3.3.4 直接升级到 Red Hat Quay 3.6 时,客户使用自己的 SSL/TLS 证书/密钥对没有 Subject Alternative Names (SAN)。在升级到 Red Hat Quay 3.6 时,部署会被阻止,并显示 Red Hat Quay Operator pod 日志中的错误消息,表示 Red Hat Quay SSL/TLS 证书必须具有 SANs。

如果可能,您应该使用 SAN 中的正确主机名重新生成 SSL/TLS 证书。可能的临时解决方案包括在升级后在 quay-appquay-upgradequay-config-editor pod 中定义环境变量,以启用 CommonName 匹配:

 GODEBUG=x509ignoreCN=0

GODEBUG=x509ignoreCN=0 标志允许在没有 SANs 时将 X.509 证书上的 CommonName 字段视为主机名。但不建议使用这个临时解决方案,因为它不会在重新部署中保留。

14.2.3.3. 使用 Red Hat Quay Operator 从 3.3.z 或 3.4.z 升级到 3.6 时配置 Clair v4

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

有关在断开连接的 OpenShift Container Platform 集群中设置 Clair v4 的说明,请参阅在 Red Hat Quay OpenShift 部署中设置 Clair

14.2.4. 从 3.3.z 升级到 3.6 时的 Swift 配置

当从 Red Hat Quay 3.3.z 升级到 3.6.z 时,一些用户可能会收到以下错误: Switch auth v3 requires tenant_id (字符串)在 os_options 中。作为临时解决方案,您可以手动更新 DISTRIBUTED_STORAGE_CONFIG 以添加 os_optionstenant_id 参数:

  DISTRIBUTED_STORAGE_CONFIG:
    brscale:
    - SwiftStorage
    - auth_url: http://****/v3
      auth_version: "3"
      os_options:
        tenant_id: ****
        project_name: ocp-base
        user_domain_name: Default
      storage_path: /datastorage/registry
      swift_container: ocp-svc-quay-ha
      swift_password: *****
      swift_user: *****

14.2.5. 更改 Red Hat Quay Operator 的更新频道

已安装的 Operator 的订阅指定一个更新频道,用于跟踪和接收 Operator 的更新。要升级 Red Hat Quay Operator 以开始跟踪并从更新频道接收更新,请更改安装的 Red Hat Quay Operator 的 Subscription 选项卡中的更新频道。对于带有 自动批准策略 的订阅,升级会自动开始,并可以在列出 Installed Operator 的页面中监控。

14.2.6. 手动批准待处理的 Operator 升级

如果已安装的 Operator 的订阅设置为 Manual,则当其当前更新频道中发布新更新时,在开始安装前必须手动批准更新。如果 Red Hat Quay Operator 有一个待处理的升级,这个状态将显示在 Installed Operators 列表中。在 Red Hat Quay Operator 的 Subscription 选项卡中,您可以预览安装计划并查看列出可用于升级的资源。如果满意,点 Approve 并返回到列出 Installed Operators 的页面来监控升级的进度。

下图显示了 UI 中的 Subscription 选项卡,包括 更新频道批准策略升级状态InstallPlan

Subscription tab including upgrade Channel and Approval strategy

Installed Operators 列表提供当前 Quay 安装的高级概述:

Installed Operators

14.3. 升级 QuayRegistry

当 Red Hat Quay Operator 启动时,它会立即查找它被配置为监视的命名空间中找到的任何 QuayRegistries。找到时,会使用以下逻辑:

  • 如果未设置 status.currentVersion,请正常协调。
  • 如果 status.currentVersion 等于 Operator 版本,请正常协调。
  • 如果 status.currentVersion 不等于 Operator 版本,请检查是否可以升级它。如果它可以执行升级任务,并在完成后将 status.currentVersion 设置为 Operator 的版本。如果无法升级,请返回错误,并只保留 QuayRegistry 及其部署的 Kubernetes 对象。

14.4. 升级 QuayEcosystem

从以前的 Operator 版本支持升级,该 Operator 将 QuayEcosystem API 用于有限的配置集合。为确保迁移不会意外发生,需要将特殊标签应用到 QuayEcosystem,以便迁移它。将创建一个新的 QuayRegistry 以供 Operator 管理,但旧的 QuayEcosystem 将保留下来,直到手动删除为止,以确保在出现错误时回滚并仍然可以访问 Quay。要将现有的 QuayEcosystem 迁移到新的 QuayRegistry,请使用以下步骤。

步骤

  1. "quay-operator/migrate": "true" 添加到 QuayEcosystemmetadata.labels 中。

    $ oc edit quayecosystem <quayecosystemname>
    metadata:
      labels:
        quay-operator/migrate: "true"
  2. 等待与 QuayEcosystem 相同的 metadata.name 创建 QuayRegistryQuayEcosystem 将标记为标签 "quay-operator/migration-complete": "true "。
  3. 设置了新的 QuayRegistrystatus.registryEndpoint 后,访问 Red Hat Quay 并确认所有数据和设置都已成功迁移。
  4. 如果一切都正常工作,您可以删除 QuayEcosystem 和 Kubernetes 垃圾回收会清理所有旧资源。

14.4.1. 恢复 QuayEcosystem 升级

如果在从 QuayEcosystem 升级到 QuayRegistry 时出现错误,请按照以下步骤恢复回使用 QuayEcosystem

步骤

  1. 使用 UI 或 kubectl 删除 QuayRegistry

    $ kubectl delete -n <namespace> quayregistry <quayecosystem-name>
  2. 如果使用 Route 提供外部访问,将 Route 更改为指回原始的 Service(使用 UI 或 kubectl)。
注意

如果您的 QuayEcosystem 管理 PostgreSQL 数据库,升级过程会将您的数据迁移到升级的 Operator 管理的新 PostgreSQL 数据库。旧数据库不会被更改或删除,但 Red Hat Quay 在迁移完成后将不再使用它。如果在数据迁移过程中出现问题,升级过程会退出,建议您继续将数据库作为非受管组件使用。

14.4.2. 支持的升级 QuayEcosystem 配置

如果迁移 QuayEcosystem 组件失败或不受支持,Red Hat Quay Operator 会在其日志中报告错误,并处于 status.conditions 中。所有非受管组件都应成功迁移,因为不需要采用 Kubernetes 资源,并且 Red Hat Quay 的 config.yaml 文件中已提供了所有必需的值。

数据库

不支持临时数据库(必须设置volumeSize 字段)。

Redis

不需要特殊要求。

外部访问

自动迁移只支持 passthrough Route 访问。其他方法需要手动迁移。

  • 没有自定义主机名的 LoadBalancer :当 QuayEcosystem 使用标签 "quay-operator/migration-complete": "true" 标记后,在删除 QuayEcosystem 需要从现存的 Service 中删除 metadata.ownerReferences 字段,这可以防止 Kubernetes 对 Service 进行垃圾回收并并删除负载均衡器。一个新的 Service 将被创建,带有 metadata.name 格式 <QuayEcosystem-name>-quay-app。编辑现有 Servicespec.selector,使其与新 Servicespec.selector 匹配,以便进入旧负载均衡器端点的流量现在会被定向到新的 pod。旧的 Service 将会被您管理; Quay Operator 将不再管理它。
  • 带有自定义主机名的 LoadBalancer/NodePort/Ingress :将创建一个类型为 LoadBalancer 的新的 Service,带有 metadata.name 格式 <QuayEcosystem-name>-quay-app。将您的 DNS 设置更改为指向由新 Service 提供的 status.loadBalancer 端点。

Clair

不需要特殊要求。

对象存储

QuayEcosystem 没有受管对象存储组件,因此对象存储始终被标记为非受管组件。不支持本地存储。

存储库镜像

不需要特殊要求。

其他资源

  • 如需有关 Red Hat Quay Operator 的更多详细信息,请参阅上游 quay-operator 项目。

法律通告

Copyright © 2023 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.