【Karmada使用教程】如何通过 Karmada 完成集群平滑迁移及回滚

举报
云容器大未来 发表于 2025/12/19 09:35:26 2025/12/19
【摘要】 Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。本系列文章将介绍Karmada的使用教程,本文介绍如何通过 Karmada 完成集群平滑迁移及回滚。

Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。本系列文章将介绍Karmada的使用教程,本文介绍如何通过 Karmada 完成集群平滑迁移及回滚

KARMADA.png

目标


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

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

将应用从单集群迁移到 Karmada。

回滚应用的迁移。


前提条件

▍Karmada 及多个子集群已安装

1️⃣ 步骤一: 运行命令

git clone https://github.com/karmada-io/karmada
cd karmada
hack/local-up-karmada.sh
export KUBECONFIG=~/.kube/karmada.config:~/.kube/members.config
📄 说明:在开始之前,我们应该至少安装三个kubernetes集群,一个用于安装 Karmada 控制平面,另外两个作为成员集群。 为了方便,我们直接使用 hack/local-up-karmada.sh 脚本快速准备上述集群。
执行上述命令后,您将看到Karmada控制面和多个成员集群已安装完成。


▍在成员集群中预置资源

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

2️⃣ 步骤二: 编写代码

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

3️⃣ 步骤三: 运行命令

$ kubectl --context member1 apply -f /tmp/deployments.yaml
deployment.apps/nginx-deploy created

$ karmadactl --karmada-context karmada-apiserver get deploy --operation-scope=all
NAME           CLUSTER   READY   UP-TO-DATE   AVAILABLE   AGE   ADOPTION
nginx-deploy   member1   2/2     2            2           15m   N

您将看到当前 nginx-deploy 部署在 member1 集群,ADOPTION=N 表示它此时不是由 Karmada 管理。


指导

▍将应用迁移到 Karmada

为了使教程更简单易懂,假设应用仅由上述一个简单的 Deployment 构成。

1️⃣ 步骤一: 运行命令

$ kubectl --context karmada-apiserver apply -f /tmp/deployments.yaml
deployment.apps/nginx-deploy created

$ karmadactl --karmada-context karmada-apiserver get deploy --operation-scope=all
NAME           CLUSTER   READY   UP-TO-DATE   AVAILABLE   AGE   ADOPTION
nginx-deploy   Karmada   0/2     0            0           7s    -
nginx-deploy   member1   2/2     2            2           16m   N

您将看到该 Deployment 被部署到 Karmada 控制面,作为 ResourceTemplate, 此时尚无匹配的 PropagationPolicy 对其分发。

2️⃣ 步骤二: 编写代码

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

apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
  name: migrate-pp
spec:
  conflictResolution: Overwrite
  placement:
    clusterAffinity:
      clusterNames:
      - member1
  resourceSelectors:
  - apiVersion: apps/v1
    kind: Deployment
    name: nginx-deploy


📄 说明:请注意以下两个字段:
  • spec.conflictResolution: Overwrite:该字段的值必须是 Overwrite。
  • spec.resourceSelectors:筛选要迁移的资源, 你可以自定义 ResourceSelector。

3️⃣ 步骤三: 运行命令

应用上述 PropagationPolicy 到 Karmada 控制面:

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

4️⃣ 步骤四: 验证

$ karmadactl --karmada-context karmada-apiserver get deploy --operation-scope=all
NAME           CLUSTER   READY   UP-TO-DATE   AVAILABLE   AGE   ADOPTION
nginx-deploy   Karmada   2/2     2            2           34s   -
nginx-deploy   member1   2/2     2            2           16m   Y

$ karmadactl --karmada-context karmada-apiserver get pods --operation-scope=all
NAME                            CLUSTER   READY   STATUS    RESTARTS   AGE
nginx-deploy-54b9c68f67-4qjrz   member1   1/1     Running   0          16m
nginx-deploy-54b9c68f67-f4qpm   member1   1/1     Running   0          16m

您将看到所有 Deployment 已就绪,并且 member1 集群的 nginx-deploy 成功被 Karmada 接管:

  • AGE=16m 说明该资源是被接管而不是重新创建,相应的 pods 不会发生重启。
  • ADOPTION=Y 表示该资源现在由 Karmada 管理。

至此,您已经完成了迁移。


迁移回滚

5️⃣ 步骤五: 对 PropagationPolicy 设置 preserveResourcesOnDeletion

执行下述命令修改 PropagationPolicy/migrate-pp,设置 spec.preserveResourcesOnDeletion=true

$ kubectl --context karmada-apiserver patch pp migrate-pp --type='json' -p '[{"op": "replace", "path": "/spec/preserveResourcesOnDeletion", "value": true}]'
propagationpolicy.policy.karmada.io/nginx-pp patched

6️⃣ 步骤六:从控制面删除资源模板

执行下述命令:

$ kubectl --context karmada-apiserver delete -f /tmp/deployments.yaml
deployment.apps "nginx-deploy" deleted

7️⃣ 步骤七:验证

执行下述命令:

$ karmadactl --karmada-context karmada-apiserver get deploy --operation-scope=all
NAME           CLUSTER   READY   UP-TO-DATE   AVAILABLE   AGE   ADOPTION
nginx-deploy   member1   2/2     2            2           17m   N

您将看到,控制面的资源模板已删除,并且成员集群中的资源依然可以保留,ADOPTION=N 表示该资源当前不是由 Karmada 管理。

至此,您已经完成了迁移回滚。

更多Karmada云原生多云容器引擎使用教程与技术交流,欢迎关注Karmada社区公众号或添加社区小助手k8s2222,回复Karmada进群。



karmada公众号.jpg

Karmada 公众号




Karmada 是CNCF 首个多云多集群容器编排项目(孵化级),旨在帮助用户像使用单个集群一样轻松管理跨云多集群,让基于 Karmada 的多云方案无缝融入云原生技术生态。社区吸引了来自华为、道客、浙江大学、滴滴、腾讯、中国电子云等60多家公司的全球贡献者,广泛分布于22个国家和地区。Karmada 现已在华为云、道客、兴业数金、中国移动、中国联通、携程、360集团、新浪、中通快递等众多企业单位生产应用,为企业提供从单集群到多云架构的平滑演进方案。

Karmada官网:https://karmada.io/

项目地址:https://github.com/karmada-io/karmada

Slack地址:https://slack.cncf.io/(#karmada)

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。