将组织迁移到另一个集群

本页面介绍如何将 Apigee Hybrid 组织从一个 Kubernetes 集群迁移到另一个 Kubernetes 集群。在以下情况下,您可能需要将组织迁移到另一个集群:

  • 托管现有集群的数据中心没有更多的容量,或者即将停用。
  • 集群正在运行旧基础架构或旧版 Kubernetes,并且您想要迁移到具有较新基础架构的集群。
  • 您希望将组织从多组织集群迁移到单独的集群。

请注意,将组织迁移到另一个 Hybrid 集群时,存在风险和限制。在执行迁移之前,请先阅读限制部分中的详细信息。

限制

将 Hybrid 组织迁移到另一个 Kubernetes 集群时,存在以下限制:

  • 将组织数据迁移到新的 Kubernetes 集群时,存在数据丢失的风险。在迁移组织之前,您应按照 Hybrid 备份说明在该 Kubernetes 集群中备份所有组织的数据。
  • 在一个组织的所有键空间中,组织迁移支持的数据大小上限为 5GB(缓存和配额除外)。
  • 缓存数据不会迁移。Hybrid 会重新构建缓存数据。
  • 配额数据不会迁移。Hybrid 会重置配额数据。
  • 您只能将组织迁移到不包含现有 Hybrid 部署的 Kubernetes 集群。不支持迁移到已有 Hybrid 部署的集群。
  • 要迁移的组织只能迁移到具有单区域部署的新集群。单区域部署启动并运行后,您可以按照多区域部署中所述的区域扩展过程扩展到其他区域。
  • Cassandra 集群应该在所有区域都运行良好。

迁移组织

按照以下说明将 Hybrid 组织从一个 Kubernetes 集群迁移到另一个 Kubernetes 集群:

  1. 在包含要迁移的 Hybrid 组织的 Kubernetes 集群上启用备份(如果尚未启用)。如需了解 Hybrid 备份,请参阅 Cassandra 备份概览
  2. 使用以下命令启动 Hybrid 备份作业:
    kubectl create job -n apigee --from=cronjob/apigee-cassandra-backup <backup job name>

    <backup job name> 可以是任何有效的容器名称。

  3. 备份作业完成后,请按照监控备份的以下部分中的说明验证备份是否已成功完成:
    • “检查备份作业的状态”
    • “检查备份日志”
  4. 验证备份是否成功后,记下备份日志末尾的 ID 编号。例如,成功的备份日志应包含如下所示的行:
    INFO: completed upload for 20230207004250
    记下行末尾的多位数数字。您日后需要用到此编号。
  5. 将 Kubernetes 上下文切换到目标 Kubernetes 集群:
    kubectl config use-context <destination cluster name> # <destination cluster name>

    其中 <destination cluster name> 是目标 Kubernetes 集群的名称。

  6. 按照在单个区域中恢复中的说明,将备份数据恢复到目标 Kubernetes 集群中。
    • 使用要迁移到目标 Hybrid 部署的组织的 override.yaml 文件。
    • 务必将 restore:snapshotTimestamp 值设置为第 4 步中的备份日志所显示的多位数数字。请参阅在单个区域中恢复
  7. 恢复完成后,从目标 Kubernetes 集群中删除所有组织数据(要迁移的组织的数据除外)。Hybrid 备份文件包含所有组织的数据,包括您可能不希望迁移的组织。目标 Hybrid 部署恢复后,您需要按照以下步骤移除复制到该部署中的所有额外组织数据:
    1. 验证当前上下文是否为目标 Kubernetes 集群的正确上下文:
      kubectl config current-context
    2. apigee-cassandra-default-0 pod 执行 exec:
      kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
    3. 执行以下命令:
      find /opt/apigee/data/apigee-cassandra/ -iname '*_hybrid' -not -iname '*<migrated org name>*' -type d -maxdepth 2 -printf "%f\n"

      如需了解如何查找 <migrated org name>,请参阅获取已迁移组织的名称

      复制输出中显示的所有名称的列表。在第 7. f 步中您需要用到此列表。

    4. 退出 apigee-cassandra-default-0 pod。
    5. 按照创建用于调试的客户端容器中的说明,创建 Cassandra 调试客户端 pod。在看到 cqlsh 提示后,继续执行下一步。
    6. cqlsh 提示中,执行以下命令:
      • desc keyspaces;

        确保此命令不返回任何错误。

      • 对于在第 7.c 步中创建的列表中的每个名称,请运行以下命令:
        drop keyspace <name>
    7. 退出 Cassandra 调试客户端 pod。
    8. 执行 cqlsh 命令后,请在目标 Kubernetes 集群中的所有 Cassandra pod 上运行以下命令:
      • kubectl exec -it -n apigee  -- /bin/bash
      • find /opt/apigee/data/apigee-cassandra/ -iname '*_hybrid' -not -iname '*<migrated org name>*' -type d -maxdepth 2

        如需了解如何查找 <migrated org name>,请参阅获取已迁移组织的名称

      • find /opt/apigee/data/apigee-cassandra/ -iname '*_hybrid' -not -iname '**' -type d -maxdepth 2 -exec rm -rf {} +
    9. 退出 Cassandra pod。
  8. 将 Kubernetes 上下文切换到来源 Kubernetes 集群:
    kubectl config use-context <source cluster name>

    其中,<source cluster name> 是来源 kubernetes 集群的名称。

  9. 从来源 Kubernetes 集群中删除已迁移的组织。请务必在删除命令中使用该组织的 overrides.yaml 文件:
    1. 验证当前上下文是否为来源 Kubernetes 集群的正确上下文:
      kubectl config current-context

      如果需要,请将 Kubernetes 上下文设置为需要停用的集群和组织。

      列出当前上下文以查看每个集群的上下文名称:

      kubectl config get-contexts

      将上下文设置为要停用的集群和区域:

      kubectl config use-context CONTEXT_NAME

      其中,CONTEXT_NAME 是集群和区域的上下文名称。

      例如:

          kubectl config get-contexts
          CURRENT   NAME                                                   CLUSTER                                                AUTHINFO                                               NAMESPACE
                    gke_example-org-1_us-central1_example-cluster-1        gke_example-org-1_us-central1_example-cluster-1        gke_example-org-1_us-central1_example-cluster-1        apigee
          *         gke_example-org-1_us-central1_example-cluster-2        gke_example-org-1_us-central1_example-cluster-2        gke_example-org-1_us-central1_example-cluster-2        apigee
                    gke_example-org-1_us-west1_example-cluster-2           gke_example-org-1_us-west1_example-cluster-2           gke_example-org-1_us-west1_example-cluster-2           apigee
      
          kubectl config use-context gke_example-org-1_us-west1_example-cluster-2
    2. 删除虚拟主机。

      Helm

      对每个环境组重复此步骤:

      helm -n apigee delete ENV_GROUP_NAME
      

      apigeectl

      $APIGEECTL_HOME/apigeectl delete --settings virtualhost -f OVERRIDES_FILE.yaml
    3. 删除环境。

      Helm

      对每个环境重复运行以下命令:

      helm -n apigee delete ENV_NAME
      

      apigeectl

      $APIGEECTL_HOME/apigeectl delete --all-envs -f OVERRIDES_FILE.yaml
    4. 删除 Apigee 组织。

      Helm

      helm -n apigee delete ORG_NAME
      

      apigeectl

      $APIGEECTL_HOME/apigeectl delete -f OVERRIDES_FILE.yaml --org
    5. 对 apigee-cassandra-default-0 pod 执行 exec:
      kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
    6. 执行以下命令:
      find /opt/apigee/data/apigee-cassandra/ -iname '*<migrated org name>_hybrid' -type d -maxdepth 2 -printf "%f\n"

      如需了解如何查找 <migrated org name>,请参阅获取已迁移组织的名称

      复制输出中显示的所有名称的列表。 在第 9. j 步中您需要用到此列表。

    7. 退出 apigee-cassandra-default-0 pod。
    8. 按照创建用于调试的客户端容器中的说明,创建 Cassandra 调试客户端 pod。在看到 cqlsh 提示后,继续执行下一步。
    9. cqlsh 提示中,执行以下命令:
      desc keyspaces;

      确保此命令不返回任何错误。

    10. 对于在第 10.f 步中创建的列表中的每个名称,请运行以下命令:
      drop keyspace <name>;
    11. 退出 Cassandra 调试客户端 pod。
    12. 执行 cqlsh 命令后,请在来源 Kubernetes 集群中的所有 Cassandra pod 上运行以下命令:
      • kubectl exec -it -n apigee <cassandra pod name> -- /bin/bash
      • find /opt/apigee/data/apigee-cassandra/ -iname '*<migrated org name>_hybrid' -type d -maxdepth 2

        如需了解如何查找 <migrated org name>,请参阅获取已迁移组织的名称

      • find /opt/apigee/data/apigee-cassandra/ -iname '*<migrated org name>_hybrid' -type d -maxdepth 2 -exec rm -rf {} +
    13. 退出 Cassandra Pod。

获取已迁移组织的名称

上一部分介绍的过程中的一些步骤需要已迁移组织的名称。如需获取已迁移组织的名称,请执行以下操作:

  1. 从组织的 overrides.yaml 文件中获取组织名称。请务必检查要迁移的组织的 override.yaml 文件。
  2. 如果组织名称包含任何短划线“-”,请将所有短划线“-”替换为下划线“_”。