Velero 备份集群资源

先决条件

为了能够执行后续步骤,您需要具备以下先决条件:

我们用于本演练的两个 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>为您PrimaryRecoveryEKS 集群的名称。

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:。如果当前PhaseInProgress,则稍等片刻,然后重试,直到看到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 记录移动到集群的位置。