部署 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 服务器
- 安装最新的 RHEL 8 服务器。如果您想一个桌面,可以执行最小、shell 访问功能,或安装 Server 和 GUI。
- 注册并订阅您的 RHEL 服务器系统,如 How to register and subscribe a system… 所述。
使用以下命令注册您的系统并列出可用的订阅。选择一个可用的 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 |
| http://quay-server.example.com |
Quay 的 Postgres |
| quay-server.example.com:5432 |
Redis |
| quay-server.example.com:6379 |
Clair V4 的 Postgres |
| quay-server.example.com:5433 |
Clair V4 |
| http://quay-server.example.com:8081 |
2.3. 配置数据库
Quay 需要数据库来存储元数据。Postgres 用于本文档,建议用于高可用性配置。或者,您可以使用 MySQL 与配置类似的方法,如下所述。
2.3.1. 设置 Postgres
在概念验证方案中,您将使用本地文件系统上的目录来持久保留数据库数据。
在安装文件夹中,由变量 $QUAY 表示,为数据库数据创建一个目录,并正确设置权限:
$ mkdir -p $QUAY/postgres-quay $ setfacl -m u:26:-wx $QUAY/postgres-quay
使用
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
确保安装了 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 连接参数。
要生成配置文件,可在
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
-
使用您的浏览器访问配置工具的用户界面
http://quay-server.example.com
。请注意,本文档假设您已在/etc/hosts
文件中配置了quay-server.example.com
主机名。 -
使用用户名
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 交互,以及推送和拉取镜像。
-
使用浏览器访问位于
http://quay-server.example.com
的 Red Hat Quay registry 的用户界面,假设您在/etc/hosts
文件中配置了quay-server.example.com
作为主机名。 -
单击
Create Account
,再添加用户,例如quayadmin
,密码为
。 在命令行中登录到 registry:
$ sudo podman login --tls-verify=false quay-server.example.com Username: quayadmin Password: password Login Succeeded!
2.7.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
使用
podman images
命令查看本地副本:$ sudo podman images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/busybox latest 22667f53682a 14 hours ago 1.45 MB ...
标记此镜像以准备将其推送到 Red Hat Quay registry:
$ sudo podman tag docker.io/library/busybox quay-server.example.com/quayadmin/busybox:test
接下来,将镜像推送到 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
要从命令行测试对镜像的访问,请首先删除镜像的本地副本:
$ sudo podman rmi quay-server.example.com/quayadmin/busybox:test Untagged: quay-server.example.com/quayadmin/busybox:test
再次从 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.cert
和 ssl.key
的证书文件和主密钥文件。
3.1.2.1. 创建证书颁发机构
生成 root CA 密钥:
$ openssl genrsa -out rootCA.key 2048
生成 root CA 证书:
$ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem
输入将融入到证书请求的信息,包括服务器主机名,例如:
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. 签署证书
生成服务器密钥:
$ openssl genrsa -out ssl.key 2048
生成签名请求:
$ openssl req -new -key ssl.key -out ssl.csr
输入将融入到证书请求的信息,包括服务器主机名,例如:
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
创建配置文件
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
使用配置文件生成证书
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,请参阅以下部分。
以配置模式启动
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
-
在 Server Configuration 部分中,选择
Red Hat Quay 处理 TLS
的 TLS。上传之前创建的证书和私钥文件,确保服务器主机名与创建证书时使用的值匹配。验证并下载更新的配置。 停止
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 时的另一个选项是使用命令行界面。
将证书文件和主密钥文件复制到您的配置目录中,确保它们分别命名为
ssl.cert
和ssl.key
:$ cp ~/ssl.cert $QUAY/config $ cp ~/ssl.key $QUAY/config $ cd $QUAY/config
编辑
config.yaml
文件,并指定希望 Quay 处理 TLS:config.yaml
... SERVER_HOSTNAME: quay-server.example.com ... PREFERRED_URL_SCHEME: https ...
停止
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
,浏览器会警告潜在的风险:
继续登录屏幕,浏览器将通知您该连接不安全:
后续小节中涵盖了将系统配置为信任根证书颁发机构(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. 将系统配置为信任证书颁发机构
将 root CA 文件复制到合并的系统范围信任存储中:
$ sudo cp rootCA.pem /etc/pki/ca-trust/source/anchors/
更新系统范围信任存储配置:
$ sudo update-ca-trust extract
您可以使用
trust list
命令来确保已经配置了 Quay 服务器:$ trust list | grep quay label: quay-server.example.com
现在,当您访问位于
https://quay-server.example.com
的 registry 时,锁定图标会显示连接的安全:要从系统范围信任中删除 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 添加超级用户。要使用命令行界面添加超级用户,请参阅以下部分。
以配置模式启动
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
-
在 UI 的
Access Settings
部分下,在Super Users
字段中输入用户名(在这个实例中,quayadmin
),然后单击Add
。 验证并下载
配置文件
,然后终止以配置模式运行的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 面板
重启 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
点击 UI 右上角的当前用户名或 avatar 来访问 Super User Admin Panel。如果以超级用户身份添加了该用户,则会在名为 Super User Admin Panel 的下拉列表中显示额外项目。
3.2.3.1. 创建全局可见的用户信息
通过使用 Superuser Admin Panel,您可以为您的机构创建 Normal
、Warning
或 Error
消息。
-
在 UI 右上角点击您的用户名。选择
Super User Admin Panel
。 -
在 Red Hat Quay Management 页面中,单击左侧导航窗格中的
全局可见用户信息
。 点
Create Message
显示包含Normal
、Warning
和Error
message type 的下拉菜单:-
选择
Click to set message
并输入消息,然后单击Create Message
。
可以通过单击 Options
和 Delete 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
以配置模式启动
Quay
容器,再选择 Enable Repository Images 复选框。如果要在镜像过程中需要 HTTPS 通信并验证证书,请选择 HTTPS 和证书验证复选框。-
验证并下载
配置文件
,然后使用更新的 配置文件在 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
:
3.3.4.1. 存储库镜像设置
在 Settings 选项卡中,将 Repository State 设置为
Mirror
:在 Mirror 选项卡中,输入连接到外部 registry 的详细信息,以及标签、调度和访问信息:
在以下字段中输入详情:
-
registry Location: 您要镜像的外部仓库,如
registry.redhat.io/quay/quay-rhel8
tags: 此字段是必需的。您可以输入各个标签或标签模式的逗号分隔列表。(请参阅 Tag Patterns 部分以了解详细信息。)
注意要让 Quay 获取远程存储库中的标签列表,必须满足以下要求之一:
- 远程存储库中必须存在带有"latest"标签的镜像 。
- 至少一个没有模式匹配的显式标签必须存在于您指定的标签列表中
- 起始日期: 镜像开始的日期。默认使用当前的日期和时间。
- 同步间隔: 默认每 24 小时同步。您可以根据小时或天更改。
- 机器人用户: 创建新机器人帐户或选择现有的机器人帐户来进行镜像。
- Username: 用于访问包含您要镜像的存储库的外部 registry 的用户名。
- password: 与 Username 关联的密码。请注意,密码不能包含需要转义字符(\)的字符。
-
registry Location: 您要镜像的外部仓库,如
3.3.4.2. 高级设置
- 在 Advanced Settings 部分中,根据需要配置 TLS 和代理:
- 验证 TLS: 如果需要 HTTPS,并在与目标远程 registry 通信时验证此复选框。
- HTTP Proxy: 识别访问远程站点所需的 HTTP 代理服务器(如果需要)。
- HTTPS 代理: 识别访问远程站点所需的 HTTPS 代理服务器(如果需要)。
- No Proxy: 不需要代理的位置列表
3.3.4.3. 现在同步
要执行即时镜像操作,请在存储库镜像选项卡中按立即同步按钮。日志包括在 Usage Logs 选项卡中:
镜像完成后,镜像将显示在 Tags 选项卡中:
以下是已完成的存储库镜像屏幕示例:
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 的数据库。
在概念验证方案中,您将使用本地文件系统上的目录来持久保留数据库数据。
在安装文件夹中,由变量 $QUAY 表示,为 Clair 数据库数据创建一个目录,并正确设置权限:
$ mkdir -p $QUAY/postgres-clairv4 $ setfacl -m u:26:-wx $QUAY/postgres-clairv4
使用 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
确保安装了 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 配置
如果
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
登录配置工具,并在 UI 的 Security Scanner 部分中启用扫描。使用
quay-server
系统上还没有使用的端口,为 Clair 设置 HTTP 端点,如8081
。使用Generate PSK
按钮创建 Clair 预共享密钥(PSK),例如:-
安全扫描器端点:
http://quay-server.example.com:8081
Security Scanner PSK:
MTU5YzA4Y2ZkNzJoMQ==
设置扫描程序数据的 UI 将显示在以下镜像中:
安全扫描器 UI
-
安全扫描器端点:
验证并下载
配置文件
,然后停止正在运行配置编辑器的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
使用
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
接下来,使用包含扫描程序设置的更新配置文件重启
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 安全扫描
在命令行中登录到 registry:
$ sudo podman login --tls-verify=false quay-server.example.com Username: quayadmin Password: Login Succeeded!
在 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 中看到,如以下镜像所示:
扫描概述
扫描详情
3.4.6. 国家漏洞数据库中的 CVE 等级
现在,Quay UI 中可以看到 Clair v4.2 的数据。此外,Clair v4.2 为检测到的漏洞添加国家漏洞数据库中的 CVSS 分数。
在这个版本中,如果漏洞的 CVSS 分数在 distro 分数中的 2 个级别,则默认存在的 Quay UI 分数。例如:
这与前面的接口不同,这只会显示以下信息:
3.5. 重启容器
由于 podman 不支持 --restart
选项,所以您可以将 podman
配置为 systemd 服务,如使用 Podman 将容器迁移到 systemd所述
3.5.1. 使用 Podman 的 systemd 单元文件
默认情况下,Podman 为现有容器或 pod 生成一个单元文件。您可以使用 podman generate systemd --new
命令生成更多可移植的 systemd 单元文件。--new
标志指示 Podman 生成创建、启动和删除容器的单元文件。
从正在运行的 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
将单元文件复制到
/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
重新载入 systemd Manager 配置:
$ sudo systemctl daemon-reload
启用服务并在引导时启动它们:
$ 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. 启动、停止和检查服务的状态
检查 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
停止 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
启动 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 身份验证
- 使用存储的异地复制