使用Velero将EKS资源备份到S3

Velero是一种用于备份Kubernetes集群资源的事实工具。
该文档是为了记录将EKS上的资源备份到S3的步骤而创建的备忘录。
参考了AWS的博客。

前提条件 (Qiantí

在这里的步骤中,假定以下条件是满足的。请注意,这不是使用Velero所必需的要件。

    • eksctl v0.58以上

 

    • AWS CLI v2

 

    • Helm v3

 

    kubectl

备份准备

定義環境變數

事先定义将在此任务中使用的环境变量。

# S3のバケット名
export BUCKET=imurata-velero-test
# Region
export REGION=us-east-1
# アカウントID
export ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
# EKSのクラスタ名
export PRIMARY_CLUSTER=imurata-eksctl
# EKSのコンテキスト名
export PRIMARY_CONTEXT=imurata-eksctl

S3的设置

创建S3存储桶。如果要重复使用现有的存储桶,可以不创建。

aws s3 mb s3://$BUCKET --region $REGION

接下来,创建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 --no-cli-pager

需要创建Velero使用的服务账号。由于指定了命名空间,因此需要将Velero安装在相同的命名空间中。

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

安装Velero

在这里使用Helm进行安装。
添加Chart存储库。

helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts

查找与本次安装的Velero兼容的插件版本。
通过Helm命令获取本次安装的Velero版本。

$ helm search repo velero
NAME               	CHART VERSION	APP VERSION	DESCRIPTION
stable/velero      	2.7.4        	1.2.0      	A Helm chart for velero
vmware-tanzu/velero	3.1.2        	1.10.0     	A Helm chart for velero

获取与10.0版本兼容的插件版本要从velero-plugin-for-aws中获取。由于似乎支持1.6.x,因此可以创建一个指定为1.6.0的配置文件。

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.6.0
  volumeMounts:
  - mountPath: /target
    name: plugins
serviceAccount:
  server:
    annotations:
      eks.amazonaws.com/role-arn: "arn:aws:iam::${ACCOUNT}:role/eks-velero-backup"
EOF

创建并切换到EKS集群的上下文(如果已经在kubeconfig中有配置的人则不需要)。

aws eks --region $REGION update-kubeconfig --name $PRIMARY_CLUSTER --alias $PRIMARY_CONTEXT
kubectl config use-context $PRIMARY_CONTEXT

在集群中安装Velero。

helm install velero vmware-tanzu/velero \
    --create-namespace \
    --namespace velero \
    -f values.yaml

确认Pod已升起。

$ kubectl get pod -n velero
NAME                      READY   STATUS    RESTARTS   AGE
velero-6566499778-x674s   1/1     Running   0          4m46s

请按照这些步骤安装Velero的CLI。在这里,仅介绍Mac的安装步骤。

brew install velero

创建备份目标

构建一个获取备份样本的过程。在官方博客中,曾经搭建了一个Ghost博客,但在这里我们可以用Nginx来完成,省事一些。

kubectl create ns nginx-ns
kubectl run --image nginx nginx-pod -n nginx-ns

备份文件获取

使用Velero命令进行备份操作。

 velero backup create nginx-backup --include-namespaces nginx-ns --wait

为了确认备份已成功完成,请确认备份状态为“已完成”。

$ velero backup get nginx-backup
NAME           STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
nginx-backup   Completed   0        0          2023-02-01 18:41:43 +0900 JST   29d       default            <none>

我也试着看看桶里面的内容。在这里,我们使用s3-tree。

$ s3-tree $BUCKET
imurata-velero-test
└── backups
    └── nginx-backup
        ├── nginx-backup-csi-volumesnapshotclasses.json.gz
        ├── nginx-backup-csi-volumesnapshotcontents.json.gz
        ├── nginx-backup-csi-volumesnapshots.json.gz
        ├── nginx-backup-logs.gz
        ├── nginx-backup-podvolumebackups.json.gz
        ├── nginx-backup-resource-list.json.gz
        ├── nginx-backup-volumesnapshots.json.gz
        ├── nginx-backup.tar.gz
        └── velero-backup.json

2 directories, 9 files

除了能正常进行备份,还可以通过使用VolumeSnapshot来进行备份(尽管没有备份PV数据)。这样一来,即使在写入磁盘时进行备份,数据的一致性也应该得到保证。大概。

备份的恢复

为了确认恢复操作,删除先前创建的用于确认的Pod和Namespace。

kubectl delete ns nginx-ns

执行恢复操作。

velero restore create nginx-backup --from-backup nginx-backup --wait

我也要先确认一下恢复成功。

$  velero restore get nginx-backup
NAME           BACKUP         STATUS      STARTED                         COMPLETED                       ERRORS   WARNINGS   CREATED                         SELECTOR
nginx-backup   nginx-backup   Completed   2023-02-01 18:49:57 +0900 JST   2023-02-01 18:49:58 +0900 JST   0        0          2023-02-01 18:49:56 +0900 JST   <none>

在完成恢复后,确认nginx的Pod已经启动。

$ kubectl get pod -n nginx-ns
NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0          20s

我确认能够顺利完成了恢复工作。

广告
将在 10 秒后关闭
bannerAds