您可以通过备份中心对ACK注册集群中部署的应用及数据进行备份,并在线上ACK集群中进行恢复,实现线下应用到线上的快速迁移。本文介绍如何使用备份中心将已接入ACK注册集群的线下集群中的应用迁移至线上ACK集群。
前提条件
已创建ACK注册集群,并将自建Kubernetes集群(大于1.16版本)接入注册集群。具体操作,请参见创建注册集群并接入本地数据中心集群。
已创建和ACK注册集群同地域的ACK集群(用于恢复应用),建议版本为1.18及以上。具体操作,请参见创建ACK托管集群和创建ACK专有集群。
重要恢复集群必须使用CSI存储插件,使用Flexvolume存储插件或通过csi-compatible-controller组件同时使用CSI Flexvolume存储插件的集群不支持恢复。
备份中心关注业务应用的备份和恢复。在恢复任务之前,您需要在恢复集群中预先安装并配置好所需的系统组件。例如:
ACR免密组件:您需要为恢复集群重新授权并配置acr-configuration。
ALB Ingress组件:您需要预先配置ALBConfig等。
ACK注册集群和ACK集群均已开启集群备份。具体操作,请参见安装备份服务组件并配置权限。
对已通过CEN、高速通道、专线、VPN等方式与云上VPC互通的ACK注册集群,已配置指向OSS内网网段的路由。更多信息,请参见OSS内网域名与VIP网段对照表。
已开通云备份(Cloud Backup)服务。具体操作,请参见云备份(Cloud Backup)。
适用场景
云备份容灾:备份容灾迁移一体化,快速实现应用上云与数据灾备。详细介绍,请参见注册集群概述。
注意事项
备份线下集群数据时,需要通过PV和PVC的方式挂载本地卷。阿里云CSI插件支持ACK注册集群的挂载功能。更多信息,请参见本地存储卷。
ACK注册集群、线上ACK集群和OSS Bucket需要在同一地域内。
准备工作
本文以MySQL应用为例,介绍如何在线下集群中部署应用并备份,然后在线上ACK集群中恢复。应用迁移前,请确认ACK注册集群和ACK集群在同一地域内,且均已开启集群备份,并满足如下条件。
ACK注册集群:确认已创建RAM用户并配置OSS与云备份权限,并使用RAM用户的AccessKey ID和AccessKey Secret在ACK注册集群的csdr命名空间中创建alibaba-addon-secret的Secret资源。
执行以下命令,确认alibaba-addon-secret已存在。
kubectl get secret alibaba-addon-secret -n csdr
预期输出:
alibaba-addon-secret Opaque 2 5d22h
线上ACK集群:
若为ACK托管集群,请确认已开通云备份服务,且已创建cnfs-oss-****名称的Bucket。
若为ACK专有集群,请确认已为Worker RAM角色配置OSS与云备份权限。具体操作,请参见为专有版集群配置OSS权限和为专有版集群或注册集群的用户配置云备份权限。
操作视频
步骤一:在线下集群中部署应用
执行以下命令,创建命名空间test1。
kubectl create namespace test1
使用以下内容,创建app-mysql.yaml文件。替换
<your-hostname>
为待备份的节点名称,替换username
和password
为实际备份应用的用户名和密码。apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql-sts namespace: test1 spec: selector: matchLabels: app: mysql-sts serviceName: mysql-sts template: metadata: labels: app: mysql-sts spec: containers: - name: mysql-sts image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password ports: - containerPort: 80 name: mysql-sts volumeMounts: - name: mysql mountPath: /var/lib/mysql volumes: - name: mysql persistentVolumeClaim: claimName: example-pvc --- apiVersion: v1 kind: PersistentVolume metadata: name: example-pv spec: capacity: storage: 100Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete storageClassName: local-storage local: path: /mnt/disk nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - <your-hostname> # 待备份的节点名称。 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pvc namespace: test1 spec: accessModes: - ReadWriteOnce resources: requests: storage: 25Gi storageClassName: local-storage volumeName: example-pv --- apiVersion: v1 kind: Secret metadata: name: mysql-pass namespace: test1 type: Opaque data: username: dGVz**** # 待备份MySQL应用的用户名,需替换为您实际备份应用的用户名。 password: dGVzdDEt**** # 待备份MySQL应用的用户密码,需替换为您实际备份应用的用户密码。
执行以下命令,部署MySQL应用,并将本地盘挂载为PV,配置相关PV与PVC。
kubectl create -f app-mysql.yaml
预期输出:
statefulset.apps/mysql-sts created persistentvolume/example-pv created persistentvolumeclaim/example-pvc created secret/mysql-pass created
执行以下命令,确认MySQL应用部署成功。
kubectl get pod -n test1 | grep mysql-sts
预期输出:
mysql-sts-0 1/1 Running 1 (4m51s ago) 4m58s
步骤二:在线下集群中备份MySQL应用及数据
ACK注册集群已接入线下集群,您可在ACK注册集群中进行备份任务。
在ACK注册集群中创建备份仓库。具体操作,请参见创建备份仓库。
在ACK注册集群中创建名为MySQL的立即备份。具体操作,请参见创建备份计划或立即备份。
输入立即备份的名称为MySQL,选择备份仓库为您上一步创建的备份仓库,选择备份命名空间为test1。
在应用备份页面,单击备份记录页签,查看mysql-backup任务的状态。当该状态由InProgress变为Completed,表示应用数据备份已完成。
步骤三:在线上ACK集群中恢复应用
本文以将线下集群的存储转化为alibabacloud-cnfs-nas存储类为例,介绍如何在线上ACK集群中恢复MySQL应用。具体步骤如下:
创建恢复任务mysql-restore,将MySQL应用部署在线上ACK集群的test2命名空间中,并转换至存储类alibabacloud-cnfs-nas。具体操作,请参见恢复应用和数据卷。
配置项
示例
名称
mysql-restore。
备份仓库
选择备份仓库为您之前创建的备份仓库。若提示初始化仓库,请单击并等待备份记录同步至该集群。
选择备份
MySQL。
重定义命名空间
由test1变为test2。
存储类转换
在转换的PVC列表中为example-pvc选择存储类alibabacloud-cnfs-nas。
单击立即恢复右侧的查看恢复记录,查看mysql-restore任务状态由InProgress变为Completed,表示MySQL应用数据恢复已完成。
在ACK集群中执行以下命令,确认MySQL应用部署成功。
kubectl get pod -n test2 | grep mysql-sts
预期输出:
mysql-sts-0 1/1 Running 0 4s
在ACK集群中执行以下命令,确认数据已恢复正常。
确认数据已恢复为alibaba-cnfs-nas存储类。
kubectl get pvc -n test2 | grep example-pvc
预期输出:
example-pvc Bound nas-acde4acd-59b6-4332-90af-b74ef6****** 25Gi RWO alibabacloud-cnfs-nas 31m
确认example-pvc已挂载到MySQL应用中。
kubectl describe pvc example-pvc -n test2 | grep "Used By"
预期输出:
Used By: mysql-sts-0