$ export CLUSTER_NAME= <AWS_cluster_name> (1)
您可以通过安装 OADP 运算符来安装带有 Amazon Web Services (AWS) 的 OpenShift API for Data Protection (OADP)。该运算符安装 Velero 1.14。
从 OADP 1.0.4 开始,所有 OADP 1.0.z 版本只能用作容器迁移工具包运算符的依赖项,不能作为独立运算符使用。 |
您可以为 Velero 配置 AWS,创建一个默认的 Secret
,然后安装数据保护应用程序。有关更多详细信息,请参阅 安装 OADP 运算符。
要在受限网络环境中安装 OADP 运算符,您必须首先禁用默认的 OperatorHub 源并镜像 Operator 目录。有关详细信息,请参阅 在断开连接的环境中使用 Operator Lifecycle Manager。
您可以手动在 AWS 安全令牌服务 (STS) (AWS STS) 集群上安装 OADP。Amazon AWS 提供 AWS STS 作为一种 Web 服务,使您可以为用户请求具有临时、有限权限的凭据。您可以使用 STS 通过 API 调用、AWS 控制台或 AWS 命令行界面 (CLI) 为受信任的用户提供对资源的临时访问权限。
在安装 OpenShift API for Data Protection (OADP) 之前,您必须为 OADP 设置角色和策略凭据,以便它可以使用 Amazon Web Services API。
此过程分以下两个阶段执行
准备 AWS 凭据。
安装 OADP 运算符并为其提供 IAM 角色。
必须准备和配置 Amazon Web Services 帐户以接受 OpenShift API for Data Protection (OADP) 安装。请使用以下步骤准备 AWS 凭据。
通过运行以下命令定义 cluster_name
环境变量
$ export CLUSTER_NAME= <AWS_cluster_name> (1)
1 | 该变量可以设置为任何值。 |
通过运行以下命令检索 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"
通过运行以下命令创建一个临时目录来存储所有文件
$ export SCRATCH="/tmp/${CLUSTER_NAME}/oadp"
mkdir -p ${SCRATCH}
通过运行以下命令显示所有收集的详细信息
$ echo "Cluster ID: ${AWS_CLUSTER_ID}, Region: ${REGION}, OIDC Endpoint:
${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"
在 AWS 帐户上,创建允许访问 AWS S3 的 IAM 策略
运行以下命令检查策略是否存在
$ export POLICY_NAME="OadpVer1" (1)
1 | 该变量可以设置为任何值。 |
$ POLICY_ARN=$(aws iam list-policies --query "Policies[?PolicyName=='$POLICY_NAME'].{ARN:Arn}" --output text)
输入以下命令以创建策略 JSON 文件,然后创建策略
如果找不到策略 ARN,则该命令将创建策略。如果策略 ARN 已存在,则 |
$ 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 是为存储文件而创建的临时目录的名称。 |
运行以下命令查看策略 ARN
$ echo ${POLICY_ARN}
为集群创建 IAM 角色信任策略
通过运行以下命令创建信任策略文件
$ 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
通过运行以下命令为集群创建 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)
运行以下命令查看角色 ARN
$ echo ${ROLE_ARN}
运行以下命令将 IAM 策略附加到 IAM 角色
$ aws iam attach-role-policy --role-name "${ROLE_NAME}" --policy-arn ${POLICY_ARN}
您可以通过编辑DataProtectionApplication
自定义资源 (CR) 清单来设置Velero
pod 的 CPU 和内存资源分配。
您必须已安装用于数据保护的 OpenShift API (OADP) 运算符。
编辑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 是您唯一的选项。 Kopia 比 Restic 更资源密集型,您可能需要相应地调整 CPU 和内存需求。 |
AWS 安全令牌服务 (AWS STS) 是一种全局 Web 服务,它为 IAM 或联合用户提供短期凭据。本文档介绍如何手动在 AWS STS 集群上安装用于数据保护的 OpenShift API (OADP)。
在 OADP AWS STS 环境中不支持 Restic 和 Kopia。验证 Restic 和 Kopia 节点代理是否已禁用。对于备份卷,OADP 在 AWS STS 上仅支持原生快照和容器存储接口 (CSI) 快照。 在使用 STS 身份验证的 AWS 集群中,不支持在不同的 AWS 区域还原备份数据。 数据移动器功能当前在 AWS STS 集群中不受支持。您可以使用原生 AWS S3 工具移动数据。 |
具有所需访问权限和令牌的 OpenShift Container Platform AWS STS 集群。有关说明,请参见之前的步骤“为 OADP 准备 AWS 凭据”。如果您计划使用两个不同的集群进行备份和还原,则必须为每个集群准备 AWS 凭据,包括ROLE_ARN
。
通过输入以下命令从您的 AWS 令牌文件创建 OpenShift Container Platform 密钥
创建凭据文件
$ cat <<EOF > ${SCRATCH}/credentials
[default]
role_arn = ${ROLE_ARN}
web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
EOF
为 OADP 创建命名空间
$ oc create namespace openshift-adp
创建 OpenShift Container Platform 密钥
$ oc -n openshift-adp create secret generic cloud-credentials \
--from-file=${SCRATCH}/credentials
在 OpenShift Container Platform 4.14 及更高版本中,OADP 运算符通过运算符生命周期管理器 (OLM) 和云凭据运算符 (CCO) 支持新的标准化 STS 工作流。在此工作流中,您无需创建上述密钥,只需在使用 OpenShift Container Platform Web 控制台安装 OLM 管理的运算符时提供角色 ARN,有关详细信息,请参见“使用 Web 控制台从 OperatorHub 安装”。 CCO 会自动创建上述密钥。 |
安装 OADP 运算符
在 OpenShift Container Platform Web 控制台中,浏览到**运算符**→**OperatorHub**。
搜索**OADP 运算符**。
在**role_ARN**字段中,粘贴您之前创建的 role_arn,然后单击**安装**。
通过输入以下命令使用您的 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
通过输入以下命令检查应用程序的存储默认存储类
$ 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
运行以下命令获取存储类
$ 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
以下存储类将有效
|
如果正在备份的所有应用程序都使用具有容器存储接口 (CSI) 的持久卷 (PV),建议在 OADP DPA 配置中包含 CSI 插件。
创建DataProtectionApplication
资源以配置与存储备份和卷快照的存储的连接
如果您只使用 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 。 |
如果您使用 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,请替换此配置
使用以下配置
|
如果您想使用两个不同的集群进行备份和还原,则这两个集群必须在云存储 CR 和 OADP DataProtectionApplication
配置中具有相同的 AWS S3 存储名称。
以下示例hello-world
应用程序没有附加持久卷 (PV)。使用 Amazon Web Services (AWS) (AWS STS) 使用 OpenShift API for Data Protection (OADP) 执行备份。
任一数据保护应用程序 (DPA) 配置均有效。
运行以下命令创建要备份的工作负载
$ oc create namespace hello-world
$ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift
运行以下命令公开路由
$ oc expose service/hello-openshift -n hello-world
运行以下命令检查应用程序是否正常工作
$ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`
Hello OpenShift!
运行以下命令备份工作负载
$ 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
等待备份完成,然后运行以下命令
$ 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
}
运行以下命令删除演示工作负载
$ oc delete ns hello-world
运行以下命令从备份还原工作负载
$ cat << EOF | oc create -f -
apiVersion: velero.io/v1
kind: Restore
metadata:
name: hello-world
namespace: openshift-adp
spec:
backupName: hello-world
EOF
运行以下命令等待还原完成
$ 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
}
运行以下命令检查工作负载是否已还原
$ oc -n hello-world get pods
NAME READY STATUS RESTARTS AGE
hello-openshift-9f885f7c6-kdjpj 1/1 Running 0 90s
运行以下命令检查 JSONPath
$ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`
Hello OpenShift!
有关故障排除技巧,请参见 OADP 团队的故障排除文档。 |
如果您需要卸载本示例中的 OpenShift 数据保护 API (OADP) 运算符以及备份和 S3 存储桶,请按照以下说明操作。
运行以下命令删除工作负载
$ oc delete ns hello-world
运行以下命令删除数据保护应用程序 (DPA)
$ oc -n openshift-adp delete dpa ${CLUSTER_NAME}-dpa
运行以下命令删除云存储
$ oc -n openshift-adp delete cloudstorage ${CLUSTER_NAME}-oadp
如果此命令挂起,您可能需要运行以下命令删除最终器
|
如果不再需要运算符,请运行以下命令将其删除
$ oc -n openshift-adp delete subscription oadp-operator
运行以下命令从运算符中删除命名空间
$ oc delete ns openshift-adp
如果不再需要备份和恢复资源,请运行以下命令将其从集群中删除
$ oc delete backups.velero.io hello-world
要删除 AWS S3 中的备份、恢复和远程对象,请运行以下命令
$ velero backup delete hello-world
如果您不再需要自定义资源定义 (CRD),请运行以下命令将其从集群中删除
$ for CRD in `oc get crds | grep velero | awk '{print $1}'`; do oc delete crd $CRD; done
运行以下命令删除 AWS S3 存储桶
$ aws s3 rm s3://${CLUSTER_NAME}-oadp --recursive
$ aws s3api delete-bucket --bucket ${CLUSTER_NAME}-oadp
运行以下命令将策略与角色分离
$ aws iam detach-role-policy --role-name "${ROLE_NAME}" --policy-arn "${POLICY_ARN}"
运行以下命令删除角色
$ aws iam delete-role --role-name "${ROLE_NAME}"