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

前提条件

已创建两个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集群应用备份页签恢复页签下选择Cluster_A集群的备份任务,执行恢复操作。具体操作,请参见创建恢复任务

方式二:使用Velero工具迁移应用

本文假设从Cluster_A中将命名空间nginx-examples下的应用迁移到Cluster_B。您需要按照以下步骤进行应用迁移。

  1. 在Cluster_A集群中,安装Velero客户端(推荐安装1.5版本)和备份服务组件,并配置连接OSS名为mybackups的Bucket。具体操作,请参见Velero客户端安装备份服务组件
  2. 在Cluster_B集群中安装Velero客户端(推荐安装1.5版本)和备份服务组件,并配置连接OSS名为mybackups的Bucket。
  3. 在Cluster_A集群中备份命名空间nginx-examples下的应用,例如生成备份名称为nginx-backup
  4. 在Cluster_B集群中引用备份nginx-backup并创建恢复应用,完成应用从Cluster_A迁移到Cluster_B的流程。

通过在Cluster_A集群中备份应用和在Cluster_B集群中恢复应用的示例,具体说明如何完成应用的迁移操作。在备份和恢复应用前,您需完成上述步骤1步骤2的操作。备份和恢复应用的操作示例如下:

  1. 在Cluster_A集群中部署示例应用nginx-app-with-pv。
    1. 创建名为nginx-app-with-pv.yaml的文件,并将以下YAML内容复制至文件中。
      ---
      apiVersion: v1
      kind: Namespace
      metadata:
        name: nginx-example
        labels:
          app: nginx
      
      ---
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: nginx-logs
        namespace: nginx-example
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 20Gi
        storageClassName: alicloud-disk-ssd
      
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx-deployment
        namespace: nginx-example
      spec:
        replicas: 1
        template:
          metadata:
            labels:
              app: nginx
            annotations:
              pre.hook.backup.velero.io/container: fsfreeze
              pre.hook.backup.velero.io/command: '["/sbin/fsfreeze", "--freeze", "/var/log/nginx"]'
              post.hook.backup.velero.io/container: fsfreeze
              post.hook.backup.velero.io/command: '["/sbin/fsfreeze", "--unfreeze", "/var/log/nginx"]'
          spec:
            volumes:
              - name: nginx-logs
                persistentVolumeClaim:
                 claimName: nginx-logs
            containers:
            - image: nginx:1.7.9
              name: nginx
              ports:
              - containerPort: 80
              volumeMounts:
                - mountPath: "/var/log/nginx"
                  name: nginx-logs
                  readOnly: false
            # sync from gcr.io/heptio-images/fsfreeze-pause:latest
            - image: registry.cn-hangzhou.aliyuncs.com/acs/fsfreeze-pause:latest
              name: fsfreeze
              securityContext:
                privileged: true
              volumeMounts:
                - mountPath: "/var/log/nginx"
                  name: nginx-logs
                  readOnly: false
    2. 执行以下命令部署应用至Cluster_A集群中。
      kubectl apply -f nginx-app-with-pv.yam
  2. 执行以下命令查看应用相关信息。
    • 执行以下命令查看Deployment。
      kubectl -n nginx-example get deployment

      预期输出:

      NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
      deployment.extensions/nginx-deployment   1/1     1            1           108s
    • 执行以下命令查看Pod。
      kubectl -n nginx-example get pod

      预期输出:

      NAME                                    READY   STATUS    RESTARTS   AGE
      pod/nginx-deployment-7477779c4f-rz95l   2/2     Running   0          108s
    • 执行以下命令查看PVC。
      kubectl -n nginx-example get pvc

      预期输出:

      NAME                               STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS        AGE
      persistentvolumeclaim/nginx-logs   Bound    d-bp1eutshfe774exa5os2   20Gi       RWO            alicloud-disk-ssd   108s
  3. 备份示例应用所在的整个命名空间。
    • 执行以下命令备份应用所在的整个命名空间(不备份PV数据)。
      velero backup create nginx-backup-without-pv --include-namespaces nginx-example
    • 执行以下命令备份应用所在的整个命名空间(备份PV数据)。
      1. 执行以下命令为需要备份的Pod存储卷添加注解。
        kubectl -n nginx-example annotate pod/nginx-deployment-7477779c4f-rz95l backup.velero.io/backup-volumes=nginx-logs
      2. 执行以下命令备份应用。
        velero backup create nginx-backup-with-pv --include-namespaces nginx-example
  4. 可选:执行以下命令查看备份的应用信息。
    velero backup get

    预期输出(不备份PV数据):

    NAME                      STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
    nginx-backup-without-pv   Completed   0        0          2020-09-18 14:43:13 +0800 CST   29d       default            <none>
    从预期输出可以看出您已成功创建备份应用。
  5. 执行以下命令在Cluster_B集群恢复应用(不备份PV数据)。
    velero restore create --from-backup nginx-backup-without-pv