阿里云容器服务备份中心为集群内的有状态应用提供灾难备份和恢复能力,对于Kubernetes集群内的有状态应用的崩溃一致性,应用一致性,跨地域的灾难恢复提供了一站式的解决方案。本文介绍如何通过应用备份功能实现跨集群迁移应用。

前提条件

已创建两个Kubernetes版本一致的集群。具体操作,请参见 创建Kubernetes托管版集群

示例介绍

本示例中一个名为Cluster_A集群,另一个名为Cluster_B集群。接下来介绍在Cluster_A集群备份应用,在Cluster_B集群恢复应用。
注意 创建集群时,请确保两个集群的Kubernetes版本一致,否则会导致跨集群迁移应用失败。
架构图

使用应用备份功能迁移应用的流程

  1. 授予Cluster_A和Cluster_B集群OSS权限。具体操作,请参见配置OSS权限
  2. 在Cluster_A和Cluster_B集群中安装应用备份组件。具体操作,请参见安装应用备份组件
  3. 在Cluster_A和Cluster_B集群创建备份仓库。创建备份仓库时,给Cluster_A和Cluster_B集群设置同一个OSS,并且选择公网访问。具体操作,请参见创建备份仓库
  4. 在Cluster_A集群创建备份任务。具体操作,请参见创建备份任务
    Cluster_A集群创建备份任务完成后,您可以在Cluster_B集群 应用备份页面 备份和快照页签下看到Cluster_A集群的备份任务。
  5. 在Cluster_B集群制作快照。具体操作,请参见制作快照
    若创建备份任务时已选中 备份存储卷且存储类型使用了非云盘类型,即使用混合云备份服务HBR(Hybrid Backup Recovery)进行文件备份,则需要制作快照。
  6. 在Cluster_B集群应用备份页面的恢复页签下选择Cluster_A集群的备份任务,执行恢复操作。具体操作,请参见创建恢复任务

示例一:使用备份中心功能跨集群迁移WordPress应用(云上ACK集群之间)

通过在源K8s集群安装WordPress应用,并且通过发布博客的方式,将博客中文本内容存储在云盘,图片内容存储在NAS,实现应用中既有NAS数据和云盘数据。通过备份中心,将源集群的WordPress应用进行备份,然后在目标集群中将恢复应用和数据,验证数据及应用的完整性。

  1. cn-huhehaote地域创建ACK托管版集群Cluster_A和Cluster_B。
  2. 在Cluster_A集群中安装应用WordPress。具体操作,请参见通过应用市场一键部署WordPress
    参数页签,选择 default命名空间,将 storageClass: "alicloud-disk-ssd"修改为 storageClass: "alibabacloud-cnfs-nas",如下所示:
    persistence:
      enabled: true
      ## wordpress data Persistent Volume Storage Class
      ## If defined, storageClassName: <storageClass>
      ## If set to "-", storageClassName: "", which disables dynamic provisioning
      ## If undefined (the default) or set to null, no storageClassName spec is
      ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
      ##   GKE, AWS & OpenStack)
      storageClass: "alibabacloud-cnfs-nas"
      ## If you want to reuse an existing claim, you can pass the name of the PVC using
      ## the existingClaim variable
      # existingClaim: your-claim
      accessMode: ReadWriteOnce
      size: 20Gi
  3. 在Cluster_A和Cluster_B集群中安装备份服务组件,并创建备份仓库。
    关于安装备份服务组件的操作,请参见 安装应用备份组件。关于创建备份仓库的操作,请参见 创建备份仓库
  4. 在Cluster_A集群中创建备份任务。具体操作,请参见创建备份任务
    开启对 default命名空间的备份。 创建备份任务待备份任务 123backup-1的状态为 Completed后,您可以在Cluster_B集群 应用备份页面的 备份和快照页签下看到Cluster_A集群的备份任务。
  5. 在Cluster_B集群中备份和快照页签下,在备份任务123backup-1的右侧操作列单击制作快照
    本示例,在 生成快照对话框, 转换为存储类列选择 alicloud-disk(即云盘)。 生成快照待快照生成,即对应PVC的状态变为 ConvertionCompleted制作快照
  6. 在Cluster_B集群中创建恢复任务restore-123backup-1
    创建恢复任务
  7. 验证任务是否恢复成功。
    1. 在Cluster_B集群管理页左侧导航栏选择工作负载 > 无状态,在WordPress应用的右侧操作列单击详情,确认WordPress应用的状态为Runnning
    2. 在集群管理页左侧导航栏中,选择网络 > 服务
    3. 服务页面单击WordPress的外部端点,可以看到WordPress主页。
      主页

示例二:使用备份中心功能跨集群迁移MySQL应用(云下数据中心K8s到云上ACK集群)

示例简述

  1. 在线下K8s创建集群(例如,Rancher集群),将线下集群接入注册集群后通过YAML部署使用本地盘的MySQL应用。
  2. 云上通过ACK创建托管版集群,部署备份服务组件。
  3. 云下纳管集群(即注册集群)通过备份中心备份线下集群的MySQL应用及数据。
  4. 在云上ACK集群中,通过备份中心使云下应用和数据在云上恢复。
  1. 将线下集群接入注册集群。具体操作,请参见创建注册集群并接入本地数据中心集群
  2. 使用kubectl工具连接注册集群。具体操作,请参见通过kubectl工具连接集群
  3. 创建PV、PVC及MySQL应用。
    1. 使用以下示例创建mysql.yaml
      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: local-pv
      spec:
        capacity:
          storage: 100Gi
        accessModes:
        - ReadWriteOnce
        persistentVolumeReclaimPolicy: Retain
        local:
          path: /home/
        nodeAffinity:
          required:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - for-rancher-k8s-cluster002
      ---
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: local-pvc
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 100Gi
      ---
      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: mysql
      spec:
        serviceName: "mysql"
        selector:
          matchLabels:
            app: mysql
        template:
          metadata:
            labels:
              app: mysql
          spec:
            containers:
            - image: mysql:5.6
              name: mysql
              env:
              - name: MYSQL_ROOT_PASSWORD
                value: "mysql"
              volumeMounts:
              - name: local
                mountPath: /var/lib/mysql
            volumes:
              - name: local
                persistentVolumeClaim:
                  claimName: local-pvc
    2. 执行以下命令部署PV、PVC及MySQL应用。
      kubectl --kubeconfig rancher_huhehaote_kubeconfig apply -f mysql/mysql.yaml
    3. 执行以下命令查看创建的MySQL应用。
      kubectl --kubeconfig rancher_huhehaote_kubeconfig get pod

      预期输出:

      NAME      READY   STATUS    RESTARTS   AGE
      mysql-0   1/1     Running   0          171m
  4. 执行以下命令登录MySQL,创建数据库、建表,并写入测试数据。
    kubectl --kubeconfig rancher_huhehaote_kubeconfig exec -it mysql-0 sh
    root@mysql-0:/# mysql -u root -pmysql
    
    create database test;
    create table student(id int, name varchar(20),age int);
    insert into student values (1,2,3);
  5. 在注册集群(即Cluster_A集群)中创建备份任务。具体操作,请参见创建备份任务
    开启对 default命名空间的备份。 MySQL应用备份待备份任务 mysql-backup-111的状态为 Completed后,您可以在Cluster_B集群 应用备份页面的 备份和快照页签下看到Cluster_A集群的备份任务。
  6. 在托管版集群(即Cluster_B集群)中备份和快照页签下,在备份任务mysql-backup-111的右侧操作列单击制作快照
    本示例,在 生成快照对话框, 转换为存储类列选择 alicloud-disk(即云盘)。 MySQL应用生成快照待快照生成,即对应PVC的状态变为 ConvertionCompletedMySQL制作快照
  7. 在Cluster_B集群中创建恢复任务restore-111
    MySQL应用创建恢复任务
  8. 验证任务是否恢复成功。
    1. 执行以下命令查看MySQL应用。
      kubectl --kubeconfig rancher_online_kube -n mysql-111 get pod

      预期输出:

      NAME      READY   STATUS    RESTARTS   AGE
      mysql-0   1/1     Running   0          37m
    2. 登录恢复的数据库查看数据。
      查看数据库从预期输出可得,应用及写入数据均和线下集群的数据相同。