×

您可以将OpenShift API for Data Protection (OADP)与Red Hat OpenShift Service on AWS (ROSA)集群一起使用,以备份和恢复应用程序数据。

ROSA是一个完全托管的、交钥匙的应用程序平台,允许您通过构建和部署应用程序为客户创造价值。

ROSA与各种Amazon Web Services (AWS)计算、数据库、分析、机器学习、网络、移动和其他服务无缝集成,从而加快构建和交付与众不同的客户体验。

您可以直接从您的AWS账户订阅该服务。

创建集群后,您可以使用OpenShift Container Platform Web控制台或通过Red Hat OpenShift集群管理器操作集群。您还可以将ROSA与OpenShift API和命令行界面 (CLI) 工具一起使用。

有关ROSA安装的更多信息,请参见安装Red Hat OpenShift Service on AWS (ROSA)交互式演练

在安装OpenShift API for Data Protection (OADP)之前,必须为OADP设置角色和策略凭据,以便它可以使用Amazon Web Services API。

此过程分为以下两个阶段

  1. 准备AWS凭据

  2. 安装OADP Operator并赋予其IAM角色

准备OADP的AWS凭据

必须准备和配置一个Amazon Web Services账户以接受OpenShift API for Data Protection (OADP)安装。

步骤
  1. 通过运行以下命令创建以下环境变量

    更改集群名称以匹配您的ROSA集群,并确保您已以管理员身份登录到集群。在继续之前,请确保所有字段都正确输出。

    $ export CLUSTER_NAME=my-cluster (1)
      export ROSA_CLUSTER_ID=$(rosa describe cluster -c ${CLUSTER_NAME} --output json | jq -r .id)
      export REGION=$(rosa describe cluster -c ${CLUSTER_NAME} --output json | jq -r .region.id)
      export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o jsonpath='{.spec.serviceAccountIssuer}' | sed 's|^https://||')
      export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
      export CLUSTER_VERSION=$(rosa describe cluster -c ${CLUSTER_NAME} -o json | jq -r .version.raw_id | cut -f -2 -d '.')
      export ROLE_NAME="${CLUSTER_NAME}-openshift-oadp-aws-cloud-credentials"
      export SCRATCH="/tmp/${CLUSTER_NAME}/oadp"
      mkdir -p ${SCRATCH}
      echo "Cluster ID: ${ROSA_CLUSTER_ID}, Region: ${REGION}, OIDC Endpoint:
      ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"
    1 my-cluster替换为您的ROSA集群名称。
  2. 在AWS账户上,创建一个IAM策略以允许访问AWS S3

    1. 运行以下命令检查策略是否存在

      $ POLICY_ARN=$(aws iam list-policies --query "Policies[?PolicyName=='RosaOadpVer1'].{ARN:Arn}" --output text) (1)
      1 RosaOadp替换为您的策略名称。
    2. 输入以下命令以创建策略JSON文件,然后在ROSA中创建策略

      如果找不到策略ARN,则该命令会创建策略。如果策略ARN已存在,则if语句会故意跳过策略创建。

      $ if [[ -z "${POLICY_ARN}" ]]; then
        cat << EOF > ${SCRATCH}/policy.json (1)
        {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "s3:CreateBucket",
              "s3:DeleteBucket",
              "s3:PutBucketTagging",
              "s3:GetBucketTagging",
              "s3:PutEncryptionConfiguration",
              "s3:GetEncryptionConfiguration",
              "s3:PutLifecycleConfiguration",
              "s3:GetLifecycleConfiguration",
              "s3:GetBucketLocation",
              "s3:ListBucket",
              "s3:GetObject",
              "s3:PutObject",
              "s3:DeleteObject",
              "s3:ListBucketMultipartUploads",
              "s3:AbortMultipartUpload",
              "s3:ListMultipartUploadParts",
              "ec2:DescribeSnapshots",
              "ec2:DescribeVolumes",
              "ec2:DescribeVolumeAttribute",
              "ec2:DescribeVolumesModifications",
              "ec2:DescribeVolumeStatus",
              "ec2:CreateTags",
              "ec2:CreateVolume",
              "ec2:CreateSnapshot",
              "ec2:DeleteSnapshot"
            ],
            "Resource": "*"
          }
        ]}
      EOF
      
        POLICY_ARN=$(aws iam create-policy --policy-name "RosaOadpVer1" \
        --policy-document file:///${SCRATCH}/policy.json --query Policy.Arn \
        --tags Key=rosa_openshift_version,Value=${CLUSTER_VERSION} Key=rosa_role_prefix,Value=ManagedOpenShift Key=operator_namespace,Value=openshift-oadp Key=operator_name,Value=openshift-oadp \
        --output text)
        fi
      1 SCRATCH是为环境变量创建的临时目录的名称。
    3. 运行以下命令查看策略ARN

      $ echo ${POLICY_ARN}
  3. 为集群创建一个IAM角色信任策略

    1. 运行以下命令创建信任策略文件

      $ cat <<EOF > ${SCRATCH}/trust-policy.json
        {
            "Version": "2012-10-17",
            "Statement": [{
              "Effect": "Allow",
              "Principal": {
                "Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/${OIDC_ENDPOINT}"
              },
              "Action": "sts:AssumeRoleWithWebIdentity",
              "Condition": {
                "StringEquals": {
                  "${OIDC_ENDPOINT}:sub": [
                    "system:serviceaccount:openshift-adp:openshift-adp-controller-manager",
                    "system:serviceaccount:openshift-adp:velero"]
                }
              }
            }]
        }
      EOF
    2. 运行以下命令创建角色

      $ ROLE_ARN=$(aws iam create-role --role-name \
        "${ROLE_NAME}" \
        --assume-role-policy-document file://${SCRATCH}/trust-policy.json \
        --tags Key=rosa_cluster_id,Value=${ROSA_CLUSTER_ID} \
               Key=rosa_openshift_version,Value=${CLUSTER_VERSION} \
               Key=rosa_role_prefix,Value=ManagedOpenShift \
               Key=operator_namespace,Value=openshift-adp \
               Key=operator_name,Value=openshift-oadp \
        --query Role.Arn --output text)
    3. 运行以下命令查看角色ARN

      $ echo ${ROLE_ARN}
  4. 运行以下命令将IAM策略附加到IAM角色

    $ aws iam attach-role-policy --role-name "${ROLE_NAME}" \
      --policy-arn ${POLICY_ARN}

安装OADP Operator并提供IAM角色

AWS 安全令牌服务 (AWS STS) 是一种全球性的 Web 服务,它为 IAM 用户或联合用户提供短期凭据。使用 STS 的 OpenShift Container Platform (ROSA) 是 ROSA 集群的推荐凭据模式。本文档描述了如何在使用 AWS STS 的 ROSA 上安装 OpenShift API for Data Protection (OADP)。

Restic 不受支持。

备份不具有容器存储接口 (CSI) 快照支持的文件系统时,支持 Kopia 文件系统备份 (FSB)。

示例文件系统包括:

  • Amazon Elastic File System (EFS)

  • 网络文件系统 (NFS)

  • emptyDir

  • 本地卷

对于备份卷,使用 AWS STS 的 ROSA 上的 OADP 仅支持原生快照和容器存储接口 (CSI) 快照。

在使用 STS 身份验证的 Amazon ROSA 集群中,不支持在不同的 AWS 区域恢复备份的数据。

数据移动器功能目前在 ROSA 集群中不受支持。您可以使用原生的 AWS S3 工具来移动数据。

先决条件
  • 具有所需访问权限和令牌的 OpenShift Container Platform ROSA 集群。有关说明,请参阅之前的步骤 *为 OADP 准备 AWS 凭据*。如果您计划使用两个不同的集群进行备份和恢复,则必须为每个集群准备 AWS 凭据,包括ROLE_ARN

步骤
  1. 通过输入以下命令,从您的 AWS 令牌文件创建 OpenShift Container Platform 密钥:

    1. 创建凭据文件

      $ cat <<EOF > ${SCRATCH}/credentials
        [default]
        role_arn = ${ROLE_ARN}
        web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
        region = <aws_region> (1)
      EOF
      1 已创建云资源的 AWS 区域。
    2. 为 OADP 创建命名空间

      $ oc create namespace openshift-adp
    3. 创建 OpenShift Container Platform 密钥

      $ oc -n openshift-adp create secret generic cloud-credentials \
        --from-file=${SCRATCH}/credentials

      在 OpenShift Container Platform 4.15 及更高版本中,OADP 运算符通过运算符生命周期管理器 (OLM) 和云凭据运算符 (CCO) 支持新的标准化 STS 工作流程。在此工作流程中,您无需创建上述密钥,只需在使用 OpenShift Container Platform Web 控制台安装 OLM 管理的运算符时提供角色 ARN 即可,有关更多信息,请参阅 *使用 Web 控制台从 OperatorHub 安装*。

      CCO 会自动创建上述密钥。

  2. 安装 OADP 运算符

    1. 在 OpenShift Container Platform Web 控制台中,浏览到 **运算符** → **OperatorHub**。

    2. 搜索 **OADP 运算符**。

    3. 在 **role_ARN** 字段中,粘贴您之前创建的 role_arn,然后单击 **安装**。

  3. 通过输入以下命令创建使用您的 AWS 凭据的 AWS 云存储:

    $ cat << EOF | oc create -f -
      apiVersion: oadp.openshift.io/v1alpha1
      kind: CloudStorage
      metadata:
        name: ${CLUSTER_NAME}-oadp
        namespace: openshift-adp
      spec:
        creationSecret:
          key: credentials
          name: cloud-credentials
        enableSharedConfig: true
        name: ${CLUSTER_NAME}-oadp
        provider: aws
        region: $REGION
    EOF
  4. 通过输入以下命令检查应用程序的存储默认存储类:

    $ oc get pvc -n <namespace>
    示例输出
    NAME     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    applog   Bound    pvc-351791ae-b6ab-4e8b-88a4-30f73caf5ef8   1Gi        RWO            gp3-csi        4d19h
    mysql    Bound    pvc-16b8e009-a20a-4379-accc-bc81fedd0621   1Gi        RWO            gp3-csi        4d19h
  5. 运行以下命令获取存储类:

    $ oc get storageclass
    示例输出
    NAME                PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    gp2                 kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   true                   4d21h
    gp2-csi             ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   4d21h
    gp3                 ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   4d21h
    gp3-csi (default)   ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   4d21h

    以下存储类将有效:

    • gp3-csi

    • gp2-csi

    • gp3

    • gp2

    如果要备份的应用程序全部使用具有容器存储接口 (CSI) 的持久卷 (PV),建议在 OADP DPA 配置中包含 CSI 插件。

  6. 创建DataProtectionApplication 资源以配置与存储备份和卷快照的连接

    1. 如果您仅使用 CSI 卷,请通过输入以下命令部署数据保护应用程序:

      $ cat << EOF | oc create -f -
        apiVersion: oadp.openshift.io/v1alpha1
        kind: DataProtectionApplication
        metadata:
          name: ${CLUSTER_NAME}-dpa
          namespace: openshift-adp
        spec:
          backupImages: true (1)
          features:
            dataMover:
              enable: false
          backupLocations:
          - bucket:
              cloudStorageRef:
                name: ${CLUSTER_NAME}-oadp
              credential:
                key: credentials
                name: cloud-credentials
              prefix: velero
              default: true
              config:
                region: ${REGION}
          configuration:
            velero:
              defaultPlugins:
              - openshift
              - aws
              - csi
            restic:
              enable: false
      EOF
      1 ROSA 支持内部镜像备份。如果您不想使用镜像备份,请将此字段设置为false
  1. 如果您使用 CSI 卷或非 CSI 卷,请通过输入以下命令部署数据保护应用程序:

    $ cat << EOF | oc create -f -
      apiVersion: oadp.openshift.io/v1alpha1
      kind: DataProtectionApplication
      metadata:
        name: ${CLUSTER_NAME}-dpa
        namespace: openshift-adp
      spec:
        backupImages: true (1)
        features:
          dataMover:
             enable: false
        backupLocations:
        - bucket:
            cloudStorageRef:
              name: ${CLUSTER_NAME}-oadp
            credential:
              key: credentials
              name: cloud-credentials
            prefix: velero
            default: true
            config:
              region: ${REGION}
        configuration:
          velero:
            defaultPlugins:
            - openshift
            - aws
          nodeAgent: (2)
            enable: false
            uploaderType: restic
        snapshotLocations:
          - velero:
              config:
                credentialsFile: /tmp/credentials/openshift-adp/cloud-credentials-credentials (3)
                enableSharedConfig: "true" (4)
                profile: default (5)
                region: ${REGION} (6)
              provider: aws
    EOF
    1 ROSA 支持内部镜像备份。如果您不想使用镜像备份,请将此字段设置为 false。
    2 请参阅关于nodeAgent 属性的重要说明。
    3 credentialsFile 字段是 pod 上存储桶凭据的挂载位置。
    4 enableSharedConfig 字段允许snapshotLocations共享或重用为存储桶定义的凭据。
    5 使用 AWS 凭据文件中设置的配置文件名称。
    6 region指定为您的 AWS 区域。这必须与集群区域相同。

    您现在可以根据 *备份应用程序* 中的描述备份和恢复 OpenShift Container Platform 应用程序。

在此配置中,resticenable参数设置为false,因为 OADP 不支持 ROSA 环境中的 Restic。

如果您使用 OADP 1.2,请替换此配置

nodeAgent:
  enable: false
  uploaderType: restic

为以下配置

restic:
  enable: false

如果您要使用两个不同的集群进行备份和恢复,则这两个集群必须在云存储 CR 和 OADP DataProtectionApplication 配置中具有相同的 AWS S3 存储名称。

示例:在 OADP ROSA STS 上备份工作负载,并可选地进行清理

使用 OADP 和 ROSA STS 执行备份

以下示例hello-world应用程序没有附加任何持久卷 (PV)。使用 Red Hat OpenShift Service on AWS (ROSA) STS 和 OpenShift API for Data Protection (OADP) 执行备份。

任一数据保护应用程序 (DPA) 配置均有效。

  1. 通过运行以下命令创建要备份的工作负载:

    $ oc create namespace hello-world
    $ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift
  2. 通过运行以下命令公开路由:

    $ oc expose service/hello-openshift -n hello-world
  3. 通过运行以下命令检查应用程序是否正常运行:

    $ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`
    示例输出
    Hello OpenShift!
  4. 通过运行以下命令备份工作负载:

    $ cat << EOF | oc create -f -
      apiVersion: velero.io/v1
      kind: Backup
      metadata:
        name: hello-world
        namespace: openshift-adp
      spec:
        includedNamespaces:
        - hello-world
        storageLocation: ${CLUSTER_NAME}-dpa-1
        ttl: 720h0m0s
    EOF
  5. 等待备份完成,然后运行以下命令:

    $ watch "oc -n openshift-adp get backup hello-world -o json | jq .status"
    示例输出
    {
      "completionTimestamp": "2022-09-07T22:20:44Z",
      "expiration": "2022-10-07T22:20:22Z",
      "formatVersion": "1.1.0",
      "phase": "Completed",
      "progress": {
        "itemsBackedUp": 58,
        "totalItems": 58
      },
      "startTimestamp": "2022-09-07T22:20:22Z",
      "version": 1
    }
  6. 通过运行以下命令删除演示工作负载:

    $ oc delete ns hello-world
  7. 通过运行以下命令从备份中恢复工作负载:

    $ cat << EOF | oc create -f -
      apiVersion: velero.io/v1
      kind: Restore
      metadata:
        name: hello-world
        namespace: openshift-adp
      spec:
        backupName: hello-world
    EOF
  8. 等待恢复完成,然后运行以下命令:

    $ watch "oc -n openshift-adp get restore hello-world -o json | jq .status"
    示例输出
    {
      "completionTimestamp": "2022-09-07T22:25:47Z",
      "phase": "Completed",
      "progress": {
        "itemsRestored": 38,
        "totalItems": 38
      },
      "startTimestamp": "2022-09-07T22:25:28Z",
      "warnings": 9
    }
  9. 通过运行以下命令检查工作负载是否已恢复:

    $ oc -n hello-world get pods
    示例输出
    NAME                              READY   STATUS    RESTARTS   AGE
    hello-openshift-9f885f7c6-kdjpj   1/1     Running   0          90s
  10. 通过运行以下命令检查 JSONPath:

    $ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`
    示例输出
    Hello OpenShift!

有关故障排除技巧,请参阅 OADP 团队的 故障排除文档

使用 OADP 和 ROSA STS 备份后清理集群

如果您需要卸载 OpenShift API for Data Protection (OADP) 运算符以及备份和此示例中的 S3 存储桶,请按照以下说明操作。

步骤
  1. 通过运行以下命令删除工作负载:

    $ oc delete ns hello-world
  2. 通过运行以下命令删除数据保护应用程序 (DPA):

    $ oc -n openshift-adp delete dpa ${CLUSTER_NAME}-dpa
  3. 通过运行以下命令删除云存储:

    $ oc -n openshift-adp delete cloudstorage ${CLUSTER_NAME}-oadp

    如果此命令挂起,您可能需要通过运行以下命令删除终结器:

    $ oc -n openshift-adp patch cloudstorage ${CLUSTER_NAME}-oadp -p '{"metadata":{"finalizers":null}}' --type=merge
  4. 如果不再需要运算符,请通过运行以下命令将其删除:

    $ oc -n openshift-adp delete subscription oadp-operator
  5. 从运算符中删除命名空间

    $ oc delete ns openshift-adp
  6. 如果不再需要备份和恢复资源,请运行以下命令将其从集群中删除

    $ oc delete backups.velero.io hello-world
  7. 要删除 AWS S3 中的备份、恢复和远程对象,请运行以下命令

    $ velero backup delete hello-world
  8. 如果您不再需要自定义资源定义 (CRD),请运行以下命令将其从集群中删除

    $ for CRD in `oc get crds | grep velero | awk '{print $1}'`; do oc delete crd $CRD; done
  9. 运行以下命令删除 AWS S3 存储桶

    $ aws s3 rm s3://${CLUSTER_NAME}-oadp --recursive
    $ aws s3api delete-bucket --bucket ${CLUSTER_NAME}-oadp
  10. 运行以下命令将策略与角色分离

    $ aws iam detach-role-policy --role-name "${ROLE_NAME}"  --policy-arn "${POLICY_ARN}"
  11. 运行以下命令删除角色

    $ aws iam delete-role --role-name "${ROLE_NAME}"