第 16 章 备份和恢复由 Red Hat Quay Operator 管理的 Red Hat Quay
在 OpenShift Container Platform 上由 Red Hat Quay Operator 管理时,使用本节中的内容备份和恢复 Red Hat Quay。
16.1. 备份 Red Hat Quay
此流程描述了如何使用 Red Hat Quay Operator 创建在 OpenShift Container Platform 上部署的 Red Hat Quay 备份
前提条件
-
使用 Red Hat Quay Operator (status condition
Available
设置为true
)在 OpenShift Container Platform 上有一个健康的 Red Hat Quay 部署。 -
组件
quay
、postgres
和objectstorage
被设置为managed: true
-
如果组件
clair
设为managed: true
,则组件clairpostgres
也设置为managed: true
(从 Red Hat Quay Operator v3.7 或更高版本开始)
如果您的部署包含部分非受管数据库或存储组件,且您使用 Postgres 或 S3 兼容对象存储来运行您的 Red Hat Quay 部署,您必须引用服务供应商或厂商文档来创建数据的备份。您可以参考本指南中描述的工具,作为如何备份外部 Postgres 数据库或对象存储的起点。
16.1.1. Red Hat Quay 配置备份
通过导出
QuayRegistry
自定义资源备份它:$ oc get quayregistry <quay-registry-name> -n <quay-namespace> -o yaml > quay-registry.yaml
编辑生成的
quayregistry.yaml
并删除 status 部分和以下 metadata 字段:metadata.creationTimestamp metadata.finalizers metadata.generation metadata.resourceVersion metadata.uid
备份受管密钥 secret:
注意如果您运行的版本早于 Red Hat Quay 3.7.0,可以跳过这一步。第一次部署 Quay 时会自动生成一些 secret。它们存储在
QuayRegistry
资源的命名空间中名为 <quay-registry-name>-quay-registry-managed-secret-keys
的 secret 中。$ oc get secret -n <quay-namespace> <quay-registry-name>-quay-registry-managed-secret-keys -o yaml > managed-secret-keys.yaml
编辑生成的
managed-secret-keys.yaml
文件,并删除条目metadata.ownerReferences
。managed-secret-keys.yaml
文件应类似于如下:apiVersion: v1 kind: Secret type: Opaque metadata: name: <quayname>-quay-registry-managed-secret-keys namespace: <quay-namespace> data: CONFIG_EDITOR_PW: <redacted> DATABASE_SECRET_KEY: <redacted> DB_ROOT_PW: <redacted> DB_URI: <redacted> SECRET_KEY: <redacted> SECURITY_SCANNER_V4_PSK: <redacted>
data
属性下的所有信息都应该保持相同。备份当前的 Quay 配置:
$ oc get secret -n <quay-namespace> $(oc get quayregistry <quay-registry-name> -n <quay-namespace> -o jsonpath='{.spec.configBundleSecret}') -o yaml > config-bundle.yaml
备份在 Quay pod 中挂载的
/conf/stack/config.yaml
文件:$ oc exec -it quay-pod-name -- cat /conf/stack/config.yaml > quay-config.yaml
16.1.2. 缩减 Red Hat Quay 部署
这一步需要创建与 Red Hat Quay 部署状态一致的备份。不要省略这一步,包括 Postgres 数据库和/或 S3 兼容对象存储由外部服务(不受 Operator 管理)提供的设置。
对于 Operator 版本 3.7 及更新版本: 通过禁用自动扩展并覆盖 Red Hat 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 …
对于 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>
等待
registry-quay-app
、registry-quay-mirror
和registry-clair-app
pod (取决于您设置为由 Red Hat Quay Operator 管理的组件)消失。您可以运行以下命令来检查其状态:$ oc get pods -n <quay-namespace>
输出示例:
$ oc get pod quay-operator.v3.7.1-6f9d859bd-p5ftc 1/1 Running 0 12m quayregistry-clair-postgres-7487f5bd86-xnxpr 1/1 Running 1 (12m ago) 12m quayregistry-quay-app-upgrade-xq2v6 0/1 Completed 0 12m quayregistry-quay-config-editor-6dfdcfc44f-hlvwm 1/1 Running 0 73s quayregistry-quay-database-859d5445ff-cqthr 1/1 Running 0 12m quayregistry-quay-redis-84f888776f-hhgms 1/1 Running 0 12m
16.1.3. Red Hat Quay 管理的数据库备份
如果您的 Red Hat Quay 部署配置了外部(拒绝) Postgres 数据库,请参阅您的厂商文档,了解如何创建这些数据库的一致性备份。
确定 Quay PostgreSQL pod 名称:
$ oc get pod -l quay-component=postgres -n <quay-namespace> -o jsonpath='{.items[0].metadata.name}'
输出示例:
quayregistry-quay-database-59f54bb7-58xs7
获取 Quay 数据库名称:
$ oc -n <quay-namespace> rsh $(oc get pod -l app=quay -o NAME -n <quay-namespace> |head -n 1) cat /conf/stack/config.yaml|awk -F"/" '/^DB_URI/ {print $4}' quayregistry-quay-database
下载备份数据库:
$ oc exec quayregistry-quay-database-59f54bb7-58xs7 -- /usr/bin/pg_dump -C quayregistry-quay-database > backup.sql
16.1.3.1. Red Hat Quay 管理的对象存储备份
本节中的说明适用于以下配置:
- 独立、多云对象网关配置
- OpenShift Data foundation storage 要求 Red Hat Quay Operator 通过 ObjectStorageBucketClaim API 从中置备 S3 对象存储存储桶
如果您的 Red Hat Quay 部署配置了外部(拒绝)对象存储,请参阅您的厂商文档,了解如何创建 Quay 存储桶的内容副本。
解码并导出
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)
解码并导出
AWS_SECRET_ACCESS_KEY_ID
:$ 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)
创建新目录并将所有 blob 复制到其中:
$ mkdir blobs $ aws s3 sync --no-verify-ssl --endpoint https://$(oc get route s3 -n openshift-storage -o jsonpath='{.spec.host}') s3://$(oc get cm -l app=noobaa -n <quay-namespace> -o jsonpath='{.items[0].data.BUCKET_NAME}') ./blobs
16.1.4. 扩展 Red Hat Quay 部署备份
对于 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 …
对于 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>
检查 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