亚马逊AWS官方博客

快速迁移自建Kubernetes资源上云及EKS资源备份恢复–基础篇

越来越多公司进行应用现代化,微服务化改造,容器化部署,而这一切皆绕不开“容器调度管理平台” Kubernetes。那么如何快速将云下自建Kubernetes迁移上云,及上云后如果按需备份恢复,及在必要时可以快速克隆生产环境进行开发测试成为众多客户的需求点,本文将通过简单场景示例来介绍如何通过Velero快速实现自建Kubernetes资源迁移到EKS及实现EKS集群内资源备份恢复。

一、工具Velero介绍:

Velero 是一款开源云原生的备份恢复和迁移工具,采用 Go 语言编写,可以安全的备份、恢复和迁移Kubernetes集群资源和持久卷,支持公有云,私有云及IDC本地化部署

支持如下功能:

1. 集群资源迁移到其他集群,例如k8s集群间资源迁移,自建k8s到云上托管k8s,不同云厂商托管k8s间资源迁移

2. 集群资源备份恢复,及复制生产集群资源到开发和测试集群
3. 手工或计划定期自动备份,配置备份前和备份后钩子,以在Velero备份之前和之后执行自定义操作

Velero工作原理:

1. Velero 客户端发送备份指令调用 Kubernetes API 服务器以创建 Backup 对象

2. BackupController 观测到通知有新的 Backup 对象被创建并执行对应动作

3. BackupController 开始备份过程,它通过查询API服务器以获取资源来收集数据以进行备份

4. BackupController将需要备份数据传送到远端存储

Velero组件包含:在集群上运行的服务器端;在本地运行的命令行客户端;

部署方式:支持命令行安装和Helm安装,后面环境测试将分别以两种不同的方式进行部署

二、环境准备:

前置条件:

a)两台EC2 用于部署自建Kubernetes集群

b)一套托管EKS集群

c)S3存储桶,用于存放备份数据

d)Velero:快速实现k8s备份恢复及迁移工具

 

1.自建K8s,配置Velero

自建Kubernetes集群步骤可参考Kubernetes官网或参考其他互联网在线文档自行部署即可

本实验环境采用:

2台EC2部署Redhat 8,一台作为master,一台作为work node

Kubernetes版本采用1.20.9,网络插件Calico

部署完成后,确保所有节点为就绪状态


所有系统组件均为running状态

待自建集群就绪即可开始Velero安装配置,下载最近版本Velero然后解压进行link或设置PATH环境变量均可

wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.2/velero-v1.9.2-linux-amd64.tar.gz

客户端安装完成后验证Velero命令可正常执行

接下来部署Velero服务端,此处采用Velero命令行自定义模式进行部署

velero install \
  --velero-pod-cpu-request 200m \
  --velero-pod-mem-request 200Mi \
  --velero-pod-cpu-limit 1000m \
  --velero-pod-mem-limit 1000Mi \
  --use-restic \
  --default-volumes-to-restic \
  --restic-pod-cpu-request 200m \
  --restic-pod-mem-request 200Mi \
  --restic-pod-cpu-limit 1000m \
  --restic-pod-mem-limit 1000Mi \
  --provider aws \
  --bucket velerobucketzxb \
  --namespace velero \
  --plugins velero/velero-plugin-for-aws:v1.2.0 \
  --secret-file ./velero-secret-file #path to velero credentials file

部署完成后检验确认Velero命名空间存在,对应Velero资源已就绪如下:

至此,自建Kubernetes及Velero配置完成

可简单通过 Velero backup create backup-name进行备份测试, 确保备份功能正常,通过Velero backup get进行备份列表查看

2.托管EKS部署,配置Velero

EKS集群部署参考AWS官网在线文档进行部署即可,此处测试环境为EKS1.22. 在EKS集群就绪后,按如下步骤部署Velero

2.1 创建IAM策略赋予Velero对S3的读取写入权限

BUCKET= velerobucketzxb  #存储桶使用和自建k8s同一个测试存储桶

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

2.2 为Velero创建service account

EKS_CLUSTER=eks-cluster-name
REGION=eks-region
ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
eksctl create iamserviceaccount \
--cluster=$EKS_CLUSTER \
--name=velero-server \
--namespace= test-velero \
--role-name=eks-velero-backup \
--role-only \
--attach-policy-arn=arn:aws:iam::$ACCOUNT:policy/VeleroAccessPolicy \
--approve

2.3 在EKS上部署Velero服务端

生成Velero yaml配置文件

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"

2.4 采用helm方式部署Velero服务端

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

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

安装验证:确保下图所示命名空间及所属资源存在

三、测试场景

1.迁移自建k8s资源到托管EKS

在自建k8s创建web-front命名空间,并在该命名空间下创建nginx service和pod,通过Velero以备份恢复模式快速迁移该命名空间及所属资源到EKS

a. 连接到自建k8s,查看当前状态

b. 创建web-front命名空间并部署nginx pod和service

c. 通过Velero快速备份自建k8s集群命名空间web-front,然后在EKS上进行恢复以实现快速资源迁移


d. 切换连接到托管EKS,并确认当前该集群无web-front命名空间

e. 使用之前自建k8s备份在EKS上执行恢复操作


可以看到自建k8s上的web-front命名空间及其资源已在托管EKS集群运行起来

 

2.EKS备份恢复测试

备份game-2048命名空间及其资源,待备份完成后删除该命名空间并执行恢复操作,确认所有资源可正常运行。

a.确认当前集群连接为托管EKS集群:

b.创建game-2048命名空间及其资源

c.检查当前EKS集群已经部署game-2048测试应用且运行正常

d.执行备份操作,并确认备份成功

e.查看备份文件是否存在,删除原game-2048命名空间

f.执行恢复操作,并查看game-2048命名空间已恢复,并且对应pod资源已经正常运行

至此,基于Velero快速实现命名空间级资源备份恢复完成,在实际环境中如需要克隆生产环境进行开发测试,日常备份恢复及资源迁移都可采用该方式进行.

参考资料:

https://velero.io/docs/v1.9/backup-reference/

https://github.com/vmware-tanzu/velero/releases/tag/v1.9.2

https://github.com/vmware-tanzu/velero-plugin-for-aws

本篇作者

张雪斌

亚马逊云科技技术客户经理,曾就职于IBM、金蝶、腾讯专有云等高科技公司,拥有15年以上从业经验,在云计算,数据库,容器及微服务等技术方向有一定研究,擅长解决方案设计及技术选型和落地。

孔平凡

亚马逊云技术客户经理,在加入亚马逊之前就职于百度,具有多年广告开发经验。目前致力于容器和无服务器相关领域的研究