批量迁移

场景

假设用户安装了一个 Kubernetes 单集群,该集群已经部署了很多资源。

用户希望通过 Karmada 将单集群扩展成多集群,并将已部署的资源从原集群迁移到 Karmada。 用户要求已经存在的 Pod 在迁移过程中不受影响,或者说相关容器不会重新启动。

那么,如何实现资源的平滑迁移呢?

批量迁移 - 图1

推荐的迁移方式

如果用户只需迁移个别资源,参考 promote-legacy-workload 逐个资源迁移即可。

如果用户想批量迁移资源,建议您首先通过几个 PropagationPolicy 以资源为粒度接管所有资源, 然后,如果您还有其他以应用为粒度的分发需求,则可以应用更高优先级的 PropagationPolicy 来抢占它们。

那么,如何以资源为粒度接管所有资源?你可以按如下操作:

批量迁移 - 图2

步骤一

由于现有资源将由 Karmada 接管,因此不再需要将相关的YAML配置应用于成员集群。 也就是说,您可以停止相应的操作或流水线。

步骤二

将所有资源的 YAML 配置应用到 Karmada 控制面, 作为 Karmada 的 ResourceTemplate

步骤三

编写 PropagationPolicy, 并将其应用到 Karmada 控制面。 您需要注意以下两个字段:

  • spec.conflictResolution: Overwrite该字段的值必须是 Overwrite
  • spec.resourceSelectors:指定哪些资源需要被迁移。

这里提供两个例子:

示例 1. 迁移所有的 Deployment

如果您希望把所有的 Deployment 从 member1 集群迁移到 Karmada,你需要应用以下配置:

  1. apiVersion: policy.karmada.io/v1alpha1
  2. kind: PropagationPolicy
  3. metadata:
  4. name: deployments-pp
  5. spec:
  6. conflictResolution: Overwrite
  7. placement:
  8. clusterAffinity:
  9. clusterNames:
  10. - member1
  11. priority: 0
  12. resourceSelectors:
  13. - apiVersion: apps/v1
  14. kind: Deployment
  15. schedulerName: default-scheduler

示例 2. 迁移所有的 Service

如果您希望把所有的 Service 从 member1 集群迁移到 Karmada,你需要应用以下配置:

  1. apiVersion: policy.karmada.io/v1alpha1
  2. kind: PropagationPolicy
  3. metadata:
  4. name: services-pp
  5. spec:
  6. conflictResolution: Overwrite
  7. placement:
  8. clusterAffinity:
  9. clusterNames:
  10. - member1
  11. priority: 0
  12. resourceSelectors:
  13. - apiVersion: v1
  14. kind: Service
  15. schedulerName: default-scheduler

步骤四

余下的迁移操作将由Karmada自动完成。

PropagationPolicy 抢占及 Demo

在此基础上,如果您还有以应用为粒度的分发需求,则可以应用更高优先级的 PropagationPolicy 来抢占上文提及的用于迁移的 Policy。 详细的 Demo 可以参考教程:平滑迁移