利用 Velero 实现将应用跨云迁移到 百度CCE
1.简介
CCE 支持用户使用开源工具 Velero 对云上及私有环境的 Kubernetes 集群进行备份、恢复。用于集群误操作、集群故障、集群迁移等场景。
velero的作用:
- 灾备能力:提供备份恢复k8s集群的能力
- 迁移能力:提供拷贝集群资源到其他集群的能力
和 etcd 备份的区别:**
- etcd 的备份必须拥有 etcd 运维权限,CCE上托管型集群用户无法操作 etcd
- etcd 更适合单集群内数据备份,不太适合集群迁移
- etcd 是当前状态备份,velero 可以做到只备份集群内的一部分资源
Velero 工作原理图如下图所示(来源于 Velero 官网),当用户执行备份命令时,备份过程说明如下:
- 调用自定义资源 API 创建备份对象(1)。
- BackupController 控制器检测到生成的备份对象时(2)执行备份操作(3)。
- 将备份的集群资源和存储卷快照上传到 Velero 的后端存储(4)和(5)。
另外当执行还原操作时,Velero 会将指定备份对象的数据从后端存储同步到 Kubernetes 集群完成还原工作。
更多关于 Velero 介绍,请参见Velero 官网文档。
本文将介绍如何使用 百度云对象存储 BOS 作为 Velero 后端存储实现从阿里云ACK到百度智能云CCE的集群备份。
2.安装及配置
如果要将 ACK 上的应用迁移到 CCE 上,需要安装并配置 velero 和 velero-baiducloud-plugin。
- 在百度云上创建你的 BOS bucket
- 在百度云上获取你的 AccessKey 和 SecretKey
- 获取百度云 CCE 发布的迁移组件 CCE-Backup-Controller,在阿里云配置容器镜像示例,并推送 CCE-Backup-Controller 相关镜像
- 安装 Velero 命令工具及服务端
- 根据实际情况修改Helm Values
- 阿里云 ACK 集群安装部署 CCE-Backup-Controller
2.1 在百度云对象存储创建 BOS Bucket
Velero 需要对象存储来存放备份数据,在 百度云上创建你的BOS bucket。
创建 Bucket 的过程参考:对象存储 BOS - 创建 Bucket
示例:
- bucket 名称:cce-bos-test
2.2 获取百度云用户的 AccessKey 和 SecretKey
关于 AK SK 的更多信息参考: 如何获取 AK 和 SK
2.3 确认环境
-
源集群:
- 地域:北京
- 阿里 ACK 集群 ID
-
备份到 BOS:
- bucket:cce-bos-test(示例)
-
目标集群:
- 地域:北京
- 百度 CCE 集群 ID
2.4 安装 Velero 命令工具及服务端
2.4.1 安装 Velero 命令行工具
方法一:MacOS - Homebrew
在 macOS,您可以在终端使用Homebrew 完成 velero 客户端的安装:
brew install velero
方法二:Github release
- 从 Velero release 页面 下载和使用平台匹配的压缩包
- 解压压缩包
tar -xvf <RELEASE-TARBALL-NAME>.tar.gz
3.将解压得到的 velero 二进制移动到您的 $PATH 环境变量包含的路径下(如 /usr/local/bin)
方法三:Windows - Chocolatey
在 Windows 平台,您可以在终端使用 Chocolatey 完成 velero 客户端的安装。
choco install velero
2.4.2 在阿里ACK安装 CCE-Backup-Controller
我们主要利用 Helm 完成 Velero 服务端的安装。
步骤一:下载 CCE-Backup-Controller Helm Chart,并解压
步骤二:将 CCE-Backup-Controller Helm Chart 中的镜像推送到 阿里云镜像服务,下文统一以阿里云镜像作为示例。
镜像列表:
registry.baidubce.com/cce-plugin-pro/velero:v1.13.5
registry.baidubce.com/cce-plugin-pro/velero-plugin-baiducloud:0.6
registry.baidubce.com/cce-plugin-pro/kubectl:1.24.9
推送到阿里云镜像服务后,镜像列表为:
registry-vpc.cn-beijing.aliyuncs.com/velero-test/velero:v1.13.5
registry-vpc.cn-beijing.aliyuncs.com/velero-test/velero-plugin-baiducloud:0.6
registry-vpc.cn-beijing.aliyuncs.com/velero-test/kubectl:1.24.9
步骤三:配置 CCE-Backup-Controller Chart
安装执行部署 Velero 服务端之前,需要对 Velero 的 Helm Chart 进行正确的配置,即需要正确编辑 Chart 中的 values.yaml 文件。
- 替换核心镜像。为了在未开通外网的 CCE 环境中顺利拉取 Velero Helm Chart 中的核心镜像,需要修改 values.yaml 中的镜像地址
- registry.baidubce.com/cce-plugin-pro/velero:v1.13.2 替换为 registry-vpc.cn-beijing.aliyuncs.com/velero-test/velero:v1.13.2
- registry.baidubce.com/cce-plugin-pro/velero-plugin-baiducloud:0.6 替换为 registry-vpc.cn-beijing.aliyuncs.com/velero-test/velero-plugin-baiducloud:0.6
- registry-vpc.cn-beijing.aliyuncs.com/velero-test/kubectl:1.24.9 替换为 registry-vpc.cn-beijing.aliyuncs.com/velero-test/kubectl:1.24.9 修改后,示例 yaml 如下:
# Details of the container image to use in the Velero deployment & daemonset (if
# enabling node-agent). Required.
image:
repository: registry-vpc.cn-beijing.aliyuncs.com/velero-test/velero
tag: v1.13.2
# Digest value example: sha256:d238835e151cec91c6a811fe3a89a66d3231d9f64d09e5f3c49552672d271f38.
# If used, it will take precedence over the image.tag.
# digest:
pullPolicy: IfNotPresent
# One or more secrets to be used when pulling images
imagePullSecrets: []
# - registrySecretName
kubectl:
image:
repository: registry-vpc.cn-beijing.aliyuncs.com/velero-test/kubectl
tag: 1.24.9
# Digest value example: sha256:d238835e151cec91c6a811fe3a89a66d3231d9f64d09e5f3c49552672d271f38.
# If used, it will take precedence over the kubectl.image.tag.
# digest:
# kubectl image tag. If used, it will take precedence over the cluster Kubernetes version.
# tag: 1.16.15
2.添加 百度云 Velero 插件。为了能够顺利将集群备份文件保存到 百度云 BOS,CCE 提供了 Velero 插件。该配置需要添加到 initContainer 配置中。修改后示例 Yaml 如下:
initContainers:
- name: velero-plugin-baiducloud
image: hub.baidubce.com/jpaas-public/velero-plugin-baiducloud:v0.3
imagePullPolicy: IfNotPresent
env:
- name: BAIDU_CLOUD_CREDENTIALS_FILE
value: "/credentials/cloud"
volumeMounts:
- mountPath: /target
name: plugins
- mountPath: /credentials
name: cloud-credentials
- 配置 百度云 BOS 访问凭证。注意:
- 将 <BAIDU_CLOUD_ACCESS_KEY_ID> 和 <BAIDU_CLOUD_SECRET_ACCESS_KEY> 替换成您在 2.2 步骤获取的实际百度云上的 AccessKey 及 SecretAccessKey;
- 将 <BAIDU_CLOUD_BOS_ENDPOINT> 替换成您所在地域的 BOS 服务域名,BOS 服务在各地域的域名见:对象存储 BOS - 获取访问域名
credentials:
# Whether a secret should be used. Set to false if, for examples:
# - using kube2iam or kiam to provide AWS IAM credentials instead of providing the key file. (AWS only)
# - using workload identity instead of providing the key file. (Azure/GCP only)
useSecret: true
# Name of the secret to create if `useSecret` is true and `existingSecret` is empty
name: baidu-bos-credentials
# Name of a pre-existing secret (if any) in the Velero namespace
# that should be used to get IAM account credentials. Optional.
existingSecret:
# Data to be stored in the Velero secret, if `useSecret` is true and `existingSecret` is empty.
# As of the current Velero release, Velero only uses one secret key/value at a time.
# The key must be named `cloud`, and the value corresponds to the entire content of your IAM credentials file.
# Note that the format will be different for different providers, please check their documentation.
# Here is a list of documentation for plugins maintained by the Velero team:
# [AWS] https://github.com/vmware-tanzu/velero-plugin-for-aws/blob/main/README.md
# [GCP] https://github.com/vmware-tanzu/velero-plugin-for-gcp/blob/main/README.md
# [Azure] https://github.com/vmware-tanzu/velero-plugin-for-microsoft-azure/blob/main/README.md
secretContents:
cloud: |
BAIDU_CLOUD_BOS_ENDPOINT=<BAIDU_CLOUD_BOS_ENDPOINT>
BAIDU_CLOUD_ACCESS_KEY_ID=<BAIDU_CLOUD_ACCESS_KEY_ID>
BAIDU_CLOUD_SECRET_ACCESS_KEY=<BAIDU_CLOUD_SECRET_ACCESS_KEY>
- 配置备份存储位置。该部分主要配置备份文件的存储位置,在使用 BOS 的场景下,实现将集群文件备份到 BOS 的指定 Bucket 及目录。注意:
- 将 <BUCKET_NAME> 替换为您在 BOS 创建的 Bucket 名称
- 将 <CLUSTER_ID> 替换为您的 ACK 集群 ID
# Source: cce-backup-controller/templates/backupstoragelocation.yaml
apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
name: default
namespace: cce-backup
labels:
app.kubernetes.io/name: cce-backup-controller
app.kubernetes.io/instance: test-dhr
app.kubernetes.io/managed-by: Helm
helm.sh/chart: cce-backup-controller-1.1.3
spec:
credential:
name: baidu-bos-credentials
key: cloud
provider: baiducloud
accessMode: ReadWrite
objectStorage:
bucket: "cce-bos-test"
prefix: "ceb93762c98b9496889487187c6423196"
config:
checksumAlgorithm: "SHA256"
region: "bj"
s3ForcePathStyle: "true"
s3Url: "https://s3.bj.bcebos.com"
signatureVersion: "AWS4-HMAC-SHA256"
执行命令:
kubectl --kubeconfig={kubeconfig} apply -f bkp-location.yaml
其他 Velero 相关配置请参考官方文档及 Helm Chart 中配置注释。
- https://velero.io/docs/v1.14/backup-reference/
- https://github.com/vmware-tanzu/helm-charts/blob/main/charts/velero/README.md
步骤三:部署及更新 CCE-Backup-Controller
使用 helm 命令完成 Velert 服务端的部署
cd cce-backup-controller\nhelm --kubeconfig={kubeconfig} install cce-backup-controller . -n cce-backup --create-namespace
每次修改 values.yaml 文件后,执行以下命令完成更新:
helm upgrade cce-backup-controller . -n velero
确认 velero 服务端正常运行:
kubectl -n cce-backup get pods
# 结果
NAME READY STATUS RESTARTS AGE\nvelero-76b4d755f5-fzztr 1/1 Running 0 49m
步骤四:创建备份和恢复任务
- 备份任务创建(命令行指令)
velero --kubeconfig {{kubeconfig-path}} backup create nginx-backup --include-namespaces default -n cce-backup
- 查看备份任务是否成功
velero --kubeconfig {{kubeconfig-path}} -n cce-backup backup get
2.5 查看备份数据
登陆 BOS 控制台,并选择目标 bucket。示例的 bucket 名称为 cce-bos-test:
- 查看 bucket 文件列表,其中每个集群的备份数据保存在单独的文件夹,如 cce-bos-test/ceb93762c98b9496889487187c6423196
- 查看集群的备份信息:
2.6 备份恢复
步骤一:迁移镜像,保证应用镜像在 CCE 可拉取
-
方法一:使用 CCR 镜像迁移功能,将 ACK 镜像迁移至 百度云 CCR
- 恢复迁移应用到 CCE 后,需要手工修改镜像为 CCR 地址;
- 方法二:将 ACK 应用镜像修改为公网可访问,CCE 目标集群节点开通访问公网访问
步骤二:在目标恢复的 CCE 集群,通过组件中心安装 CCE-Backup-Controller
步骤三:通过命令行创建备份仓库
# Source: cce-backup-controller/templates/backupstoragelocation.yaml
apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
name: default
namespace: cce-backup
labels:
app.kubernetes.io/name: cce-backup-controller
app.kubernetes.io/instance: test-dhr
app.kubernetes.io/managed-by: Helm
helm.sh/chart: cce-backup-controller-1.1.3
spec:
credential:
name: baidu-bos-credentials-bj
key: cloud
provider: baiducloud
accessMode: ReadWrite
objectStorage:
bucket: "cce-bos-test"
prefix: "ceb93762c98b9496889487187c6423196"
config:
checksumAlgorithm: "SHA256"
region: "bj"
s3ForcePathStyle: "true"
s3Url: "https://s3.bj.bcebos.com"
signatureVersion: "AWS4-HMAC-SHA256"
步骤四:执行备份恢复命令
velero --kubeconfig {{restore-cluster-kubeconfig-path}} restore create --from-backup nginx-backup -n cce-backup
步骤五:确认应用正常运行,相关配置正确迁移
应用镜像:
配置项: