16.2. 地区复制要求和限制

  • 在地理复制设置中,Red Hat Quay 要求所有区域都可以读取和写入所有其他区域对象存储。对象存储必须可以被所有其他区域访问。
  • 如果一个地理复制站点的对象存储系统失败,该站点的 Red Hat Quay 部署必须被关闭,以便客户端由全局负载均衡器重定向到具有完整存储系统的剩余站点。否则,客户端将遇到拉取和推送失败。
  • Red Hat Quay 没有内部感知连接的对象存储系统的健康状态或可用性。用户必须配置一个全局负载均衡器(LB),以监控分布式系统的健康状况,并根据存储状态将流量路由到不同的站点。
  • 要检查 geo-replication 部署的状态,您必须使用 /health/endtoend checkpoint,该检查点用于全局健康监控。您必须使用 /health/endtoend 端点手动配置重定向。/health/instance 端点仅检查本地实例健康状况。
  • 如果一个站点的对象存储系统不可用,则其余站点或站点没有自动重定向到剩余的存储系统或系统。
  • geo-replication 是异步的。永久丢失站点的丢失会导致在该站点的对象存储系统中保存的数据丢失,但还没有在失败时复制到剩余的站点。
  • 因此,所有元数据和 Red Hat Quay 配置都会在所有区域间共享。

    geo-replication 不会复制数据库。如果停机,启用了 geo-replication 的 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 部署,并利用存储库镜像功能。

16.2.1. 启用存储复制 - 独立 Quay

使用以下步骤在 Red Hat Quay 上启用存储复制。

流程

  1. 在 Red Hat Quay 配置编辑器中,找到 Registry Storage 部分。
  2. Enable Storage Replication
  3. 添加每个要复制数据的存储引擎。必须列出要使用的所有存储引擎。
  4. 如果需要将所有镜像完整复制到所有存储引擎,请在每个存储引擎配置下点 Replicate to storage engine。这样可确保所有镜像都复制到该存储引擎。

    注意

    要启用每个命名空间的复制,请联络 Red Hat Quay 支持。

  5. 完成后,点 Save Configuration Changes。Red Hat Quay 重启后将生效。
  6. 在为 geo-replication 添加存储并在存储引擎 中启用复制后,您必须在所有存储中同步现有镜像数据。要做到这一点,您必须在容器中 oc exec (alternative, docker execkubectl exec),并输入以下命令:

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

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

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

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

    例如,对于在 Europe 中运行的机器,且主机上的 config 目录来自 $QUAY/config

    $ sudo podman run -d --rm -p 80:8080 -p 443:8443  \
       --name=quay \
       -v $QUAY/config:/conf/stack:Z \
       -e QUAY_DISTRIBUTED_STORAGE_PREFERENCE=europestorage \
       registry.redhat.io/quay/quay-rhel8:v3.11.0
    注意

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

  3. 重启所有 Red Hat Quay 容器

16.2.3. 从独立的 Red Hat Quay 部署中删除地理复制站点

通过按照以下流程,Red Hat Quay 管理员可以删除地理复制设置中的站点。

先决条件

  • 您已为 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. 输入以下命令获取正在运行的容器列表:

    $ 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

  4. 输入以下命令在 PostgreSQL 容器内执行 shell:

    $ podman exec -it postgresql-quay -- /bin/bash
  5. 运行以下命令来输入 psql :

    bash-4.4$ psql
  6. 输入以下命令在 geo-replicated 部署中显示站点列表:

    quay=# select * from imagestoragelocation;

    输出示例

     id |       name
    ----+-------------------
      1 | usstorage
      2 | eustorage

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

    \q
  8. 输入以下命令永久删除 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 中设置地理复制

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

16.2.4.1. 在 OpenShift Container Platform 上为 Red Hat Quay 配置 geo-replication

使用以下步骤为 OpenShift Container Platform 上的 Red Hat Quay 配置 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 和路由

16.2.5. 从 OpenShift Container Platform 部署的 Red Hat Quay 中删除地理复制站点

通过按照以下流程,Red Hat Quay 管理员可以删除地理复制设置中的站点。

先决条件

  • 已登陆到 OpenShift Container Platform。
  • 您已为 Red Hat Quay geo-replication 配置至少两个站点,例如 usstorageeustorage
  • 每个站点都有自己的组织、存储库和镜像标签。

流程

  1. 运行以下命令,在所有定义的站点间同步 Blob:

    $ python -m util.backfillreplication
    警告

    在从 Red Hat Quay config.yaml 文件中删除存储引擎 前,您必须确保 所有 Blob 在所有定义的站点间同步。

    运行此命令时,会创建复制 worker 提取的复制作业。如果存在需要复制的 Blob,脚本会返回要复制的 Blob 的 UUID。如果您多次运行此命令,并且返回脚本的输出为空,这并不意味着复制过程已完成;这意味着没有为复制进行排队。在继续操作前,客户应该使用适当的 judgement,因为分配的时间复制取决于检测到的 Blob 数量。

    另外,您可以使用 Microsoft Azure 等第三方云工具来检查同步状态。

    在继续操作前,必须完成此步骤。

  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