平滑迁移

目标

假设用户安装了一个 Kubernetes 单集群,该集群已经部署了很多资源。用户希望通过 Karmada 将单集群扩展成多集群,并将已部署的资源从原集群迁移到 Karmada。

在此背景下,本节将引导您完成:

  • 以资源为粒度将所有已部署资源从原集群迁移到 Karmada。
  • 应用更高优先级的 PropagationPolicy,以满足以应用为粒度的更多分发需求。

前提条件

Karmada 及多个子集群已安装

步骤一: 运行命令

  1. git clone https://github.com/karmada-io/karmada
  2. cd karmada
  3. hack/local-up-karmada.sh
  4. export KUBECONFIG=~/.kube/karmada.config:~/.kube/members.config

说明:

在开始之前,我们应该至少安装三个kubernetes集群,一个用于安装 Karmada 控制平面,另外两个作为成员集群。 为了方便,我们直接使用 hack/local-up-karmada.sh 脚本快速准备上述集群。

执行上述命令后,您将看到Karmada控制面和多个成员集群已安装完成。

在 karmada-controller-manager 开启 PropagationPolicyPreemption 特性开关

步骤二: 运行命令

  1. kubectl --context karmada-host get deploy karmada-controller-manager -n karmada-system -o yaml | sed '/- --failover-eviction-timeout=30s/{n;s/- --v=4/- --feature-gates=PropagationPolicyPreemption=true\n &/g}' | kubectl --context karmada-host replace -f -

说明:

PropagationPolicy Priority and Preemption 特性是在 v1.7 版本中引入的,它由特性开关 PropagationPolicyPreemption 控制,默认是关闭的。

您只需执行上面的一条命令即可启用此特性开关。或者,如果您想使用更谨慎的方法,您可以这样做:

  1. 执行 kubectl --context karmada-host edit deploy karmada-controller-manager -n karmada-system
  2. 检查 spec.template.spec.containers[0].command 字段是否有 --feature-gates=PropagationPolicyPreemption=true 这一行。
  3. 如果没有,您需要添加 --feature-gates=PropagationPolicyPreemption=true 到上述字段中。

在成员集群中预置资源

为了模拟成员集群中已经存在现有资源,我们将一些简单的 Deployment 和 Service 部署到 member1 集群。

步骤三: 编写代码

创建新文件 /tmp/deployments-and-services.yaml 并写入以下文本:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deploy
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: nginx
  9. replicas: 2
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx:latest
  18. ports:
  19. - containerPort: 80
  20. ---
  21. apiVersion: v1
  22. kind: Service
  23. metadata:
  24. name: nginx-svc
  25. spec:
  26. selector:
  27. app: nginx
  28. type: NodePort
  29. ports:
  30. - port: 80
  31. nodePort: 30000
  32. targetPort: 80

步骤四: 运行命令

  1. $ kubectl --context member1 apply -f /tmp/deployments-and-services.yaml
  2. deployment.apps/nginx-deploy created
  3. service/nginx-svc created
  4. deployment.apps/hello-deploy created
  5. service/hello-svc created

因此,我们可以使用 member1 作为已部署现有资源的集群。

指导

将所有资源迁移到 Karmada

步骤一: 运行命令

  1. $ kubectl --context karmada-apiserver apply -f /tmp/deployments-and-services.yaml
  2. deployment.apps/nginx-deploy created
  3. service/nginx-svc created
  4. deployment.apps/hello-deploy created
  5. service/hello-svc created

说明:

相同的 Deployments 和 Services 应被部署到 Karmada 控制面,作为 ResourceTemplate

步骤二: 编写代码

创建新文件 /tmp/pp-for-migrating-deployments-and-services.yaml 并写入以下文本:

  1. apiVersion: policy.karmada.io/v1alpha1
  2. kind: PropagationPolicy
  3. metadata:
  4. name: migrate-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. - apiVersion: v1
  16. kind: Service
  17. schedulerName: default-scheduler

说明:

请注意以下两个字段:

  • spec.conflictResolution: Overwrite:该字段的值必须是 Overwrite
  • spec.resourceSelectors:筛选要迁移的资源, 你可以自定义 ResourceSelector

步骤三: 运行命令

应用上述 PropagationPolicy 到 Karmada 控制面:

  1. $ kubectl --context karmada-apiserver apply -f /tmp/pp-for-migrating-deployments-and-services.yaml
  2. propagationpolicy.policy.karmada.io/migrate-pp created

步骤四: 验证

  1. $ kubectl --context karmada-apiserver get deploy
  2. NAME READY UP-TO-DATE AVAILABLE AGE
  3. nginx-deploy 2/2 2 2 38s
  4. $ kubectl --context karmada-apiserver get rb
  5. NAME SCHEDULED FULLYAPPLIED AGE
  6. nginx-deploy-deployment True True 13s
  7. nginx-svc-service True True 13s

您将看到 Karmada 中的 Deployment 已全部就绪,并且 ResourceBindingFULLYAPPLIED 为 True,这表示 member1 集群中的现有资源已被 Karmada 接管。

至此,您已经完成了迁移,是不是很简单?

应用更高优先级的 PropagationPolicy

步骤五: 编写代码

创建新文件 /tmp/pp-for-nginx-app.yaml 并写入以下文本:

  1. apiVersion: policy.karmada.io/v1alpha1
  2. kind: PropagationPolicy
  3. metadata:
  4. name: nginx-pp
  5. spec:
  6. conflictResolution: Overwrite
  7. placement:
  8. clusterAffinity:
  9. clusterNames:
  10. - member1
  11. - member2 ## propagate to more clusters other than member1
  12. priority: 10 ## priority greater than above PropagationPolicy (10 > 0)
  13. preemption: Always ## preemption should equal to Always
  14. resourceSelectors:
  15. - apiVersion: apps/v1
  16. kind: Deployment
  17. name: nginx-deploy
  18. - apiVersion: v1
  19. kind: Service
  20. name: nginx-svc
  21. schedulerName: default-scheduler

步骤六: 运行命令

应用上述 PropagationPolicy 到 Karmada 控制面:

  1. $ kubectl --context karmada-apiserver apply -f /tmp/pp-for-nginx-app.yaml
  2. propagationpolicy.policy.karmada.io/nginx-pp created

步骤七: 验证

  1. $ kubectl --context member2 get deploy -o wide
  2. NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
  3. nginx-deploy 2/2 2 2 5m24s nginx nginx:latest app=nginx
  4. $ kubectl --context member2 get svc -o wide
  5. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
  6. nginx-svc NodePort 10.13.161.255 <none> 80:30000/TCP 54s app=nginx
  7. ...

您将看到 nginx 应用相关的资源被分发到 member2 集群,这表示更高优先级的 PropagationPolicy 生效了。