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

如果您的部署包含部分非受管数据库或存储组件,且您使用 Postgres 或 S3 兼容对象存储来运行您的 Red Hat Quay 部署,您必须参考服务提供商或厂商文档从备份中恢复其数据,然后才能恢复 Red Hat Quay

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

注意

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

  1. 恢复备份的 Red Hat Quay 配置以及备份中生成的密钥:

    $ oc create -f ./config-bundle.yaml
    
    $ oc create -f ./managed-secret-keys.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. 恢复 QuayRegistry 自定义资源:

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

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

16.2.2. 缩减 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 和镜像 worker 的自动扩展
    2
    将用于访问数据库和 objectstorage 的组件的副本数设置为 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>
  3. 等待 registry-quay-appregistry-quay-mirrorregistry-clair-app pod (取决于您设置为由 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

16.2.3. 恢复 Red Hat Quay 数据库

  1. 确定您的 Quay 数据库容器集:

    $ 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. Enter 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

16.2.4. 恢复 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 命令行工具。

16.2.5. 扩展 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>
  3. 检查 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