Registry 数据备份和恢复

概述

当 registry 镜像数据存储在 S3 兼容对象存储中时,可使用此操作步骤对 Registry 数据进行备份和恢复。

此恢复模型将存储在 S3 中的镜像数据与 Kubernetes ModuleInfo 自定义资源中定义的 Cluster Plugin 配置分离开来。

  • 备份:从 ModuleInfo 资源中获取 S3 配置,并备份指定存储桶中的数据。
  • 恢复:在新集群或修复后的集群中安装 Cluster Plugin 后,更新 ModuleInfo 资源中的 S3 配置,使其指向包含已恢复数据的存储桶。

这种模型使数据备份和恢复独立于 Cluster Plugin 的部署和升级操作。所有连接信息都通过声明式 ModuleInfo 资源进行管理。

前提条件

  • 已具备 kubectl 访问权限,并拥有在目标 Kubernetes 集群上执行操作的适当权限。
  • 已具备用于访问和操作镜像数据所使用的 S3 兼容存储的凭据和客户端工具(例如 awscli、rclone、minio-client)。
  • 已安装并配置 Registry Cluster Plugin,且其 ModuleInfo 资源已存在并处于健康状态。
  • 已准备好独立且容量充足的存储用于备份数据(例如另一个 S3 存储桶)。

数据备份

在备份过程中,获取当前生产环境的 S3 配置,并对存储桶中的镜像数据执行完整备份。

第 1 步:获取当前 S3 配置

从管理 Registry Cluster Plugin 的 ModuleInfo 资源中提取 S3 存储配置。
此信息是执行备份操作的基础。

global 集群上运行以下命令:

# 1. Identify the ModuleInfo resource name for the image-registry module
MODULE_INFO_NAME=$(kubectl get moduleinfo -l cpaas.io/module-name=image-registry -o jsonpath='{.items[0].metadata.name}')
echo "Target ModuleInfo Resource: $MODULE_INFO_NAME"

# 2. Extract key S3 configuration information
S3_BUCKET=$(kubectl get moduleinfo $MODULE_INFO_NAME -o jsonpath='{.spec.config.s3storage.bucket}')
S3_ENDPOINT=$(kubectl get moduleinfo $MODULE_INFO_NAME -o jsonpath='{.spec.config.s3storage.regionEndpoint}')
S3_REGION=$(kubectl get moduleinfo $MODULE_INFO_NAME -o jsonpath='{.spec.config.s3storage.region}')
S3_SECRET_NAME=$(kubectl get moduleinfo $MODULE_INFO_NAME -o jsonpath='{.spec.config.s3storage.secretName}')

# 3. Obtain access keys from the Secret (typically access-key-id and secret-access-key)
# Note: The output is Base64 encoded and needs to be decoded accordingly.
kubectl get secret -n cpaas-system $S3_SECRET_NAME -o jsonpath='{.data}'

关键变量说明

  • S3_BUCKET:实际存储镜像数据的源存储桶名称。
  • S3_ENDPOINT:连接 S3 兼容服务的端点 URL。
  • S3_REGION:S3 服务的地域标识符。
  • S3_SECRET_NAME:存储认证密钥的 Kubernetes Secret 名称。

第 2 步:执行 S3 存储桶数据备份

使用任意 S3 客户端工具,结合上一步获取的配置,对源存储桶数据执行完整备份。

使用以下备份逻辑:

  • 使用端点($S3_ENDPOINT)、地域($S3_REGION),以及从 Secret 解码得到的 access key 和 secret key 配置客户端。
  • 执行 sync 或 copy 命令,将源存储桶($S3_BUCKET)中的所有数据备份到已准备好的独立备份位置(例如另一个 S3 存储桶或路径)。
  • 记录备份时间戳、所使用的存储桶名称和端点,并将这些信息与备份文件一起归档。

数据恢复

在恢复之前,请先在目标环境中安装 Registry Cluster Plugin,例如新集群或修复后的集群。然后修改配置,使 registry 能够访问已恢复的镜像数据。

第 1 步:准备备份数据

使用任意 S3 客户端工具,将已备份的镜像数据恢复到一个明确可访问的目标 S3 存储 bucket 中。例如,可恢复到名为 registry-bucket-restored 的新存储桶中。确保你对该目标存储桶具有写权限。

第 2 步:更新 ModuleInfo 配置

恢复的关键在于更新新 cluster pluginModuleInfo 资源,使其 S3 配置指向包含备份数据的目标存储桶。

  1. 确定新的 S3 连接信息

    • NEW_BUCKET:已恢复备份数据的目标存储桶名称(例如,registry-bucket-restored)。
    • NEW_ENDPOINT目标 S3 服务的端点。如果 S3 服务地址与备份时相同,则保持不变。
    • NEW_REGION目标 S3 服务的地域
    • NEW_SECRET_NAME:具有对目标存储桶读/写权限的 Kubernetes Secret 名称。如果 access key 未更改,则仍为 $S3_SECRET_NAME
  2. 更新 ModuleInfo 资源

    使用 kubectl patch 命令直接更新 ModuleInfo 的 S3 配置部分。平台控制器将自动将此更改同步到所有相关的 Deployment、Pod 及其他资源。

    # Execute the configuration update
    kubectl patch moduleinfo $MODULE_INFO_NAME --type=merge -p '{
      "spec": {
        "config": {
          "s3storage": {
            "bucket": "'"$NEW_BUCKET"'",
            "regionEndpoint": "'"$NEW_ENDPOINT"'",
            "region": "'"$NEW_REGION"'",
            "secretName": "'"$NEW_SECRET_NAME"'"
          }
        }
      }
    }'

要点:此操作会触发 Registry Pods 的滚动更新。新启动的 Pods 将使用新配置连接到指定的目标存储桶。

验证

更新完成后,请按照以下步骤验证数据恢复是否成功以及服务是否正常运行。

检查 global 集群中的模块状态

# Check if Pods have successfully restarted and are running with the new configuration
kubectl get pods -n cpaas-system -l app=image-registry
# Observe Pod logs to confirm no S3 connection errors
kubectl logs -n cpaas-system -l app=image-registry -c registry --tail=50

验证数据访问(API 测试)

使用 Registry 的 API 接口直接验证其是否能够读取已恢复的镜像数据。

# Obtain the Registry Service access address (assuming ClusterIP type)
REGISTRY_SVC_IP=$(kubectl get svc -n cpaas-system image-registry -o jsonpath='{.spec.clusterIP}')

# Test 1: Query the catalog of repositories
curl -s http://$REGISTRY_SVC_IP/v2/_catalog | jq .
# Expected success return: {"repositories":["image1","image2",...]}

# Test 2: Query the tag list for a specific image (e.g., an image named `myns/nginx`)
curl -s http://$REGISTRY_SVC_IP/v2/myns/nginx/tags/list | jq .
# Expected success return: {"name":"myns/nginx","tags":["v1.0","latest",...]}

功能测试

尝试从已恢复的 registry 中拉取一个已知镜像,或向其中推送一个新镜像,以完整验证读/写功能。

其他存储后端

本操作步骤以 S3 存储为示例。在具备相应备份和恢复工具的情况下,相同的恢复模型也可应用于 Registry 支持的其他存储后端,例如本地文件系统、StorageClass 或 NAS。

无论存储类型如何,首先都应从 ModuleInfo 资源中对应的配置块(例如 s3storagepersistence)提取存储连接参数。然后使用适当的存储工具备份数据。在恢复期间,将数据恢复到目标位置,并更新 ModuleInfo 中对应的配置字段,使新部署的 registry 实例使用该位置。