自建Kubernetes集群应用迁移至线上ACK集群
您可以通过备份中心对注册集群中部署的应用及数据进行备份,并在线上ACK集群中恢复,实现线下应用到线上的快速迁移。本文介绍如何使用备份中心将已接入注册集群的线下集群的应用迁移至线上ACK集群。
前提条件
已创建注册集群,并将自建Kubernetes集群(大于v1.20版本)接入注册集群。具体操作,请参见创建注册集群并接入本地数据中心集群。
已创建和注册集群在同一地域的用于恢复应用的ACK集群,且集群版本大于v1.20。具体操作,请参见创建Kubernetes托管版集群和创建Kubernetes专有版集群。
注册集群和ACK集群均已开启集群备份。具体操作,请参见安装备份服务组件并配置权限。
对已通过CEN、高速通道、专线、VPN等方式与云上VPC互通的注册集群,已配置指向OSS内网网段的路由。更多信息,请参见OSS内网域名与VIP网段对照表。
已开通HBR服务。具体操作,请参见混合云备份HBR。
适用场景
混合云备份容灾:备份容灾迁移一体化,实现快速应用上云与数据灾备。
注意事项
备份线下集群数据时,需要通过PV和PVC的方式挂载本地卷。阿里云CSI插件支持注册集群的挂载功能。更多信息,请参见本地存储卷概述。
注册集群、线上ACK集群和OSS Bucket需要在同一地域内。
准备工作
本文以MySQL应用为例,在线下集群中部署应用后进行备份,然后在线上ACK集群中进行恢复。应用迁移前,请确认注册集群和ACK集群在同一地域内,且均已开启集群备份,并满足如下条件。
注册集群:确认已创建RAM用户并配置OSS与HBR权限,并使用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托管版集群,请确认已开通HBR服务,且已创建cnfs-oss-****名称的Bucket。
若使用ACK专有版集群,请确认已为Worker RAM角色配置OSS与HBR权限。具体操作,请参见为专有版集群配置OSS权限和为专有版集群或注册集群的用户配置HBR权限。
操作视频
步骤一:在线下集群中部署应用
执行以下命令,创建命名空间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集群中恢复应用
本文以alibabacloud-cnfs-nas存储类为例,说明如何在线上ACK集群中恢复MySQL应用。具体步骤如下:
在线上ACK集群中为MySQL备份任务制作快照。具体操作,请参见为文件系统类型的数据卷制作快照。
在备份和快照页签下,查看MySQL备份状态由Completed变为ConvertionCompleted,表示快照制作完成。
创建恢复任务mysql-restore,将MySQL应用部署在线上ACK集群的test2命名空间中。具体操作,请参见恢复应用和数据卷。
输入恢复任务的名称为mysql-restore,选择备份仓库为您之前创建的备份仓库,选择备份为MySQL。重定义命名空间由test1变为test2。
在恢复页签下,查看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