部署 Red Hat Quay 用于概念验证(非生产环境)目的

Red Hat Quay 3.7

部署 Red Hat Quay

Red Hat OpenShift Documentation Team

摘要

Red Hat Quay 入门

前言

Red Hat Quay 是一个企业级的 registry,用于构建、保护并提供容器镜像。这个步骤描述了如何部署 Red Hat Quay 进行概念验证(非生产环境)。

第 1 章 概述

Red Hat Quay 的功能包括:

  • 高可用性
  • geo-replication
  • 存储库镜像
  • docker v2, schema 2(multiarch)支持
  • 持续集成
  • 使用 Clair 进行安全扫描
  • 自定义日志轮转
  • 零停机时间垃圾回收
  • 24/7 支持

Red Hat Quay 支持:

  • 多个身份验证和访问方法
  • 多个存储后端
  • Quay、Clair 和存储后端的自定义证书
  • 应用程序 registry
  • 不同的容器镜像类型

1.1. 架构

Red Hat Quay 包含多个核心组件,包括内部和外部。

1.1.1. 内部组件

  • Quay(容器 registry) :将 Quay 容器作为服务运行,由 pod 中的几个组件组成。
  • Clair :扫描容器镜像以了解漏洞,并推荐修复。

1.1.2. 外部组件

  • 数据库 :Red Hat Quay 用作其主要元数据存储。请注意,这不适用于镜像存储。
  • redis(key-value 存储): 存储实时构建器日志和 Red Hat Quay 教程。
  • 云存储 :对于支持的部署,您需要使用以下类型的存储之一:

    • 公有云存储 :在公有云环境中,您应该使用云供应商的对象存储,如 Amazon Web Services 的 Amazon S3 或 Google Cloud 的 Google Cloud Storage。
    • 私有云存储 :在私有云中,需要 S3 或 Swift 兼容对象存储,如 Ceph RADOS 或 OpenStack Swift。
警告

对于任何生产配置,不要使用"本地挂载目录"存储引擎。不支持挂载的 NFS 卷。本地存储只用于 Red Hat Quay 测试的安装。

第 2 章 Red Hat Quay 入门

Red Hat Quay registry 可以针对单个机器(物理或虚拟)中的非生产环境部署,并符合以下规格:

2.1. 先决条件

  • Red Hat Enterprise Linux(RHEL)8 :获取最新的 Red Hat Enterprise Linux 8 服务器介质(从 下载页 ),并根据 Red Hat Enterprise Linux 8 产品文档中的安装说明进行操作。
  • 有效的红帽订阅:配置 有效的 Red Hat Enterprise Linux 8 服务器订阅。
  • CPU :两个或更多虚拟 CPU。
  • RAM :4GB 或更多.
  • 磁盘空间 :所需的磁盘空间取决于 registry 的存储需求。大约 30GB 磁盘空间应该足够用于测试系统,如下所示:

    • 至少 10GB 磁盘空间用于 Red Hat Enterprise Linux 操作系统。
    • 至少 10GB 磁盘空间用于 docker 存储(运行 3 个容器)。
    • 至少 10GB 磁盘空间用于 Quay 本地存储。请注意,CEPH 或其他本地存储可能需要更多内存。

有关调整大小的更多信息,请参阅 Quay 3.x 大小 Guidlines

注意

强烈建议使用 Red Hat Enterprise Linux(RHEL)8 以获得 Red Hat Quay 3.7 的生产质量部署。RHEL 7 还没有与 Red Hat Quay 3.7 进行测试,并将在以后的版本中被弃用。

2.1.1. 使用 Podman

本文档使用 Podman 来创建和部署容器。如果您的系统上没有安装 Podman,则可以使用对应的 Docker 命令。有关 Podman 和相关技术的更多信息,请参阅在 Red Hat Enterprise Linux 8 中构建、运行和管理 Linux 容器

注意

强烈建议使用 Podman 进行 Red Hat Quay 3.7 的高可用性、生产质量部署。Docker 尚未与 Red Hat Quay 3.7 进行测试,并将在以后的版本中弃用。

2.2. 配置 Red Hat Enterprise Linux 服务器

2.2.1. 安装并注册 RHEL 服务器

  1. 安装最新的 RHEL 8 服务器。如果您想一个桌面,可以执行最小、shell 访问功能,或安装 Server 和 GUI。
  2. 注册并订阅您的 RHEL 服务器系统,如 How to register and subscribe a system…​ 所述。
  3. 使用以下命令注册您的系统并列出可用的订阅。选择一个可用的 RHEL 服务器订阅,附加到其池 ID 并升级到最新版本:

    # subscription-manager register --username=<user_name> --password=<password>
    # subscription-manager refresh
    # subscription-manager list --available
    # subscription-manager attach --pool=<pool_id>
    # yum update -y

2.2.2. 安装 Podman

  • 如果还没有在系统中安装 Podman:

    $ sudo yum install -y podman
  • 另外,您可以安装 container-tools 模块,该模块会拉取到完整的容器软件包集合:

    $ sudo yum module install -y container-tools

2.2.3. Registry 身份验证

  • 将身份验证设置为 registry.redhat.io,以便可以拉取 Quay 容器,如 Red Hat Container Registry Authentication 所述。请注意,这与早期的 Red Hat Quay 版本不同,该镜像托管在 quay.io 上。

    您可以使用以下命令登录到 registry:

    $ sudo podman login registry.redhat.io
    Username: <username>
    Password: <password>

2.2.4. 防火墙配置

  • 如果您在系统上运行了防火墙,可能需要添加允许访问 Red Hat Quay 的规则。所需的命令取决于您映射的端口,例如:

    $ firewall-cmd --permanent --add-port=80/tcp
    $ firewall-cmd --permanent --add-port=443/tcp
    $ firewall-cmd --permanent --add-port=5432/tcp
    $ firewall-cmd --permanent --add-port=5433/tcp
    $ firewall-cmd --permanent --add-port=6379/tcp
    $ firewall-cmd --reload

2.2.5. IP 地址和命名服务

在 Red Hat Quay 中配置组件容器的方法有很多,它们可以相互通信:

  • 使用容器的 IP 地址: 您可以使用 podman inspect 确定容器的 IP 地址,然后在指定连接字符串时在配置工具中使用这些值,例如:

    $ sudo podman inspect -f "{{.NetworkSettings.IPAddress}}" postgresql-quay

    这种方法容易受到主机重启的影响,因为重启后容器的 IP 地址会改变。

  • 使用命名服务: 如果您希望部署在容器重启后保留,这通常会导致更改的 IP 地址,您可以实现命名服务。例如,可以使用 dnsname 插件用于允许容器按名称相互解析。
  • 使用主机网络: 您可以使用带有 --net=host 选项的 podman run 命令,然后在指定配置中地址时使用主机上的容器端口。当两个容器希望使用相同的端口时,这个选项容易受到端口冲突,因此不建议这样做。
  • 配置端口映射: 您可以使用端口映射在主机上公开端口,然后将这些端口与主机 IP 地址或主机名结合使用。

本文档使用端口映射,并假定主机系统的静态 IP 地址。在此部署中,我们使用 quay-server.example.com 和系统的 IP 地址 192.168.1.112,并在 /etc/hosts 文件中建立这些信息:

$ cat /etc/hosts
...
192.168.1.112   quay-server.example.com
组件端口映射address

Quy

-p 80:8080 -p 443:8443

http://quay-server.example.com

Quay 的 Postgres

-p 5432:5432

quay-server.example.com:5432

Redis

-p 6379:6379

quay-server.example.com:6379

Clair V4 的 Postgres

-p 5433:5432

quay-server.example.com:5433

Clair V4

-p 8081:8080

http://quay-server.example.com:8081

2.3. 配置数据库

Quay 需要数据库来存储元数据。Postgres 用于本文档,建议用于高可用性配置。或者,您可以使用 MySQL 与配置类似的方法,如下所述。

2.3.1. 设置 Postgres

在概念验证方案中,您将使用本地文件系统上的目录来持久保留数据库数据。

  1. 在安装文件夹中,由变量 $QUAY 表示,为数据库数据创建一个目录,并正确设置权限:

    $ mkdir -p $QUAY/postgres-quay
    $ setfacl -m u:26:-wx $QUAY/postgres-quay
  2. 使用 podman run 启动 Postgres 容器,指定用户名、密码、数据库名称和端口,以及数据库数据的卷定义:

    $ sudo podman run -d --rm --name postgresql-quay \
      -e POSTGRESQL_USER=quayuser \
      -e POSTGRESQL_PASSWORD=quaypass \
      -e POSTGRESQL_DATABASE=quay \
      -e POSTGRESQL_ADMIN_PASSWORD=adminpass \
      -p 5432:5432 \
      -v $QUAY/postgres-quay:/var/lib/pgsql/data:Z \
      registry.redhat.io/rhel8/postgresql-10:1
  3. 确保安装了 Postgres pg_trgm 模块,因为 Quay 需要它:

    $ sudo podman exec -it postgresql-quay /bin/bash -c 'echo "CREATE EXTENSION IF NOT EXISTS pg_trgm" | psql -d quay -U postgres'

2.4. 配置 Redis

Redis ia 是一个键值存储,供 Quay 用于实时构建器日志和 Red Hat Quay 教程。

2.4.1. 设置 Redis

  • 使用 podman run 启动 Redis 容器,指定端口和密码:

    $ sudo podman run -d --rm --name redis \
      -p 6379:6379 \
      -e REDIS_PASSWORD=strongpassword \
      registry.redhat.io/rhel8/redis-5:1

2.5. 配置 Red Hat Quay

在运行 Red Hat Quay 服务前,您需要生成一个配置文件,其中包含所有组件的详细信息,包括注册表设置,以及数据库和 Redis 连接参数。

  1. 要生成配置文件,可在 config 模式下运行 Quay 容器,指定密码,例如:字符串 secret

    $ sudo podman run --rm -it --name quay_config -p 80:8080 -p 443:8443 registry.redhat.io/quay/quay-rhel8:v3.7.13 config secret
  2. 使用您的浏览器访问配置工具的用户界面 http://quay-server.example.com。请注意,本文档假设您已在 /etc/hosts 文件中配置了 quay-server.example.com 主机名。
  3. 使用用户名 quayconfig 和密码 secret 登录,或者上述 podman run 命令中指定的任何值。

2.5.1. Red Hat Quay 设置

在配置编辑器中输入以下详情:

  • 基本配置
  • 服务器配置
  • 数据库
  • Redis

2.5.1.1. 基本配置

在基本配置设置中,完成 registry 标题和 registry 短标题字段。如果填充了默认值,则可使用默认值。

2.5.1.2. 服务器配置

指定可以访问 registry 的位置的 HTTP 主机和端口。如果您遵循本文档中的说明,请输入 quay-server.example.com

2.5.1.3. 数据库

在数据库部分中,为 Red Hat Quay 用来存储元数据的数据库指定连接详情。如果您遵循本文档中用于部署概念验证系统的说明,则输入以下值:

  • 数据库类型: Postgres
  • 数据库服务器: quay-server.example.com:5432
  • Username: quayuser
  • Password: quaypass
  • 数据库名称: quay

2.5.1.4. Redis

Redis 键-值存储用于存储实时事件和构建日志。如果您遵循本文档中用于部署概念验证系统的说明,则输入以下值:

  • Redis Hostname: quay-server.example.com
  • Redis 端口: 6379(默认)
  • Redis password: strongpassword

2.5.2. 验证并下载配置

设定了所有必填字段后,单击 Validate Configuration Changes 来验证您的设置。如果报告了任何错误,请继续编辑您的配置,直到所有必填字段有效且 Red Hat Quay 可以连接到您的数据库和 Redis 服务器。

在配置有效后,下载配置文件。停止正在运行配置编辑器的 Quay 容器。

2.6. 部署 Red Hat Quay

2.6.1. 先决条件

  • 您的 Quay 数据库和 Redis 服务器正在运行。
  • 您已生成了有效的配置捆绑包。
  • 您已停止了用于运行配置编辑器的 Quay 容器。

2.6.2. 准备配置文件夹

  • 解包配置捆绑包,以便 Quay 可以使用它:

    $ mkdir $QUAY/config
    $ cp ~/Downloads/quay-config.tar.gz $QUAY/config
    $ cd $QUAY/config
    $ tar xvf quay-config.tar.gz

2.6.3. 为镜像数据准备本地存储

  • 对于这个概念验证部署,请使用本地文件系统来存储 registry 镜像:

    $ mkdir $QUAY/storage
    $ setfacl -m u:1001:-wx $QUAY/storage

2.6.4. 部署 Red Hat Quay registry

  • 使用 podman run 启动 Quay 容器。为您的镜像数据指定适当的卷,并为镜像数据指定本地存储:

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

2.7. 使用 Red Hat Quay

以下步骤允许您使用接口并创建新的组织和存储库,并搜索和浏览现有存储库。第 3 步,您可以使用 命令行界面与 registry 交互,以及推送和拉取镜像。

  1. 使用浏览器访问位于 http://quay-server.example.com 的 Red Hat Quay registry 的用户界面,假设您在 /etc/hosts 文件中配置了 quay-server.example.com 作为主机名。
  2. 单击 Create Account,再添加用户,例如 quayadmin密码为
  3. 在命令行中登录到 registry:

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

2.7.1. 推送和拉取镜像

  1. 要从 Red Hat Quay registry 中测试推送和拉取镜像,首先从外部 registry 中提取示例镜像:

    $ sudo podman pull busybox
    Trying to pull docker.io/library/busybox...
    Getting image source signatures
    Copying blob 4c892f00285e done
    Copying config 22667f5368 done
    Writing manifest to image destination
    Storing signatures
    22667f53682a2920948d19c7133ab1c9c3f745805c14125859d20cede07f11f9
  2. 使用 podman images 命令查看本地副本:

    $ sudo podman images
    REPOSITORY                          TAG      IMAGE ID       CREATED         SIZE
    docker.io/library/busybox           latest   22667f53682a   14 hours ago    1.45 MB
    ...
  3. 标记此镜像以准备将其推送到 Red Hat Quay registry:

    $ sudo podman tag docker.io/library/busybox quay-server.example.com/quayadmin/busybox:test
  4. 接下来,将镜像推送到 Red Hat Quay registry。按照以下步骤,您可以使用浏览器在存储库中查看标记的镜像。

    $ sudo podman push --tls-verify=false quay-server.example.com/quayadmin/busybox:test
    Getting image source signatures
    Copying blob 6b245f040973 done
    Copying config 22667f5368 done
    Writing manifest to image destination
    Storing signatures
  5. 要从命令行测试对镜像的访问,请首先删除镜像的本地副本:

    $ sudo podman rmi quay-server.example.com/quayadmin/busybox:test
    Untagged: quay-server.example.com/quayadmin/busybox:test
  6. 再次从 Red Hat Quay registry 拉取镜像:

    $ sudo podman pull --tls-verify=false quay-server.example.com/quayadmin/busybox:test
    Trying to pull quay-server.example.com/quayadmin/busybox:test...
    Getting image source signatures
    Copying blob 6ef22a7134ba [--------------------------------------] 0.0b / 0.0b
    Copying config 22667f5368 done
    Writing manifest to image destination
    Storing signatures
    22667f53682a2920948d19c7133ab1c9c3f745805c14125859d20cede07f11f9

第 3 章 高级 Red Hat Quay 部署

3.1. 使用 SSL 保护到 Red Hat Quay 的连接

3.1.1. 使用 SSL 简介

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

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

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

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

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

3.1.2.1. 创建证书颁发机构

  1. 生成 root CA 密钥:

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

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

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

3.1.2.2. 签署证书

  1. 生成服务器密钥:

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

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

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

    openssl.cnf

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

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

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

3.1.3. 使用 UI 配置 SSL

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

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

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

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

3.1.4. 使用命令行配置 SSL

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

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

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

    config.yaml

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

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

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

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

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

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

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

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

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

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

Potential risk

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

Connection not secure

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

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

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

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

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

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

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

$ sudo podman login quay-server.example.com

Username: quayadmin
Password:
Login Succeeded!

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

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

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

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

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

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

    Connection not secure

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

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

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

3.2. Red Hat Quay 超级用户

超级用户 是一个具有扩展权限的 Quay 用户帐户,包括以下功能:

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

3.2.1. 使用 UI 将超级用户添加到 Quay

本节介绍如何使用 Quay UI 添加超级用户。要使用命令行界面添加超级用户,请参阅以下部分。

  1. 以配置模式启动 Quay 容器,将现有配置作为卷载入:

    $ sudo podman run --rm -it --name quay_config \
      -p 8080:8080 \
      -p 443:8443 \
      -v $QUAY/config:/conf/stack:Z \
      registry.redhat.io/quay/quay-rhel8:v3.7.13 config secret
  2. 在 UI 的 Access Settings 部分下,在 Super Users 字段中输入用户名(在这个实例中,quayadmin),然后单击 Add
  3. 验证并下载 配置文件,然后终止以配置模式运行的 Quay 容器。将 config.yaml 文件提取到配置目录中,并以 registry 模式重启 Quay 容器:

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

3.2.2. 编辑 config.yaml 文件以添加超级用户

您还可以通过直接编辑 config.yaml 文件来添加超级用户。超级用户帐户列表作为数组存储在字段 SUPER_USERS 中。

  • 如果正在运行,停止容器 registry,并在 config.yaml 文件中添加 SUPER_USERS 数组:

    SERVER_HOSTNAME: quay-server.example.com
    SETUP_COMPLETE: true
    SUPER_USERS:
      - quayadmin
    ...

3.2.3. 访问超级用户 admin 面板

  1. 重启 Quay registry:

    $ sudo podman rm -f quay
    $ sudo podman run -d --rm -p 80:8080 -p 443:8443 \
    --name=quay \
    -v $QUAY/config:/conf/stack:Z \
    -v $QUAY/storage:/datastorage:Z \
    registry.redhat.io/quay/quay-rhel8:v3.7.13
  2. 点击 UI 右上角的当前用户名或 avatar 来访问 Super User Admin Panel。如果以超级用户身份添加了该用户,则会在名为 Super User Admin Panel 的下拉列表中显示额外项目。

    Super User Admin Panel

3.2.3.1. 创建全局可见的用户信息

通过使用 Superuser Admin Panel,您可以为您的机构创建 NormalWarningError 消息。

  1. 在 UI 右上角点击您的用户名。选择 Super User Admin Panel
  2. 在 Red Hat Quay Management 页面中,单击左侧导航窗格中的 全局可见用户信息
  3. Create Message 显示包含 NormalWarningError message type 的下拉菜单:

    Creating a new messsage

  4. 选择 Click to set message 并输入消息,然后单击 Create Message

可以通过单击 OptionsDelete Message 来删除消息。

3.3. 仓库镜像

3.3.1. 存储库镜像

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

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

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

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

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

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

3.3.2. 镜像配置 UI

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

    Enable mirroring and require HTTPS and verified certificates

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

3.3.3. 镜像 worker

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

流程

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

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

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

3.3.4. 创建已镜像的存储库

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

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

Create new Red Hat Quay repo

3.3.4.1. 存储库镜像设置

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

    Create a new Red Hat Quay repo mirror

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

    Repository mirroring

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

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

      注意

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

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

3.3.4.2. 高级设置

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

3.3.4.3. 现在同步

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

    Usage logs

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

    Repository mirroring tags

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

    Repository mirroring details

3.3.5. 镜像标签模式

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

3.3.5.1. 模式语法

pattern

描述

*

匹配所有字符

?

匹配任何单个字符

[seq]

匹配 seq中的任何字符

[!seq]

匹配不在 seq中的任何字符

3.3.5.2. 标签模式示例

Pattern 示例

Matches 示例

v3*

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

v3.*

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

v3.?

v3.1、v3.2、v3.3

v3.[12]

v3.1、v3.2

v3.[12]*

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

v3.[!1]*

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

3.4. 部署 Clair V4

Clair 是一个可解析镜像内容并报告影响内容的漏洞的应用。这通过静态分析来执行,而不是在运行时执行。Clair 的分析分为三个不同的部分:

  • 索引: 索引开始将清单提交到 Clair。在收到时,Clair 将获取层、扫描其内容并返回名为 IndexReport 的中间表示。清单是容器镜像的 Clair 表示。Clair 利用 OCI 清单和层内容解决这一事实,以减少重复的工作。索引清单后,IndexReport 会被保留,以便稍后检索。
  • 匹配: 匹配获取一个 IndexReport,并关联影响报告所代表的清单的漏洞。Clair 不断推测新的安全数据,对匹配者的请求始终为您提供对 IndexReport 的最新漏洞分析。
  • 通知: Clair 实施通知服务。发现新漏洞时,通知程序服务将决定这些漏洞是否影响到索引清单。然后,notifier 将根据其配置执行操作。

3.4.1. 为 Clair 部署单独的数据库

Clair 需要 Postgres 数据库。如果 Quay 还使用了 Postgres,则 Quay 和 Clair 之间共享一个通用数据库,但在本例中部署了特定于 Clair 的数据库。

在概念验证方案中,您将使用本地文件系统上的目录来持久保留数据库数据。

  1. 在安装文件夹中,由变量 $QUAY 表示,为 Clair 数据库数据创建一个目录,并正确设置权限:

    $ mkdir -p $QUAY/postgres-clairv4
    $ setfacl -m u:26:-wx $QUAY/postgres-clairv4
  2. 使用 podman 运行 Postgres 容器,指定用户名、密码、数据库名称和端口,以及数据库数据的卷定义。作为标准 Postgres 端口 5432 已在 Quay 部署中使用,在该实例 5433 中公开一个不同的端口:

    $ sudo podman run -d --rm --name postgresql-clairv4 \
      -e POSTGRESQL_USER=clairuser \
      -e POSTGRESQL_PASSWORD=clairpass \
      -e POSTGRESQL_DATABASE=clair \
      -e POSTGRESQL_ADMIN_PASSWORD=adminpass \
      -p 5433:5432 \
      -v $QUAY/postgres-clairv4:/var/lib/pgsql/data:Z \
      registry.redhat.io/rhel8/postgresql-10:1
  3. 确保安装了 Postgres uuid-ossp 模块,因为 Clair 需要它:

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

3.4.2. Clair 的 Quay 配置

  1. 如果 Quay 容器正在运行,则停止它并以配置模式重启,并以卷的形式载入现有配置:

    $ sudo podman run --rm -it --name quay_config \
      -p 80:8080 -p 443:8443 \
      -v $QUAY/config:/conf/stack:Z \
      registry.redhat.io/quay/quay-rhel8:v3.7.13 config secret
  2. 登录配置工具,并在 UI 的 Security Scanner 部分中启用扫描。使用 quay-server 系统上还没有使用的端口,为 Clair 设置 HTTP 端点,如 8081。使用 Generate PSK 按钮创建 Clair 预共享密钥(PSK),例如:

    • 安全扫描器端点:http://quay-server.example.com:8081
    • Security Scanner PSK: MTU5YzA4Y2ZkNzJoMQ==

      设置扫描程序数据的 UI 将显示在以下镜像中:

      安全扫描器 UI

      Security Scanner

  3. 验证并下载 配置文件,然后停止正在运行配置编辑器的 Quay 容器。将配置捆绑包(如之前)提取到 $QUAY/config 目录。

    $ cp ~/Downloads/quay-config.tar.gz $QUAY/config
    $ cd $QUAY/config
    $ tar xvf quay-config.tar.gz

Red Hat Quay 配置文件现已更新,使其包含安全扫描程序的以下字段:

...
FEATURE_SECURITY_NOTIFICATIONS: true
FEATURE_SECURITY_SCANNER: true
...
SECURITY_SCANNER_INDEXING_INTERVAL: 30
SECURITY_SCANNER_V4_ENDPOINT: http://quay-server.example.com:8081
SECURITY_SCANNER_V4_PSK: MTU5YzA4Y2ZkNzJoMQ==
SERVER_HOSTNAME: quay-server.example.com
...

3.4.3. Clair 配置

Clair 配置的详细信息,请访问 https://github.com/quay/clair/blob/main/Documentation/reference/config.md

  • /etc/ 目录中创建 config.yaml 文件,例如 /etc/clairv4/config/config.yaml。使用以下示例,它提供概念验证部署中使用的最小配置:

    http_listen_addr: :8081
    introspection_addr: :8089
    log_level: debug
    indexer:
      connstring: host=quay-server.example.com port=5433 dbname=clair user=clairuser password=clairpass sslmode=disable
      scanlock_retry: 10
      layer_scan_concurrency: 5
      migrations: true
    matcher:
      connstring: host=quay-server.example.com port=5433 dbname=clair user=clairuser password=clairpass sslmode=disable
      max_conn_pool: 100
      run: ""
      migrations: true
      indexer_addr: clair-indexer
    notifier:
      connstring: host=quay-server.example.com port=5433 dbname=clair user=clairuser password=clairpass sslmode=disable
      delivery_interval: 1m
      poll_interval: 5m
      migrations: true
    auth:
      psk:
        key: "MTU5YzA4Y2ZkNzJoMQ=="
        iss: ["quay"]
    # tracing and metrics
    trace:
      name: "jaeger"
      probability: 1
      jaeger:
        agent_endpoint: "localhost:6831"
        service_name: "clair"
    metrics:
      name: "prometheus"
  • http_listen_addr 设置为您在 Quay 配置工具中指定的 Clair HTTP 端点的端口,本例中为 :8081
  • 您在 Quay 配置工具中生成的 Clair 预共享密钥(PSK)用于身份验证,其签发者(在 iss 字段中指定)设置为 quay

3.4.4. 运行 Clair

  1. 使用 podman run 命令运行 Clair 容器,公开您在配置工具中指定的 HTTP 端点端口,本例中为 8081

    $ sudo podman run -d --rm --name clairv4 \
      -p 8081:8081 -p 8089:8089 \
      -e CLAIR_CONF=/clair/config.yaml -e CLAIR_MODE=combo \
      -v /etc/clairv4/config:/clair:Z \
      registry.redhat.io/quay/clair-rhel8:v3.7.13
  2. 接下来,使用包含扫描程序设置的更新配置文件重启 Quay 容器:

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

3.4.5. 使用 Clair 安全扫描

  1. 在命令行中登录到 registry:

    $ sudo podman login --tls-verify=false quay-server.example.com
    Username: quayadmin
    Password:
    Login Succeeded!
  2. 在 registry 中拉取、标记并推送示例镜像:

    $ sudo podman pull ubuntu:20.04
    $ sudo podman tag docker.io/library/ubuntu:20.04 quay-server.example.com/quayadmin/ubuntu:20.04
    $ sudo podman push --tls-verify=false quay-server.example.com/quayadmin/ubuntu:20.04

安全扫描的结果可以在 Quay UI 中看到,如以下镜像所示:

扫描概述

Scanning summary

扫描详情

Scanning details

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

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

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

Clair v4.2 data display

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

Clair v4 data display

3.5. 重启容器

由于 podman 不支持 --restart 选项,所以您可以将 podman 配置为 systemd 服务,如使用 Podman 将容器迁移到 systemd所述

3.5.1. 使用 Podman 的 systemd 单元文件

默认情况下,Podman 为现有容器或 pod 生成一个单元文件。您可以使用 podman generate systemd --new 命令生成更多可移植的 systemd 单元文件。--new 标志指示 Podman 生成创建、启动和删除容器的单元文件。

  1. 从正在运行的 Red Hat Quay registry 中创建 systemd 单元文件,如下所示:

    $ sudo podman generate systemd --new --files --name redis
    $ sudo podman generate systemd --new --files --name postgresql-quay
    $ sudo podman generate systemd --new --files --name quay
    $ sudo podman generate systemd --new --files --name postgresql-clairv4
    $ sudo podman generate systemd --new --files --name clairv4
  2. 将单元文件复制到 /usr/lib/systemd/system 中以 root 用户身份安装它们:

    $ sudo cp -Z container-redis.service /usr/lib/systemd/system
    $ sudo cp -Z container-postgresql-quay.service /usr/lib/systemd/system
    $ sudo cp -Z container-quay.service /usr/lib/systemd/system
    $ sudo cp -Z container-postgresql-clairv4.service /usr/lib/systemd/system
    $ sudo cp -Z container-clairv4.service /usr/lib/systemd/system
  3. 重新载入 systemd Manager 配置:

    $ sudo systemctl daemon-reload
  4. 启用服务并在引导时启动它们:

    $ sudo systemctl enable --now container-redis.service
    $ sudo systemctl enable --now container-postgresql-quay.service
    $ sudo systemctl enable --now container-quay.service
    $ sudo systemctl enable --now container-postgresql-clairv4.service
    $ sudo systemctl enable --now container-clairv4.service

3.5.2. 启动、停止和检查服务的状态

  1. 检查 Quay 组件的状态:

    $ sudo systemctl status container-redis.service
    $ sudo systemctl status container-postgresql-quay.service
    $ sudo systemctl status container-quay.service
    $ sudo systemctl status container-postgresql-clairv4.service
    $ sudo systemctl status container-clairv4.service
  2. 停止 Quay 组件服务:

    $ sudo systemctl stop container-redis.service
    $ sudo systemctl stop container-postgresql-quay.service
    $ sudo systemctl stop container-quay.service
    $ sudo systemctl stop container-postgresql-clairv4.service
    $ sudo systemctl stop container-clairv4.service
  3. 启动 Quay 组件服务:

    $ sudo systemctl start container-redis.service
    $ sudo systemctl start container-postgresql-quay.service
    $ sudo systemctl start container-quay.service
    $ sudo systemctl start container-postgresql-clairv4.service
    $ sudo systemctl start container-clairv4.service

3.5.3. 重启后测试重启

配置并启用服务后,重启该系统。当系统重新启动后,使用 podman ps 检查 Quay 组件的所有容器是否已重启:

$ sudo podman ps -a
CONTAINER ID  IMAGE                                       COMMAND         CREATED         STATUS             PORTS                   NAMES
4e87c7889246  registry.redhat.io/rhel8/postgresql-10:1    run-postgresql  19 seconds ago  Up 18 seconds ago  0.0.0.0:5432->5432/tcp  postgresql-quay
b8fbac1920d4  registry.redhat.io/rhel8/redis-5:1          run-redis       19 seconds ago  Up 18 seconds ago  0.0.0.0:6379->6379/tcp  redis
d959d5bf7a24  registry.redhat.io/rhel8/postgresql-10:1    run-postgresql  18 seconds ago  Up 18 seconds ago  0.0.0.0:5433->5432/tcp  postgresql-clairv4
e75ff8651dbd  registry.redhat.io/quay/clair-rhel8:v3.4.0                  18 seconds ago  Up 17 seconds ago  0.0.0.0:8081->8080/tcp  clairv4

在本实例中,Quay 容器本身无法启动。这是因为,当 Quay 中启用了安全扫描时,它会尝试在启动时连接到 Clair。但是,Clair 尚未完成初始化,且无法接受连接,因此 Quay 会立即终止。若要克服此问题,您需要配置 Quay 服务,使其依赖于 Clair 的服务,如以下部分所示。

3.5.4. 配置 Quay 依赖 Clair

在 Quay 的 systemd 服务文件中,通过设置 After=container-clairv4.service 来设置 [Unit] 部分中的 Clair 服务的依赖项。若要授予 Clair 容器初始化时间,请在 [Service] 部分添加一个延迟,如 RestartSec=30。以下是在为 Clair 配置依赖关系后修改的 Quay 文件的示例:

/usr/lib/systemd/system/container-quay.service

# container-quay.service
# autogenerated by Podman 2.0.5
# Tue Feb 16 17:02:26 GMT 2021

[Unit]
Description=Podman container-quay.service
Documentation=man:podman-generate-systemd(1)
Wants=network.target
After=container-clairv4.service

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
RestartSec=30
ExecStartPre=/bin/rm -f %t/container-quay.pid %t/container-quay.ctr-id
ExecStart=/usr/bin/podman run --conmon-pidfile %t/container-quay.pid --cidfile %t/container-quay.ctr-id --cgroups=no-conmon -d --rm -p 8080:8080 --name=quay -v /home/user1/quay/config:/conf/stack:Z -v /home/user1/quay/storage:/datastorage:Z registry.redhat.io/quay/quay-rhel8:v3.4.0
ExecStop=/usr/bin/podman stop --ignore --cidfile %t/container-quay.ctr-id -t 10
ExecStopPost=/usr/bin/podman rm --ignore -f --cidfile %t/container-quay.ctr-id
PIDFile=%t/container-quay.pid
KillMode=none
Type=forking

[Install]
WantedBy=multi-user.target default.target

更新 Quay 服务配置后,重启服务器并立即运行 podman ps

$ sudo podman ps -a
CONTAINER ID  IMAGE                                       COMMAND         CREATED         STATUS             PORTS                   NAMES
4e87c7889246  registry.redhat.io/rhel8/postgresql-10:1    run-postgresql  29 seconds ago  Up 28 seconds ago  0.0.0.0:5432->5432/tcp  postgresql-quay
b8fbac1920d4  registry.redhat.io/rhel8/redis-5:1          run-redis       29 seconds ago  Up 28 seconds ago  0.0.0.0:6379->6379/tcp  redis
d959d5bf7a24  registry.redhat.io/rhel8/postgresql-10:1    run-postgresql  28 seconds ago  Up 28 seconds ago  0.0.0.0:5433->5432/tcp  postgresql-clairv4
e75ff8651dbd  registry.redhat.io/quay/clair-rhel8:v3.4.0                  28 seconds ago  Up 27 seconds ago  0.0.0.0:8081->8080/tcp  clairv4

最初,Quay 容器将不可用,但当 RestartSec 延迟过期后,它应该启动:

$ sudo podman ps -a
CONTAINER ID  IMAGE                                       COMMAND         CREATED         STATUS             PORTS                   NAMES
4e87c7889246  registry.redhat.io/rhel8/postgresql-10:1    run-postgresql  35 seconds ago  Up 34 seconds ago  0.0.0.0:5432->5432/tcp  postgresql-quay
ab9f0e6ad7c3  registry.redhat.io/quay/quay-rhel8:v3.4.0   registry        3 seconds ago   Up 2 seconds ago   0.0.0.0:8080->8080/tcp  quay
b8fbac1920d4  registry.redhat.io/rhel8/redis-5:1          run-redis       35 seconds ago  Up 34 seconds ago  0.0.0.0:6379->6379/tcp  redis
d959d5bf7a24  registry.redhat.io/rhel8/postgresql-10:1    run-postgresql  34 seconds ago  Up 34 seconds ago  0.0.0.0:5433->5432/tcp  postgresql-clairv4
e75ff8651dbd  registry.redhat.io/quay/clair-rhel8:v3.4.0                  34 seconds ago  Up 33 seconds ago  0.0.0.0:8081->8080/tcp  clairv4

Quay 容器的 CREATED 字段在创建时间时显示 30 秒差别,如服务定义中所配置。

quay-server.example.com 上登录到 Red Hat Quay registry,并确保一切重启。

3.6. FIPS 就绪情况和合规性

NIST(美国国家标准与技术研究所开发的系统信息处理标准)被认为是安全和保护敏感数据的金级标准,特别是在大型银行、医疗保健和公共领域。Red Hat Enterprise Linux 和 Red Hat OpenShift Container Platform 通过提供一个 FIPS 模式来支持这个标准,该系统只允许使用某些 FIPS 验证的加密模块,如 openssl。这样可确保 FIPS 合规性。

Red Hat Quay 支持从版本 3.5 在启用了 FIPS 的 RHEL 和 Red Hat OpenShift Container Platform 上运行。

第 4 章 后续步骤

本文档演示了如何配置和部署 Red Hat Quay 的概念验证版本。有关部署到生产环境的更多信息,请参阅《Red Hat Quay - High Availability" 指南》。

"使用 Red Hat Quay"指南显示如何:

  • 添加用户和软件仓库
  • 使用标签
  • 使用构建 worker 自动构建 Dockerfile
  • 设置构建触发器
  • 为存储库事件添加通知

"管理 Red Hat Quay"指南显示如何:

  • 使用 SSL 和 TLS
  • 使用 Clair 启用安全扫描
  • 使用存储库镜像
  • 配置 LDAP 身份验证
  • 使用存储的异地复制

法律通告

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.