使用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
我确认能够顺利完成了恢复工作。