Velero 备份集群资源
先决条件
为了能够执行后续步骤,您需要具备以下先决条件:
eksctl
v0.58 或更高版本。请参阅安装或升级 eksctl。同一个 AWS 账户中的两个 EKS 集群。请参阅
创建 EKS 集群
。(这篇博文使用运行 Kubernetes 1.21 版的 EKS 进行了测试。)
- 这两个集群将被称为
Primary
和Recovery
集群。 - 每个集群都必须配置一个 EKS IAM OIDC 提供程序。请参阅为您的集群创建 IAM OIDC 提供程序。这是服务账户的 IAM 角色的要求,用于向 Velero 部署授予所需的 AWS 权限。
- 这两个集群将被称为
AWS CLI 版本 2。请参阅安装、更新和卸载 AWS CLI 版本 2。
helm v3。请参阅安装 Helm。
kubectl
. 请参阅安装 kubectl。
我们用于本演练的两个 EKS 集群位于同一个帐户中,但这并不是使用 Velero 的硬性要求。在这种情况下,您仍然可以将此博文作为指导,并相应地调整 IAM 和 S3 存储桶权限。
请注意,以下部分中的命令是用 Bash 编写的。
安装 Velero
使用 EKS 最佳实践安装 Velero 需要几个步骤。首先,我们将创建一个 S3 存储桶来存储备份。然后,我们将使用服务账户的 IAM 角色授予 Velero 执行备份和恢复操作所需的 AWS 权限。最后,我们将安装 Velero CLI 以简化我们与此工具的交互方式。
创建一个 S3 存储桶来存储备份
Velero 在 AWS 中运行时使用 S3 存储 EKS 备份。运行以下命令为 Velero 创建一个 S3 存储桶。请务必使用唯一的存储桶名称,例如<company-fqdn>-eks-velero-backups
.
在下面用您自己的值替换<BUCKETNAME>
和。<REGION>
Replace <BUCKETNAME> and <REGION> with your own values below.
BUCKET=<BUCKETNAME>
REGION=<REGION>
aws s3 mb s3://$BUCKET --region $REGION
IAM 政策
Velero 对 EC2 和 S3 中的资源执行大量 API 调用,以执行快照并将备份保存到 S3 存储桶。以下 IAM 策略将授予 Velero 必要的权限。
cat > velero_policy.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeVolumes",
"ec2:DescribeSnapshots",
"ec2:CreateTags",
"ec2:CreateVolume",
"ec2:CreateSnapshot",
"ec2:DeleteSnapshot"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:DeleteObject",
"s3:PutObject",
"s3:AbortMultipartUpload",
"s3:ListMultipartUploadParts"
],
"Resource": [
"arn:aws:s3:::${BUCKET}/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::${BUCKET}"
]
}
]
}
EOF
aws iam create-policy \
--policy-name VeleroAccessPolicy \
--policy-document file://velero_policy.json
为 Velero 创建服务帐户
为在 EKS 集群上运行的应用程序提供 AWS 策略的最佳实践是使用IAM 角色服务账户。eksctl 提供了一种简单的方法来创建所需的 IAM 角色并将信任关系范围限定为 velero-server 服务帐户。
替换<CLUSTERNAME>
为您Primary
和Recovery
EKS 集群的名称。
PRIMARY_CLUSTER=<CLUSTERNAME>
RECOVERY_CLUSTER=<CLUSTERNAME>
ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
eksctl create iamserviceaccount \
--cluster=$PRIMARY_CLUSTER \
--name=velero-server \
--namespace=velero \
--role-name=eks-velero-backup \
--role-only \
--attach-policy-arn=arn:aws:iam::$ACCOUNT:policy/VeleroAccessPolicy \
--approve
eksctl create iamserviceaccount \
--cluster=$RECOVERY_CLUSTER \
--name=velero-server \
--namespace=velero \
--role-name=eks-velero-recovery \
--role-only \
--attach-policy-arn=arn:aws:iam::$ACCOUNT:policy/VeleroAccessPolicy \
--approve
该--namespace=velero
标志确保只有在velero
命名空间中运行的应用程序才能访问在上一步中创建的 IAM 策略。
在两个 EKS 集群中安装 Velero
下面的说明包括使用 Helm 图表安装 Velero 的必要步骤。
helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
cat > values.yaml <<EOF
configuration:
backupStorageLocation:
bucket: $BUCKET
provider: aws
volumeSnapshotLocation:
config:
region: $REGION
credentials:
useSecret: false
initContainers:
- name: velero-plugin-for-aws
image: velero/velero-plugin-for-aws:v1.2.0
volumeMounts:
- mountPath: /target
name: plugins
serviceAccount:
server:
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::${ACCOUNT}:role/eks-velero-backup"
EOF
cat > values_recovery.yaml <<EOF
configuration:
backupStorageLocation:
bucket: $BUCKET
provider: aws
volumeSnapshotLocation:
config:
region: $REGION
credentials:
useSecret: false
initContainers:
- name: velero-plugin-for-aws
image: velero/velero-plugin-for-aws:v1.2.0
volumeMounts:
- mountPath: /target
name: plugins
serviceAccount:
server:
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::${ACCOUNT}:role/eks-velero-recovery"
EOF
我们需要安装 Velero 服务器两次:一次在Primary
集群中,另一次在Recovery
集群中。您可以使用kubectl config
( kubectl cheat sheet ) 或kubectx查看两个集群的上下文并轻松切换上下文。
为了便于管理,我们使用别名kubectl config
添加我们的集群:kubeconfig
PRIMARY_CONTEXT=<CONTEXTNAME>
RECOVERY_CONTEXT=<CONTEXTNAME>
aws eks --region $REGION update-kubeconfig --name $PRIMARY_CLUSTER --alias $PRIMARY_CONTEXT
aws eks --region $REGION update-kubeconfig --name $RECOVERY_CLUSTER --alias $RECOVERY_CONTEXT
我们可以使用以下命令检查我们是否拥有这些新上下文:
kubectl config get-contexts
“*”表示我们所处的上下文。
将上下文更改为您的Primary
集群并安装 Velero:
kubectl config use-context $PRIMARY_CONTEXT
helm install velero vmware-tanzu/velero \
--create-namespace \
--namespace velero \
-f values.yaml
现在将上下文更改为您的Recovery
集群并继续安装 Velero:
kubectl config use-context $RECOVERY_CONTEXT
helm install velero vmware-tanzu/velero \
--create-namespace \
--namespace velero \
-f values_recovery.yaml
我们可以通过在每个上下文中运行以下命令来检查 Velero 服务器是否已成功安装:
kubectl get pods –n velero
安装 Velero CLI
Velero 通过将命令作为 CRD 提交来运行。要备份集群,请向集群提交备份 CRD。这些可能很难手动创建,因此 Velero 团队创建了一个 CLI,可以轻松执行备份和恢复。我们将使用 Velero CLI 创建集群的备份Primary
并恢复到Recovery
集群。
安装说明因您的操作系统而异。按照说明在此处安装 Velero 。
github 地址:https://github.com/vmware-tanzu/velero/releases
备份和恢复
创建备份
创建Primary
集群的备份。在运行以下命令之前,请务必将您的kubectl
上下文切换回集群。Primary
# 这里指定了 对应的 ns,备份对应ns的所有资源
velero backup create backup --include-namespaces default,crontab-shell,monitoring
# 查看帮助
velero backup delete backup --help
我们可以通过使用标志来查看 Velero 备份 CRD 的外观,该-o
标志输出备份 CRD YAML,而无需实际将备份创建提交到 Velero 服务器。
velero backup create test -o yaml
在备份 CRD 中,您可以看到我们正在备份所有命名空间,因为该includedNamespaces
数组包含星号通配符。即使我们正在备份整个集群,我们也可以使用选择器来选择集群的各个组件。这使我们能够备份单个命名空间,例如,它可能包括单个应用程序。
验证备份是否成功
让我们检查备份的状态并验证备份是否已成功完成。
velero backup describe backup
在命令的输出中查找该字段Phase:
。如果当前Phase
是InProgress
,则稍等片刻,然后重试,直到看到Phase: Completed
。您可以查看备份的其他详细信息,包括开始时间和完成时间等信息,以及备份的项目数。
(base) ~/service/EKS/backup/ velero backup describe backup
Name: backup
Namespace: velero
Labels: velero.io/storage-location=default
Annotations: velero.io/source-cluster-k8s-gitversion=v1.20.15-eks-6d3986b
velero.io/source-cluster-k8s-major-version=1
velero.io/source-cluster-k8s-minor-version=20+
Phase: Completed
Errors: 0
Warnings: 0
Namespaces:
Included: default, crontab-shell, monitoring
Excluded: <none>
Resources:
Included: *
Excluded: <none>
Cluster-scoped: auto
Label selector: <none>
Storage Location: default
Velero-Native Snapshot PVs: auto
TTL: 720h0m0s
Hooks: <none>
Backup Format Version: 1.1.0
Started: 2022-10-18 16:56:49 +0800 CST
Completed: 2022-10-18 16:57:34 +0800 CST
Expiration: 2022-11-17 16:56:49 +0800 CST
Total items to be backed up: 699
Items backed up: 699
Velero-Native Snapshots: <none included>
我们还可以在我们之前创建的 Amazon S3 存储桶中看到 Velero 创建的备份文件:
aws s3 ls $BUCKET/backups/ghost-backup/
将应用程序还原到恢复集群
将您的上下文切换kubectl
到您的恢复集群。
kubectl config use-context $RECOVERY_CONTEXT
使用以下命令仅将 Ghost 应用程序恢复到Recovery
集群中。
velero restore create restore \
--from-backup backup \
--include-namespaces ghost # 可以指定名称空间;
验证还原是否成功
让我们检查还原的状态并验证还原是否已成功完成。
velero restore describe restore
Phase: Completed
在输出中寻找。如果您看到Phase: InProgress
,请稍等片刻,然后再次运行该命令。Recovery
然后检索集群中
恭喜!您刚刚成功备份了Primary
集群并在集群中恢复了您的应用程序Recovery
。
请注意,对于您的生产备份/恢复/DR 操作,这是您希望Recovery
在验证服务按预期工作后将您的 prod DNS 记录移动到集群的位置。