您可以通过备份中心对注册集群中部署的应用及数据进行备份,并在线上ACK集群中恢复,实现线下应用到线上的快速迁移。本文介绍如何使用备份中心将已接入注册集群的线下集群的应用迁移至线上ACK集群。
前提条件
已创建注册集群,并将自建Kubernetes集群(大于1.16版本)接入注册集群。具体操作,请参见创建注册集群并接入本地数据中心集群。
已创建和注册集群在同一地域的用于恢复应用的ACK集群,建议恢复集群为1.18及以上版本。具体操作,请参见创建ACK托管集群和创建ACK专有集群。
重要恢复集群必须使用CSI存储插件,使用Flexvolume存储插件或通过csi-compatible-controller组件同时使用CSI Flexvolume存储插件的集群不支持恢复。
备份中心关注业务应用的备份和恢复。在恢复任务之前,您需要在恢复集群中预先安装并配置好所需的系统组件。例如:
ACR免密组件:您需要为恢复集群重新授权并配置acr-configuration。
ALB Ingress组件:您需要预先配置ALBConfig等。
注册集群和ACK集群均已开启集群备份。具体操作,请参见安装备份服务组件并配置权限。
对已通过CEN、高速通道、专线、VPN等方式与云上VPC互通的注册集群,已配置指向OSS内网网段的路由。更多信息,请参见OSS内网域名与VIP网段对照表。
已开通云备份(Cloud Backup)服务。具体操作,请参见云备份(Cloud Backup)。
适用场景
云备份容灾:备份容灾迁移一体化,实现快速应用上云与数据灾备。
注意事项
备份线下集群数据时,需要通过PV和PVC的方式挂载本地卷。阿里云CSI插件支持注册集群的挂载功能。更多信息,请参见本地存储卷概述。
注册集群、线上ACK集群和OSS Bucket需要在同一地域内。
准备工作
本文以MySQL应用为例,在线下集群中部署应用后进行备份,然后在线上ACK集群中进行恢复。应用迁移前,请确认注册集群和ACK集群在同一地域内,且均已开启集群备份,并满足如下条件。
注册集群:确认已创建RAM用户并配置OSS与云备份权限,并使用RAM用户的AccessKey ID和AccessKey Secret在注册集群的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应用及数据
由于注册集群已接入线下集群,可在注册集群中进行备份任务操作,具体步骤如下:
在注册集群中创建备份仓库。具体操作,请参见创建备份仓库。
在注册集群中创建名为MySQL的立即备份。具体操作,请参见创建备份计划或立即备份。
输入立即备份的名称为MySQL,选择备份仓库为您上一步创建的备份仓库,选择备份命名空间为test1。
在应用备份页面,单击备份记录页签,查看MySQL任务状态由InProgress变为Completed,表示MySQL应用及数据备份完成。
步骤三:在线上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