16.2. 地理复制要求和约束
- 在地理复制设置中,Red Hat Quay 要求所有区域都可以读取和写入所有其他区域的对象存储。对象存储必须可以被所有其他区域访问。
- 如果一个地理复制站点的对象存储系统失败,该站点的 Red Hat Quay 部署必须被关闭,以便客户端由全局负载均衡器重定向到具有完整存储系统的剩余站点。否则,客户端将遇到拉取和推送失败。
- Red Hat Quay 没有内部感知连接的对象存储系统的健康状态或可用性。用户必须配置全局负载均衡器(LB)来监控分布式系统的健康状况,并根据存储状态将流量路由到不同的站点。
-
要检查 geo-replication 部署的状态,您必须使用
/health/endtoend
检查点,该检查点用于全局健康监控。您必须使用/health/endtoend
端点手动配置重定向。/health/instance
端点仅检查本地实例健康状况。 - 如果一个站点的对象存储系统不可用,则其余站点或站点没有自动重定向到剩余的存储系统或系统。
- 地理复制(geo-replication)是异步的。如果一个站点永久丢失,则已存储在该站点的对象存储系统中,但在失败时还没有复制到剩余的站点的数据会丢失。
单个数据库,因此所有区域都共享所有元数据和 Red Hat Quay 配置。
地理复制不会复制数据库。如果出现停机,启用了地理复制功能的 Red Hat Quay 不会切换到另一个数据库。
- 单个 Redis 缓存在整个 Red Hat Quay 设置间共享,需要可以被所有 Red Hat Quay pod 访问。
-
所有区域应当使用相同的配置,但存储后端除外,这可以使用
QUAY_DISTRIBUTED_STORAGE_PREFERENCE
环境变量明确进行配置。 - 地理复制需要每个区域中的对象存储。它不适用于本地存储。
- 每个区域必须能够访问每个区域中的每个存储引擎,这需要一个网络路径。
- 或者,可以使用存储代理选项。
- 整个存储后端(如所有 blob)被复制。相反,存储库镜像可以限制在存储库或镜像上。
- 所有 Red Hat Quay 实例都必须共享相同的入口点,通常是通过负载均衡器。
- 所有 Red Hat Quay 实例都必须具有相同的超级用户集合,因为它们在通用配置文件中定义。
-
地理复制需要您的 Clair 配置设置为
unmanaged
。非受管 Clair 数据库允许 Red Hat Quay Operator 在地理复制环境中工作,其中 Red Hat Quay Operator 的多个实例必须与同一数据库通信。如需更多信息,请参阅高级 Clair 配置。 - geo-Replication 需要 SSL/TLS 证书和密钥。如需更多信息,请参阅 * Geo-Replication 需要 SSL/TLS 证书和密钥。如需更多信息,请参阅使用 SSL/TLS 证书部署概念验证。
如果无法满足上述要求,您应该使用两个或多个 Red Hat Quay 部署,并利用存储库镜像功能。
16.2.1. 为独立 Red Hat Quay 启用存储复制
使用以下步骤在 Red Hat Quay 上启用存储复制。
流程
更新
config.yaml
文件,使其包含要复制数据的存储引擎。您必须列出所有要使用的存储引擎:# ... FEATURE_STORAGE_REPLICATION: true # ... DISTRIBUTED_STORAGE_CONFIG: usstorage: - RHOCSStorage - access_key: <access_key> bucket_name: <example_bucket> hostname: my.noobaa.hostname is_secure: false port: "443" secret_key: <secret_key> storage_path: /datastorage/registry eustorage: - S3Storage - host: s3.amazon.com port: "443" s3_access_key: <access_key> s3_bucket: <example bucket> s3_secret_key: <secret_key> storage_path: /datastorage/registry DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS: [] DISTRIBUTED_STORAGE_PREFERENCE: - usstorage - eustorage # ...
可选。如果需要完成所有镜像到所有存储引擎,您可以通过手动设置
DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS
字段来手动将镜像复制到存储引擎。这样可确保所有镜像都复制到该存储引擎中。例如:# ... DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS: - usstorage - eustorage # ...
注意要启用按命名空间复制,请联络 Red Hat Quay 支持。
在为异地复制添加存储 并启用 Replicate 到存储引擎 后,您必须在所有存储中同步现有镜像数据。要做到这一点,您必须运行以下命令来在容器中执行:
$ podman exec -it <container_id>
要在添加新存储后同步内容,请输入以下命令:
# scl enable python27 bash
# python -m util.backfillreplication
注意这是添加新存储后要同步内容的一个时间操作。
16.2.2. 使用存储首选项运行 Red Hat Quay
- 将 config.yaml 复制到所有运行 Red Hat Quay 的机器
对于每个区域中的每个机器,添加一个
QUAY_DISTRIBUTED_STORAGE_PREFERENCE
环境变量,其中包含运行机器的区域的首选存储引擎。例如,对于在 Europe 中运行且具有
$QUAY/config
上具有配置目录的机器:$ sudo podman run -d --rm -p 80:8080 -p 443:8443 \ --name=quay \ -v $QUAY/config:/conf/stack:Z \ -e QUAY_DISTRIBUTED_STORAGE_PREFERENCE=europestorage \ registry.redhat.io/quay/quay-rhel8:v3.12.4
注意指定的环境变量值必须与配置面板中定义的 Location ID 的名称匹配。
- 重启所有 Red Hat Quay 容器
16.2.3. 从您的独立 Red Hat Quay 部署中删除地理复制站点
通过使用以下步骤,Red Hat Quay 管理员可以删除地理复制设置中的站点。
先决条件
-
您已配置了 Red Hat Quay 异地复制,至少有两个站点,例如
usstorage
和eustorage
。 - 每个站点都有自己的组织、存储库和镜像标签。
流程
运行以下命令,同步所有定义的站点之间的 Blob:
$ python -m util.backfillreplication
警告在从 Red Hat Quay
config.yaml
文件中删除存储引擎 前,您必须确保在 所有定义的站点间同步所有 Blob。在继续操作前完成此步骤。-
在 Red Hat Quay
config.yaml
文件中,删除eu
站点的storage
DISTRIBUTED_STORAGE_CONFIG
条目。 输入以下命令获取正在运行的容器列表:
$ podman ps
输出示例
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 92c5321cde38 registry.redhat.io/rhel8/redis-5:1 run-redis 11 days ago Up 11 days ago 0.0.0.0:6379->6379/tcp redis 4e6d1ecd3811 registry.redhat.io/rhel8/postgresql-13:1-109 run-postgresql 33 seconds ago Up 34 seconds ago 0.0.0.0:5432->5432/tcp postgresql-quay d2eadac74fda registry-proxy.engineering.redhat.com/rh-osbs/quay-quay-rhel8:v3.9.0-131 registry 4 seconds ago Up 4 seconds ago 0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp quay
输入以下命令在 PostgreSQL 容器内执行 shell:
$ podman exec -it postgresql-quay -- /bin/bash
运行以下命令来输入 psql :
bash-4.4$ psql
输入以下命令在地理复制部署中显示站点列表:
quay=# select * from imagestoragelocation;
输出示例
id | name ----+------------------- 1 | usstorage 2 | eustorage
输入以下命令退出 postgres CLI 以重新输入 bash-4.4:
\q
输入以下命令永久删除
eustorage
站点:重要以下操作无法撤消。请谨慎使用。
bash-4.4$ python -m util.removelocation eustorage
输出示例
WARNING: This is a destructive operation. Are you sure you want to remove eustorage from your storage locations? [y/n] y Deleted placement 30 Deleted placement 31 Deleted placement 32 Deleted placement 33 Deleted location eustorage
16.2.4. 在 OpenShift Container Platform 中设置 geo-replication
使用以下步骤在 OpenShift Container Platform 上设置 geo-replication。
流程
- 为 Red Hat Quay 部署 postgres 实例。
输入以下命令登录到数据库:
psql -U <username> -h <hostname> -p <port> -d <database_name>
为 Red Hat Quay 创建名为
quay
的数据库。例如:CREATE DATABASE quay;
在数据库中启用 pg_trm 扩展
\c quay; CREATE EXTENSION IF NOT EXISTS pg_trgm;
部署 Redis 实例:
注意- 如果您的云供应商有自己的服务,则部署 Redis 实例可能是必需的。
- 如果您使用 Builders,则需要部署 Redis 实例。
- 为 Redis 部署虚拟机
- 验证是否可以从运行 Red Hat Quay 的集群访问
- 必须打开端口 6379/TCP
在实例内运行 Redis
sudo dnf install -y podman podman run -d --name redis -p 6379:6379 redis
- 创建两个对象存储后端,每个集群一个。理想情况下,一个对象存储桶将接近第一个或主集群,另一个则运行更接近第二个或次要集群。
- 使用同一配置捆绑包部署集群,使用环境变量覆盖来为单个集群选择适当的存储后端。
- 配置负载均衡器,以提供集群的单个入口点。
16.2.4.1. 在 OpenShift Container Platform 上为 Red Hat Quay 配置异地复制
使用以下步骤为 OpenShift Container Platform 上的 Red Hat Quay 配置 geo-replication。
流程
创建在集群之间共享的
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 DATABASE_SECRET_KEY: 0ce4f796-c295-415b-bf9d-b315114704b8 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
输入以下命令来创建
configBundleSecret
:$ oc create secret generic --from-file config.yaml=./config.yaml georep-config-bundle
在每个集群中,设置
configBundleSecret
,并使用QUAY_DISTRIBUTED_STORAGE_PREFERENCE
环境变量覆盖来为该集群配置适当的存储。例如:注意两个部署之间的
config.yaml
文件都必须匹配。如果对一个集群进行更改,还必须更改它。US cluster
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 是非受管的,且路由被管理,因此您必须直接在 config 捆绑包中提供证书。如需更多信息,请参阅配置 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 是非受管的,且路由被管理,因此您必须直接在 config 捆绑包中提供证书。如需更多信息,请参阅配置 TLS 和路由。
16.2.5. 从 OpenShift Container Platform 部署的 Red Hat Quay 中删除 geo-replicated 站点
通过使用以下步骤,Red Hat Quay 管理员可以删除地理复制设置中的站点。
先决条件
- 已登陆到 OpenShift Container Platform。
-
您已配置了 Red Hat Quay 异地复制,至少有两个站点,例如
usstorage
和eustorage
。 - 每个站点都有自己的组织、存储库和镜像标签。
流程
运行以下命令,同步所有定义的站点之间的 Blob:
$ python -m util.backfillreplication
警告在从 Red Hat Quay
config.yaml
文件中删除存储引擎 前,您必须确保在 所有定义的站点间同步所有 Blob。在运行此命令时,会创建复制作业,由复制工作程序提取。如果有需要复制的 Blob,该脚本会返回将复制的 Blob 的 UUID。如果您多次运行此命令,并且返回脚本的输出为空,并不意味着完成复制过程;这意味着没有更多 Blob 进行复制。客户应在继续前使用适当的 judgement,因为分配的时间复制取决于检测到的 Blob 数量。
或者,您可以使用第三方云工具(如 Microsoft Azure)来检查同步状态。
在继续之前,必须完成此步骤。
-
在 Red Hat Quay
config.yaml
文件中,删除eu
站点的storage
DISTRIBUTED_STORAGE_CONFIG
条目。 输入以下命令来标识
Quay
应用程序 pod:$ oc get pod -n <quay_namespace>
输出示例
quay390usstorage-quay-app-5779ddc886-2drh2 quay390eustorage-quay-app-66969cd859-n2ssm
输入以下命令在
usstorage
pod 中打开交互式 shell 会话:$ oc rsh quay390usstorage-quay-app-5779ddc886-2drh2
输入以下命令永久删除
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