4.11. OADP 和 AWS STS


4.11.1. 使用 OADP 在 AWS STS 上备份应用程序

您可以通过安装 OADP Operator,使用 Amazon Web Services (AWS) 安装 OpenShift API for Data Protection (OADP)。Operator 安装 Velero 1.14

注意

从 OADP 1.0.4 开始,所有 OADP 1.0.z 版本只能用作 Migration Toolkit for Containers Operator 的依赖项,且不能作为独立 Operator 提供。

您可以为 Velero 配置 AWS,创建一个默认 Secret,然后安装数据保护应用程序。如需了解更多详细信息,请参阅安装 OADP Operator

要在受限网络环境中安装 OADP Operator,您必须首先禁用默认的 OperatorHub 源并镜像 Operator 目录。详情请参阅在受限网络中使用 Operator Lifecycle Manager

您可以手动在 AWS 安全令牌服务 (AWS STS) 集群上安装 OADP。Amazon AWS 将 AWS STS 作为 Web 服务提供,可让您为用户请求临时的、带有有限权限的凭证。您可以使用 STS 通过 API 调用、AWS 控制台或 AWS 命令行界面(CLI)为可信用户提供临时访问资源。

在为数据保护(OADP)安装 OpenShift API 前,您必须为 OADP 设置角色和策略凭证,以便它可以使用 Amazon Web Services API。

这个过程在以下两个阶段执行:

  1. 准备 AWS 凭证。
  2. 安装 OADP Operator,并为它提供一个 IAM 角色。

4.11.1.1. 为 OADP 准备 AWS STS 凭证

必须准备 Amazon Web Services 帐户,并配置为接受 OpenShift API for Data Protection (OADP) 安装。使用以下步骤准备 AWS 凭证。

流程

  1. 运行以下命令来定义 cluster_name 环境变量:

    $ export CLUSTER_NAME= <AWS_cluster_name> 1
    1
    变量可以设置为任何值。
  2. 运行以下命令,获取cluster 的详情,如 AWS_ACCOUNT_ID, OIDC_ENDPOINT

    $ export CLUSTER_VERSION=$(oc get clusterversion version -o jsonpath='{.status.desired.version}{"\n"}')
    
    export AWS_CLUSTER_ID=$(oc get clusterversion version -o jsonpath='{.spec.clusterID}{"\n"}')
    
    export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o jsonpath='{.spec.serviceAccountIssuer}' | sed 's|^https://||')
    
    export REGION=$(oc get infrastructures cluster -o jsonpath='{.status.platformStatus.aws.region}' --allow-missing-template-keys=false || echo us-east-2)
    
    export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    
    export ROLE_NAME="${CLUSTER_NAME}-openshift-oadp-aws-cloud-credentials"
  3. 运行以下命令,创建一个临时目录来存储所有文件:

    $ export SCRATCH="/tmp/${CLUSTER_NAME}/oadp"
    mkdir -p ${SCRATCH}
  4. 运行以下命令显示所有收集的详细信息:

    $ echo "Cluster ID: ${AWS_CLUSTER_ID}, Region: ${REGION}, OIDC Endpoint:
    ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"
  5. 在 AWS 帐户中,创建一个 IAM 策略以允许访问 AWS S3:

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

      $ export POLICY_NAME="OadpVer1" 1
      1
      变量可以设置为任何值。
      $ POLICY_ARN=$(aws iam list-policies --query "Policies[?PolicyName=='$POLICY_NAME'].{ARN:Arn}" --output text)
    2. 输入以下命令来创建策略 JSON 文件,然后创建策略:

      注意

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

      $ if [[ -z "${POLICY_ARN}" ]]; then
      cat << EOF > ${SCRATCH}/policy.json
      {
      "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 $POLICY_NAME \
      --policy-document file:///${SCRATCH}/policy.json --query Policy.Arn \
      --tags Key=openshift_version,Value=${CLUSTER_VERSION} Key=operator_namespace,Value=openshift-adp Key=operator_name,Value=oadp \
      --output text) 1
      fi
      1
      SCRATCH 是为存储文件创建的临时目录的名称。
    3. 运行以下命令来查看策略 ARN:

      $ echo ${POLICY_ARN}
  6. 为集群创建 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. 运行以下命令,为集群创建 IAM 角色信任策略:

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

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

    $ aws iam attach-role-policy --role-name "${ROLE_NAME}" --policy-arn ${POLICY_ARN}
4.11.1.1.1. 设置 Velero CPU 和内存分配

您可以通过编辑 DataProtectionApplication 自定义资源(CR)清单来为 Velero pod 设置 CPU 和内存分配。

先决条件

  • 您必须安装了 OpenShift API for Data Protection(OADP)Operator。

流程

  • 编辑 DataProtectionApplication CR 清单的 spec.configuration.velero.podConfig.ResourceAllocations 块中的值,如下例所示:

    apiVersion: oadp.openshift.io/v1alpha1
    kind: DataProtectionApplication
    metadata:
      name: <dpa_sample>
    spec:
    ...
      configuration:
        velero:
          podConfig:
            nodeSelector: <node_selector> 1
            resourceAllocations: 2
              limits:
                cpu: "1"
                memory: 1024Mi
              requests:
                cpu: 200m
                memory: 256Mi
    1
    指定要提供给 Velero podSpec 的节点选择器。
    2
    列出的 resourceAllocations 用于平均使用。
注意

Kopia 是 OADP 1.3 及之后的版本中的一个选项。您可以使用 Kopia 进行文件系统备份,Kopia 是 Data Mover 的唯一选择,并带有内置数据 Mover。

和 Restic 相比,Kopia 需要更多资源,您可能需要相应地调整 CPU 和内存要求。

4.11.1.2. 安装 OADP Operator 并提供 IAM 角色

AWS 安全令牌服务 (AWS STS) 是一个全局 Web 服务,它为 IAM 或联邦用户提供简短凭证。本文档论述了如何在 AWS STS 集群中手动安装 OpenShift API for Data Protection (OADP)。

重要

OADP AWS STS 环境中不支持 Restic 和 Kopia。验证 Restic 和 Kopia 节点代理是否已禁用。对于备份卷,AWS STS 上的 OADP 仅支持原生快照和 Container Storage Interface (CSI) 快照。

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

AWS STS 集群目前不支持 Data Mover 功能。您可以使用原生 AWS S3 工具移动数据。

先决条件

  • 具有所需访问权限和令牌的 OpenShift Container Platform AWS STS 集群。具体步骤请查看为 OADP 准备 AWS 凭证。如果您计划使用两个不同的集群来备份和恢复,您必须为每个集群准备 AWS 凭证,包括 ROLE_ARN

流程

  1. 输入以下命令,从 AWS 令牌文件创建 OpenShift Container Platform secret:

    1. 创建凭证文件:

      $ cat <<EOF > ${SCRATCH}/credentials
        [default]
        role_arn = ${ROLE_ARN}
        web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
      EOF
    2. 为 OADP 创建命名空间:

      $ oc create namespace openshift-adp
    3. 创建 OpenShift Container Platform secret:

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

      在 OpenShift Container Platform 版本 4.14 及更新的版本中,OADP Operator 通过 Operator Lifecycle Manager (OLM) 和 Cloud Credentials Operator (CCO)支持新的标准化 STS 工作流。在此工作流中,您不需要创建上述 secret,您需要在使用 OpenShift Container Platform Web 控制台安装 OLM 管理的 Operator 时提供角色 ARN,请参阅使用 Web 控制台从 OperatorHub 安装

      前面的 secret 由 CCO 自动创建。

  2. 安装 OADP Operator:

    1. 在 OpenShift Container Platform Web 控制台中,浏览 Operators OperatorHub
    2. 搜索 OADP Operator
    3. role_ARN 字段中,粘贴之前创建的 role_arn,再点 Install
  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

    如果要备份的应用程序或应用程序都使用带有 Container Storage Interface (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
      如果您不想使用镜像备份,请将此字段设置为 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
    如果您不想使用镜像备份,请将此字段设置为 false
    2
    请参阅有关 nodeAgent 属性的重要备注。
    3
    credentialsFile 字段是 pod 上存储桶凭证的挂载位置。
    4
    enableSharedConfig 字段允许 snapshotLocations 共享或重复使用为存储桶定义的凭证。
    5
    使用 AWS 凭证文件中设置的配置集名称。
    6
    region 指定为您的 AWS 区域。这必须与集群区域相同。

    现在,您可以备份和恢复 OpenShift Container Platform 应用程序,如 备份应用程序 中所述。

重要

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

nodeAgent:
  enable: false
  uploaderType: restic

使用以下配置:

restic:
  enable: false

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

4.11.1.3. 备份 OADP AWS STS 上的工作负载,可以使用可选的清理

4.11.1.3.1. 使用 OADP 和 AWS STS 执行备份

以下示例 hello-world 应用没有附加持久性卷 (PV)。使用 OpenShift API 对 Amazon Web Services (AWS STS) 的数据保护 (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. 运行以下命令来删除 demo 工作负载:

    $ 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. 运行以下命令等待 Restore 完成:

    $ 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 团队的 故障排除文档

4.11.1.3.2. 在使用 OADP 和 AWS STS 备份后清理集群

如果您需要卸载 OpenShift API for Data Protection (OADP) Operator 以及本例中的备份和 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. 如果不再需要 Operator,请运行以下命令删除它:

    $ oc -n openshift-adp delete subscription oadp-operator
  5. 运行以下命令,从 Operator 中删除命名空间:

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

    $ oc delete backup 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}"
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.