自建Kubernetes集群应用迁移至线上ACK集群

您可以通过备份中心对注册集群中部署的应用及数据进行备份,并在线上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集群:

操作视频

步骤一:在线下集群中部署应用

  1. 执行以下命令,创建命名空间test1

    kubectl create namespace test1
  2. 使用以下内容,创建app-mysql.yaml文件。

    替换如下<your-hostname>为您待备份的节点名称,替换如下usernamepassword为您实际备份应用的用户名和密码。

    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应用的用户密码,需替换为您实际备份应用的用户密码。
  3. 执行以下命令,部署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
  4. 执行以下命令,确认MySQL应用部署成功。

    kubectl get pod -n test1 | grep mysql-sts

    预期输出:

    mysql-sts-0   1/1     Running   1 (4m51s ago)   4m58s

步骤二:在线下集群中备份MySQL应用及数据

由于注册集群已接入线下集群,可在注册集群中进行备份任务操作,具体步骤如下:

  1. 在注册集群中创建备份仓库。具体操作,请参见创建备份仓库

  2. 在注册集群中创建名为MySQL的立即备份。具体操作,请参见创建备份计划或立即备份

    输入立即备份的名称MySQL,选择备份仓库为您上一步创建的备份仓库,选择备份命名空间test1

  3. 应用备份页面,单击备份记录页签,查看MySQL任务状态由InProgress变为Completed,表示MySQL应用及数据备份完成。

步骤三:在线上ACK集群中恢复应用

本文以将线下集群的存储转化为alibabacloud-cnfs-nas存储类为例,说明如何在线上ACK集群中恢复MySQL应用。具体步骤如下:

  1. 创建恢复任务mysql-restore,将MySQL应用部署在线上ACK集群的test2命名空间中,并转换至存储类alibabacloud-cnfs-nas。具体操作,请参见恢复应用和数据卷

    配置项

    示例

    名称

    mysql-restore。

    备份仓库

    选择备份仓库为您之前创建的备份仓库。若提示初始化仓库,请单击并等待备份记录同步至该集群。

    选择备份

    MySQL。

    重定义命名空间

    test1变为test2

    存储类转换

    在转换的PVC列表中为example-pvc选择存储类alibabacloud-cnfs-nas。

  2. 单击立即恢复右侧的查看恢复记录,查看mysql-restore任务状态由InProgress变为Completed,表示MySQL应用及数据恢复完成。

  3. 在ACK集群中执行以下命令,确认MySQL应用部署成功。

    kubectl get pod -n test2 | grep mysql-sts

    预期输出:

    mysql-sts-0   1/1     Running   0          4s
  4. 在ACK集群中执行以下命令,确认数据已恢复正常。

    1. 执行以下命令,确认数据已恢复为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
    2. 执行以下命令,确认example-pvc已挂载到MySQL应用中。

      kubectl describe pvc example-pvc -n test2 | grep "Used By"

      预期输出:

      Used By:       mysql-sts-0