• [技术干货] 【Karmada使用教程】通过 Workload Rebalancer 触发重调度
    Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。本系列文章将介绍Karmada的使用教程,本文介绍如何通过 Workload Rebalancer 触发重调度。目标一般情况下,工作负载类资源被调度后,会保持调度结果不变,其副本分布不会轻易发生变化。 现在,假设某些特殊情况下,您想主动触发一次重调度,可以通过使用 WorkloadRebalancer 来实现。因此,本节将指导您如何使用 WorkloadRebalancer 来触发重调度。 前提条件▍Karmada 及多个子集群已安装运行安装命令:git clone cid:link_0cd karmadahack/local-up-karmada.shexport KUBECONFIG=~/.kube/karmada.config:~/.kube/members.config 说明:在开始之前,我们应该至少安装三个 kubernetes 集群,一个用于安装 Karmada 控制平面,另外两个作为成员集群。 为了方便,我们直接使用 hack/local-up-karmada.sh 脚本快速准备上述集群。执行上述命令后,您将看到 Karmada 控制平面和多个成员集群已安装完成。教程▍第一步:创建一个 Deployment首先准备一个名为 foo 的 Deployment,您可以创建一个新文件 deployment.yaml,内容如下:apiVersion: apps/v1kind: Deploymentmetadata: name: foo labels: app: testspec: replicas: 3 selector: matchLabels: app: foo template: metadata: labels: app: foo spec: terminationGracePeriodSeconds: 0 containers: - image: nginx name: foo resources: limits: cpu: 10m memory: 10Mi---apiVersion: policy.karmada.io/v1alpha1kind: PropagationPolicymetadata: name: default-ppspec: placement: clusterTolerations: - effect: NoExecute key: workload-rebalancer-test operator: Exists tolerationSeconds: 0 clusterAffinity: clusterNames: - member1 - member2 replicaScheduling: replicaDivisionPreference: Weighted replicaSchedulingType: Divided weightPreference: dynamicWeight: AvailableReplicas resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: foo namespace: default然后,运行下述命令来创建这些资源:kubectl --context karmada-apiserver apply -f deployment.yaml您可以通过下述方式来检查该步骤是否成功:$ karmadactl --karmada-context karmada-apiserver get deploy fooNAME CLUSTER READY UP-TO-DATE AVAILABLE AGE ADOPTIONfoo member1 2/2 2 2 20s Yfoo member2 1/1 1 1 20s Y可以看到,2 个副本分发到 member1 集群,1 个副本分发到 member2 集群。 ▍第二步:在 member1 集群添加 NoExecute 污点以模拟集群故障1)运行以下命令将 NoExecute 污点添加到 member1 集群:$ karmadactl --karmada-context=karmada-apiserver taint clusters member1 workload-rebalancer-test:NoExecutecluster/member1 tainted然后,由于集群故障转移,将触发重调度,并且所有副本将被分发到 member2 集群,您可以看到:$ karmadactl --karmada-context karmada-apiserver get deploy fooNAME CLUSTER READY UP-TO-DATE AVAILABLE AGE ADOPTIONfoo member2 3/3 3 3 57s Y2)运行以下命令从 member1 集群中移除上述 NoExecute 污点:$ karmadactl --karmada-context=karmada-apiserver taint clusters member1 workload-rebalancer-test:NoExecute-cluster/member1 untainted移除污点不会导致副本传播变化,因为调度结果是惰性的,所有副本将保持在 member2 集群中不变。 ▍第三步:创建一个 WorkloadRebalancer 来触发重调度为了触发上述资源的重调度,您可以创建一个新文件 workload-rebalancer.yaml,内容如下:apiVersion: apps.karmada.io/v1alpha1kind: WorkloadRebalancermetadata: name: demospec: workloads: - apiVersion: apps/v1 kind: Deployment name: foo namespace: default然后运行以下命令来创建该资源:kubectl --context karmada-apiserver apply -f workload-rebalancer.yaml您将得到 workloadrebalancer.apps.karmada.io/demo created 的结果,这意味着该资源创建成功。 ▍第四步:检查 WorkloadRebalancer 的状态运行以下命令:$ kubectl --context karmada-apiserver get workloadrebalancer demo -o yamlapiVersion: apps.karmada.io/v1alpha1kind: WorkloadRebalancermetadata: creationTimestamp: "2024-05-25T09:49:51Z" generation: 1 name: demospec: workloads: - apiVersion: apps/v1 kind: Deployment name: foo namespace: defaultstatus: finishTime: "2024-05-25T09:49:51Z" observedGeneration: 1 observedWorkloads: - result: Successful workload: apiVersion: apps/v1 kind: Deployment name: foo namespace: default因此,您可以在 workloadrebalancer/demo 的 status.observedWorkloads 字段中观察重调度的结果。 如上述结果所示,deployment/foo 已成功重新调度。 ▍第五步:观察 WorkloadRebalancer 的实际效果您可以观察 deployment/foo 的副本实际分发状态:$ karmadactl --karmada-context karmada-apiserver get deploy fooNAME CLUSTER READY UP-TO-DATE AVAILABLE AGE ADOPTIONfoo member1 2/2 2 2 3m14s Yfoo member2 1/1 1 1 4m37s Y您可以看到重调度已完成,有2个副本迁移回到 member1 集群,而 member2 集群中原有的1个副本保持不变。此外,您可以观察到由 default-scheduler 发出的调度事件,例如:$ kubectl --context karmada-apiserver describe deployment foo...Events: Type Reason Age From Message ---- ------ ---- ---- ------- ... Normal ScheduleBindingSucceed 3m34s (x2 over 4m57s) default-scheduler Binding has been scheduled successfully. Result: {member1:2, member2:1} Normal AggregateStatusSucceed 3m20s (x20 over 4m57s) resource-binding-status-controller Update resourceBinding(default/foo-deployment) with AggregatedStatus successfully. ... ▍第六步:更新并自动清理 WorkloadRebalancer假设您希望 WorkloadRebalancer 能在将来自动清理,您只需编辑资源声明并将 spec.ttlSecondsAfterFinished 字段设置为 300,例如:apiVersion: apps.karmada.io/v1alpha1kind: WorkloadRebalancermetadata: name: demospec: ttlSecondsAfterFinished: 300 workloads: - apiVersion: apps/v1 kind: Deployment name: foo namespace: default在您应用了这个修改后,这个 WorkloadRebalancer 资源将在 300 秒后自动删除。更多Karmada云原生多云容器引擎使用教程与技术交流,欢迎关注Karmada社区公众号或添加社区小助手k8s2222,回复Karmada进群。  Karmada 公众号 Karmada 是CNCF 首个多云多集群容器编排项目(孵化级),旨在帮助用户像使用单个集群一样轻松管理跨云多集群,让基于 Karmada 的多云方案无缝融入云原生技术生态。社区吸引了来自华为、道客、浙江大学、滴滴、腾讯、中国电子云等60多家公司的全球贡献者,广泛分布于22个国家和地区。Karmada 现已在华为云、道客、兴业数金、中国移动、中国联通、携程、360集团、新浪、中通快递等众多企业单位生产应用,为企业提供从单集群到多云架构的平滑演进方案。Karmada官网:https://karmada.io/项目地址:cid:link_0Slack地址:https://slack.cncf.io/(#karmada)
  • [技术干货] 【Karmada使用教程】通过原生 Service 跨集群访问服务
    Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。本系列文章将介绍Karmada的使用教程,本文介绍如何通过原生 Service 跨集群访问服务。在 Karmada 中,MultiClusterService 可以让用户通过原生 Service 域名(例如 foo.svc)跨集群访问服务,目的是让用户获得如在单个集群中访问服务般访问跨集群服务的流畅体验。📄 本文档提供了这样一个案例:启用 MultiClusterService 来通过原生 Service 跨集群访问服务。前提条件▍Karmada 已安装您可以参考快速入门安装 Karmada,或直接运行 hack/local-up-karmada.sh 脚本,该脚本也用于运行 E2E 测试。▍成员集群网络确保至少已有两个集群加入 Karmada,并且成员集群之间的容器网络已连通。如果您使用 hack/local-up-karmada.sh 脚本部署 Karmada,Karmada 中会有 3 个成员集群,并且集群 member1 和 member2 间的容器网络已连通。您可以使用 Submariner 或其他相关开源项目来连接成员集群之间的网络。📌 注意:为了防止路由冲突,集群中 Pod 和 Service 的 CIDR 必须互不重叠。▍在 karmada-controller-manager 中启用 MultiClusterService要在 karmada-controller-manager 中启用 MultiClusterService 功能,请运行以下命令:kubectl --context karmada-host get deploy karmada-controller-manager -n karmada-system -o yaml | sed '/- --v=4/i \ - --feature-gates=MultiClusterService=true' | kubectl --context karmada-host replace -f -📌 请注意,MultiClusterService 功能默认是禁用的,可以通过 --feature-gates=MultiClusterService=true 参数开启。如果您倾向于更谨慎的方法,请按照以下步骤操作:运行 kubectl --context karmada-host edit deploy karmada-controller-manager -n karmada-system。检查 spec.template.spec.containers[0].command 字段中是否存在 --feature-gates=MultiClusterService=true。如果没有,添加 --feature-gates=MultiClusterService=true 来开启功能。在 member1 集群中部署 Deployment我们需要在 member1 集群中部署 Deployment:apiVersion: apps/v1kind: Deploymentmetadata: name: nginx labels: app: nginxspec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx resources: requests: cpu: 25m memory: 64Mi limits: cpu: 25m memory: 64Mi---apiVersion: policy.karmada.io/v1alpha1kind: PropagationPolicymetadata: name: nginx-propagationspec: resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: nginx placement: clusterAffinity: clusterNames: - member1部署完成后,您可以检查创建的 Pod:$ karmadactl get poNAME CLUSTER READY STATUS RESTARTS AGEnginx-5c54b4855f-6sq9s member1 1/1 Running 0 28snginx-5c54b4855f-vp948 member1 1/1 Running 0 28s在 member2 集群中部署 curl Pod让我们在 member2 集群中部署一个 curl Pod:apiVersion: apps/v1kind: Deploymentmetadata: name: curl labels: app: curlspec: replicas: 1 selector: matchLabels: app: curl template: metadata: labels: app: curl spec: containers: - image: curlimages/curl:latest command: ["sleep", "infinity"] name: curl resources: requests: cpu: 25m memory: 64Mi limits: cpu: 25m memory: 64Mi---apiVersion: policy.karmada.io/v1alpha1kind: PropagationPolicymetadata: name: curl-propagationspec: resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: curl placement: clusterAffinity: clusterNames: - member2部署完成后,您可以检查创建的 Pod:$ karmadactl get po -C member2NAME CLUSTER READY STATUS RESTARTS AGEcurl-6894f46595-c75rc member2 1/1 Running 0 15s稍后,我们将在此 Pod 中执行 curl 命令。在 Karmada 中部署 MultiClusterService 与 Service现在,我们不使用 PropagationPolicy/ClusterPropagationPolicy,而是利用 MultiClusterService 来分发 Service。要在 Karmada 中启用 MultiClusterService,请部署以下 yaml:apiVersion: v1kind: Servicemetadata: name: nginxspec: ports: - port: 80 targetPort: 80 selector: app: nginx---apiVersion: networking.karmada.io/v1alpha1kind: MultiClusterServicemetadata: name: nginxspec: types: - CrossCluster consumerClusters: - name: member2 providerClusters: - name: member1从 member2 集群访问后端 Pod要从 member2 集群访问 member1 集群中的后端 Pod,请执行以下命令:$ karmadactl exec -C member2 curl-6894f46595-c75rc -it -- sh~ $ curl http://nginx.defaultHello, world!Version: 1.0.0Hostname: nginx-0在此案例中,Pod 仅位于 member1 集群。但是,使用 MultiClusterService,就可以通过原生 Service 域名从 member2 集群实现跨集群访问。更多Karmada云原生多云容器引擎使用教程与技术交流,欢迎关注Karmada社区公众号或添加社区小助手k8s2222,回复Karmada进群。 Karmada 公众号Karmada 是CNCF 首个多云多集群容器编排项目(孵化级),旨在帮助用户像使用单个集群一样轻松管理跨云多集群,让基于 Karmada 的多云方案无缝融入云原生技术生态。社区吸引了来自华为、道客、浙江大学、滴滴、腾讯、中国电子云等60多家公司的全球贡献者,广泛分布于22个国家和地区。Karmada 现已在华为云、道客、兴业数金、中国移动、中国联通、携程、360集团、新浪、中通快递等众多企业单位生产应用,为企业提供从单集群到多云架构的平滑演进方案。 Karmada官网:https://karmada.io/项目地址:cid:link_1Slack地址:https://slack.cncf.io/(#karmada)
  • [技术干货] 【Karmada使用教程】使用 CronFederatedHPA 自动伸缩跨集群 Deployment
    Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。本系列文章将介绍Karmada的使用教程,本文介绍如何使用 CronFederatedHPA 自动伸缩跨集群 Deployment 。在Karmada中,CronFederatedHPA 负责扩展工作负载(如Deployments)的副本或 FederatedHPA 的 minReplicas/maxReplicas。其目的是为了主动扩展业务,以处理突发的负载峰值。本文提供了一个示例,说明如何为跨集群部署 nginx deployment 启用CronFederatedHPA。 前提条件▍Karmada 已安装您可以参考快速入门安装 Karmada,或直接运行 hack/local-up-karmada.sh 脚本,该脚本也用于运行 E2E 测试。 在 member1 和 member2 集群中部署 Deployment我们需要在 member1 和 member2 集群中部署 Deployment(2 个副本)apiVersion: apps/v1kind: Deploymentmetadata: name: nginx labels: app: nginxspec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx resources: requests: cpu: 25m memory: 64Mi limits: cpu: 25m memory: 64Mi---apiVersion: policy.karmada.io/v1alpha1kind: PropagationPolicymetadata: name: nginx-propagationspec: resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: nginx placement: clusterAffinity: clusterNames: - member1 - member2 replicaScheduling: replicaDivisionPreference: Weighted replicaSchedulingType: Divided weightPreference: staticWeightList: - targetCluster: clusterNames: - member1 weight: 1 - targetCluster: clusterNames: - member2 weight: 1部署完成后,您可以检查已创建的 pods:$ karmadactl get podsNAME CLUSTER READY STATUS RESTARTS AGEnginx-777bc7b6d7-rmmzv member1 1/1 Running 0 104snginx-777bc7b6d7-9gf7g member2 1/1 Running 0 104s 在 Karmada 控制平面部署 CronFederatedHPA然后,在 Karmada 控制平面中部署 CronFederatedHPA,以扩容 Deployment:apiVersion: autoscaling.karmada.io/v1alpha1kind: CronFederatedHPAmetadata: name: nginx-cronfhpa namespace: defaultspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx rules: - name: "scale-up" schedule: "*/1 * * * *" targetReplicas: 5 suspend: falsespec.schedule 遵循以下格式:# ┌───────────── minute (0 - 59)# │ ┌───────────── hour (0 - 23)# │ │ ┌───────────── day of the month (1 - 31)# │ │ │ ┌───────────── month (1 - 12)# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;# │ │ │ │ │ 7 is also Sunday on some systems)# │ │ │ │ │ OR sun, mon, tue, wed, thu, fri, sat# │ │ │ │ │# * * * * *表达式*/1 * * * *的意思是nginx deployment的副本应该每分钟更新为5个,确保了处理接下来的流量突发流量洪峰。 测试伸缩功能一分钟后,通过CronFederatedHPA将nginx部署的副本扩展到5个。现在让我们检查Pod的数量,以验证是否按预期进行了扩展:$ karmadactl get podsNAME CLUSTER READY STATUS RESTARTS AGEnginx-777bc7b6d7-8v9b4 member2 1/1 Running 0 18snginx-777bc7b6d7-9gf7g member2 1/1 Running 0 8m2snginx-777bc7b6d7-5snhz member1 1/1 Running 0 18snginx-777bc7b6d7-rmmzv member1 1/1 Running 0 8m2snginx-777bc7b6d7-z9kwg member1 1/1 Running 0 18s通过检查 CronFederatedHPA 的状态字段,您可以访问扩展历史记录:$ kubectl --kubeconfig $HOME/.kube/karmada.config --context karmada-apiserver get cronfhpa -oyaml-> # kubectl --kubeconfig $HOME/.kube/karmada.config --context karmada-apiserver get cronfhpa/nginx-cronfhpa -oyamlapiVersion: autoscaling.karmada.io/v1alpha1kind: CronFederatedHPAmetadata: name: nginx-cronfhpa namespace: defaultspec: rules: - failedHistoryLimit: 3 name: scale-up schedule: '*/1 * * * *' successfulHistoryLimit: 3 suspend: false targetReplicas: 5 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginxstatus: executionHistories: - nextExecutionTime: "2023-07-29T03:27:00Z" # 下一次执行时间 ruleName: scale-up successfulExecutions: - appliedReplicas: 5 # CronFederatedHPA将replicas更新为5 executionTime: "2023-07-29T03:26:00Z" # 上一次实际执行时间 scheduleTime: "2023-07-29T03:26:00Z" # 上一次期待执行时间伸缩历史包括成功和失败操作的信息。更多Karmada云原生多云容器引擎使用教程与技术交流,欢迎关注Karmada社区公众号或添加社区小助手k8s2222,回复Karmada进群。 Karmada 公众号 Karmada 是CNCF 首个多云多集群容器编排项目(孵化级),旨在帮助用户像使用单个集群一样轻松管理跨云多集群,让基于 Karmada 的多云方案无缝融入云原生技术生态。社区吸引了来自华为、道客、浙江大学、滴滴、腾讯、中国电子云等60多家公司的全球贡献者,广泛分布于22个国家和地区。Karmada 现已在华为云、道客、兴业数金、中国移动、中国联通、携程、360集团、新浪、中通快递等众多企业单位生产应用,为企业提供从单集群到多云架构的平滑演进方案。Karmada官网:https://karmada.io/项目地址:cid:link_1Slack地址:https://slack.cncf.io/(#karmada)
  • [技术干货] 【Karmada使用教程】如何通过 Karmada 完成集群平滑迁移及回滚
    Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。本系列文章将介绍Karmada的使用教程,本文介绍如何通过 Karmada 完成集群平滑迁移及回滚。目标 假设用户安装了一个 Kubernetes 单集群,该集群已经部署了很多资源。用户希望通过 Karmada 将单集群扩展成多集群,并将已部署的资源从原集群迁移到 Karmada。在此背景下,本节将引导您完成:✅ 将应用从单集群迁移到 Karmada。✅ 回滚应用的迁移。前提条件 ▍Karmada 及多个子集群已安装1️⃣ 步骤一: 运行命令git clone cid:link_0cd karmadahack/local-up-karmada.shexport KUBECONFIG=~/.kube/karmada.config:~/.kube/members.config📄 说明:在开始之前,我们应该至少安装三个kubernetes集群,一个用于安装 Karmada 控制平面,另外两个作为成员集群。 为了方便,我们直接使用 hack/local-up-karmada.sh 脚本快速准备上述集群。执行上述命令后,您将看到Karmada控制面和多个成员集群已安装完成。 ▍在成员集群中预置资源为了模拟成员集群中已经存在现有资源,我们将简单的 Deployment 部署到 member1 集群。2️⃣ 步骤二: 编写代码创建新文件 /tmp/deployments.yaml 并写入以下文本:apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deployspec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 803️⃣ 步骤三: 运行命令$ kubectl --context member1 apply -f /tmp/deployments.yamldeployment.apps/nginx-deploy created$ karmadactl --karmada-context karmada-apiserver get deploy --operation-scope=allNAME CLUSTER READY UP-TO-DATE AVAILABLE AGE ADOPTIONnginx-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.yamldeployment.apps/nginx-deploy created$ karmadactl --karmada-context karmada-apiserver get deploy --operation-scope=allNAME CLUSTER READY UP-TO-DATE AVAILABLE AGE ADOPTIONnginx-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/v1alpha1kind: PropagationPolicymetadata: name: migrate-ppspec: 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.yamlpropagationpolicy.policy.karmada.io/migrate-pp created4️⃣ 步骤四: 验证$ karmadactl --karmada-context karmada-apiserver get deploy --operation-scope=allNAME CLUSTER READY UP-TO-DATE AVAILABLE AGE ADOPTIONnginx-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=allNAME CLUSTER READY STATUS RESTARTS AGEnginx-deploy-54b9c68f67-4qjrz member1 1/1 Running 0 16mnginx-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 patched6️⃣ 步骤六:从控制面删除资源模板执行下述命令:$ kubectl --context karmada-apiserver delete -f /tmp/deployments.yamldeployment.apps "nginx-deploy" deleted7️⃣ 步骤七:验证执行下述命令:$ karmadactl --karmada-context karmada-apiserver get deploy --operation-scope=allNAME CLUSTER READY UP-TO-DATE AVAILABLE AGE ADOPTIONnginx-deploy member1 2/2 2 2 17m N您将看到,控制面的资源模板已删除,并且成员集群中的资源依然可以保留,ADOPTION=N 表示该资源当前不是由 Karmada 管理。至此,您已经完成了迁移回滚。更多Karmada云原生多云容器引擎使用教程与技术交流,欢迎关注Karmada社区公众号或添加社区小助手k8s2222,回复Karmada进群。 Karmada 公众号 Karmada 是CNCF 首个多云多集群容器编排项目(孵化级),旨在帮助用户像使用单个集群一样轻松管理跨云多集群,让基于 Karmada 的多云方案无缝融入云原生技术生态。社区吸引了来自华为、道客、浙江大学、滴滴、腾讯、中国电子云等60多家公司的全球贡献者,广泛分布于22个国家和地区。Karmada 现已在华为云、道客、兴业数金、中国移动、中国联通、携程、360集团、新浪、中通快递等众多企业单位生产应用,为企业提供从单集群到多云架构的平滑演进方案。Karmada官网:https://karmada.io/项目地址:cid:link_0Slack地址:https://slack.cncf.io/(#karmada)
  • [技术干货] 【Karmada使用教程】使用 CronFederatedHPA 自动伸缩 FederatedHPA
    Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。本系列文章将介绍Karmada的使用教程,本文介绍如何使用 CronFederatedHPA 自动伸缩 FederatedHPA。在Karmada中,CronFederatedHPA用于伸缩工作负载的副本数(任何具有scale子资源的工作负载,如Deployment)或FederatedHPA的 minReplicas/maxReplicas,目的是提前伸缩业务以满足突发的负载峰值。CronFederatedHPA旨在在特定时间内扩展资源。当工作负载仅由CronFederatedHPA直接进行扩展时,在到达指定的时间为止,其副本将保持不变。这意味着直到指定时间之前,它失去了处理更多请求的能力。因此,为了确保工作负载可以提前扩容以满足后续高峰负载和后续实时业务需求,我们建议首先使用CronFederatedHPA来伸缩FederatedHPA。然后,FederatedHPA可以根据其度量标准来伸缩工作负载的规模。📝 本文档将为您提供一个示例,演示如何将 CronFederatedHPA 应用于 FederatedHPA。前提条件▍Karmada 已安装您可以参考 快速入门 安装 Karmada,或直接运行 hack/local-up-karmada.sh 脚本,该脚本也用于运行 E2E 测试。在 member1 和 member2 集群中部署 Deployment我们需要在 member1 和 member2 集群中部署 Deployment(2 个副本):apiVersion: apps/v1kind: Deploymentmetadata: name: nginx labels: app: nginxspec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx resources: requests: cpu: 25m memory: 64Mi limits: cpu: 25m memory: 64Mi---apiVersion: policy.karmada.io/v1alpha1kind: PropagationPolicymetadata: name: nginx-propagationspec: resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: nginx placement: clusterAffinity: clusterNames: - member1 - member2 replicaScheduling: replicaDivisionPreference: Weighted replicaSchedulingType: Divided weightPreference: staticWeightList: - targetCluster: clusterNames: - member1 weight: 1 - targetCluster: clusterNames: - member2 weight: 1部署完成后,您可以检查已创建的 pods:$ karmadactl get podsNAME CLUSTER READY STATUS RESTARTS AGEnginx-777bc7b6d7-cmt6k member1 1/1 Running 0 27mnginx-777bc7b6d7-8lmcg member2 1/1 Running 0 27m在 Karmada 控制平面中部署 FederatedHPA让我们在Karmada控制平面中创建一个FederatedHPA,用来管理跨集群的nginx deployment:apiVersion: autoscaling.karmada.io/v1alpha1kind: FederatedHPAmetadata: name: nginx-fhpaspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx minReplicas: 1 maxReplicas: 10 behavior: scaleDown: stabilizationWindowSeconds: 10 scaleUp: stabilizationWindowSeconds: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 80FederatedHPA会在平均CPU利用率超过80%时扩容工作负载的副本。相反,如果平均CPU利用率低于80%,则会缩容工作负载的副本数量。在 Karmada 控制平面中部署CronFederatedHPA为了自动伸缩FederatedHPA的minReplicas,让我们在Karmada控制平面中创建CronFederatedHPA:apiVersion: autoscaling.karmada.io/v1alpha1kind: CronFederatedHPAmetadata: name: nginx-cronfhpa namespace: defaultspec: scaleTargetRef: apiVersion: autoscaling.karmada.io/v1alpha1 kind: FederatedHPA name: nginx-fhpa rules: - name: "scale-up" schedule: "*/1 * * * *" targetMinReplicas: 5spec.schedule 遵循以下格式:# ┌───────────── minute (0 - 59)# │ ┌───────────── hour (0 - 23)# │ │ ┌───────────── day of the month (1 - 31)# │ │ │ ┌───────────── month (1 - 12)# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;# │ │ │ │ │ 7 is also Sunday on some systems)# │ │ │ │ │ OR sun, mon, tue, wed, thu, fri, sat# │ │ │ │ │# * * * * *表达式 */1 * * * * 表示每分钟将FederatedHPA的minReplicas更新为5。此操作能确保工作负载会被扩容到至少5个副本,以处理突发流量洪峰。测试扩容功能等待一分钟后,FederatedHPA的minReplicas会被CronFederatedHPA更新为5,此操作会触发 nginx deployment 的副本数被扩容为5。检查Pod的数量,看副本是否已扩容:$ karmadactl get poNAME CLUSTER READY STATUS RESTARTS AGEnginx-777bc7b6d7-7vl2r member1 1/1 Running 0 59snginx-777bc7b6d7-cmt6k member1 1/1 Running 0 27mnginx-777bc7b6d7-pc5dk member1 1/1 Running 0 59snginx-777bc7b6d7-8lmcg member2 1/1 Running 0 27mnginx-777bc7b6d7-pghl7 member2 1/1 Running 0 59s如果业务需求需要更多副本,FederatedHPA将根据指标(例如CPU利用率)自动伸缩副本数。通过检查CronFederatedHPA的状态字段,您可以查看伸缩历史记录:apiVersion: autoscaling.karmada.io/v1alpha1kind: CronFederatedHPAmetadata: name: nginx-cronfhpa namespace: defaultspec: rules: - failedHistoryLimit: 3 name: scale-up schedule: '*/1 * * * *' successfulHistoryLimit: 3 suspend: false targetMinReplicas: 5 scaleTargetRef: apiVersion: autoscaling.karmada.io/v1alpha1 kind: FederatedHPA name: nginx-fhpastatus: executionHistories: - nextExecutionTime: "2023-07-29T07:53:00Z" # 下一次执行时间 ruleName: scale-up successfulExecutions: - appliedMinReplicas: 5 # CronFederatedHPA将 minReplicas 更新为5 executionTime: "2023-07-29T07:52:00Z" # 上一次实际执行时间 scheduleTime: "2023-07-29T07:52:00Z" # 上一次期待执行时间伸缩历史包括成功和失败操作的信息。更多Karmada云原生多云容器引擎使用教程与技术交流,欢迎关注Karmada社区公众号或添加社区小助手k8s2222,回复Karmada进群。 Karmada 公众号 Karmada 是CNCF 首个多云多集群容器编排项目(孵化级),旨在帮助用户像使用单个集群一样轻松管理跨云多集群,让基于 Karmada 的多云方案无缝融入云原生技术生态。社区吸引了来自华为、道客、浙江大学、滴滴、腾讯、中国电子云等60多家公司的全球贡献者,广泛分布于22个国家和地区。Karmada 现已在华为云、道客、兴业数金、中国移动、中国联通、携程、360集团、新浪、中通快递等众多企业单位生产应用,为企业提供从单集群到多云架构的平滑演进方案。 Karmada官网:https://karmada.io/项目地址:cid:link_1Slack地址:https://slack.cncf.io/(#karmada)
  • [技术干货] 【Karmada使用教程】FederatedHPA 基于自定义指标扩缩容
    Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。本系列文章将介绍Karmada的使用教程,本文介绍如何通过FederatedHPA 基于自定义指标扩缩容。在 Karmada 中,为了自动扩展工作负载以满足需求,FederatedHPA 会跨多个集群扩/缩容工作负载。FederatedHPA 不仅支持 CPU 和内存等资源指标,还支持自定义指标,这有助于扩展 FederatedHPA 的使用场景。本文档将引导您完成这样一个案例:启用 FederatedHPA 利用自定义指标来自动扩缩容跨集群应用。演示案例将执行以下操作:member1 集群中存在一个示例 Deployment 的 Pod。Service 部署在 member1 和 member2 集群。请求多集群 Service 并触发 Pod 的自定义指标(http_requests_total)增长。Pod 副本将在 member1 和 member2 集群中扩容。前提条件▍Karmada 已安装您可以参考快速入门安装 Karmada,或直接运行 hack/local-up-karmada.sh 脚本,该脚本也用于运行 E2E 测试。▍成员集群网络确保至少已有两个集群加入 Karmada,并且成员集群之间的容器网络已连通。如果您使用 hack/local-up-karmada.sh 脚本部署 Karmada,Karmada 中会有 3 个成员集群,并且集群 member1 和 member2 间的容器网络已连通。您可以使用 Submariner 或其他相关开源项目来连接成员集群之间的网络。注意:为了防止路由冲突,集群中 Pod 和 Service 的 CIDR 必须互不重叠。▍ServiceExport 和 ServiceImport 自定义资源已安装我们需要在成员集群中安装 ServiceExport 和 ServiceImport 以启用多集群 Service。在 Karmada 控制平面 上安装了 ServiceExport 和 ServiceImport 后,我们就可以创建 ClusterPropagationPolicy,将以下两个 CRD 分发到成员集群。# propagate ServiceExport CRDapiVersion: policy.karmada.io/v1alpha1kind: ClusterPropagationPolicymetadata: name: serviceexport-policyspec: resourceSelectors: - apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition name: serviceexports.multicluster.x-k8s.io placement: clusterAffinity: clusterNames: - member1 - member2--- # propagate ServiceImport CRDapiVersion: policy.karmada.io/v1alpha1kind: ClusterPropagationPolicymetadata: name: serviceimport-policyspec: resourceSelectors: - apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition name: serviceimports.multicluster.x-k8s.io placement: clusterAffinity: clusterNames: - member1 - member2▍成员集群中已安装 prometheus 和 prometheus-adapter我们需要为成员集群安装 prometheus 和 prometheus-adapter 以提供自定义 metrics API。 可以通过在成员集群中运行以下命令来安装:git clone https://github.com/prometheus-operator/kube-prometheus.gitcd kube-prometheuskubectl apply --server-side -f manifests/setupkubectl wait \ --for condition=Established \ --all CustomResourceDefinition \ --namespace=monitoringkubectl apply -f manifests/我们可以通过下面的命令验证安装:$ kubectl --kubeconfig=/root/.kube/members.config --context=member1 get po -nmonitoringNAME READY STATUS RESTARTS AGEalertmanager-main-0 2/2 Running 0 30halertmanager-main-1 2/2 Running 0 30halertmanager-main-2 2/2 Running 0 30hblackbox-exporter-6bc47b9578-zcbb7 3/3 Running 0 30hgrafana-6b68cd6b-vmw74 1/1 Running 0 30hkube-state-metrics-597db7f85d-2hpfs 3/3 Running 0 30hnode-exporter-q8hdx 2/2 Running 0 30hprometheus-adapter-57d9587488-86ckj 1/1 Running 0 29hprometheus-adapter-57d9587488-zrt29 1/1 Running 0 29hprometheus-k8s-0 2/2 Running 0 30hprometheus-k8s-1 2/2 Running 0 30hprometheus-operator-7d4b94944f-kkwkk 2/2 Running 0 30h▍Karmada 控制平面已安装 karmada-metrics-adapter我们需要在 Karmada 控制平面中安装 karmada-metrics-adapter 以提供 metrics API,通过运行以下命令来安装:hack/deploy-metrics-adapter.sh ${host_cluster_kubeconfig} ${host_cluster_context} ${karmada_apiserver_kubeconfig} ${karmada_apiserver_context_name}如果您使用 hack/local-up-karmada.sh 脚本部署 Karmada,将默认安装 karmada-metrics-adapter。在 member1 和 member2 集群中部署 Deployment我们需要在 member1 和 member2 集群中部署示例 Deployment(1 个副本)和 Service。 apiVersion: apps/v1kind: Deploymentmetadata: name: sample-app labels: app: sample-appspec: replicas: 1 selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: containers: - image: luxas/autoscale-demo:v0.1.2 name: metrics-provider ports: - name: http containerPort: 8080---apiVersion: v1kind: Servicemetadata: labels: app: sample-app name: sample-appspec: ports: - name: http port: 80 protocol: TCP targetPort: 8080 selector: app: sample-app type: ClusterIP---apiVersion: policy.karmada.io/v1alpha1kind: PropagationPolicymetadata: name: app-propagationspec: resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: sample-app - apiVersion: v1 kind: Service name: sample-app placement: clusterAffinity: clusterNames: - member1 - member2 replicaScheduling: replicaDivisionPreference: Weighted replicaSchedulingType: Divided weightPreference: staticWeightList: - targetCluster: clusterNames: - member1 weight: 1 - targetCluster: clusterNames: - member2 weight: 1部署完成后,您可以检查 Pod 和 Service 的分发情况:$ karmadactl get pods --operation-scope membersNAME CLUSTER READY STATUS RESTARTS AGEsample-app-9b7d8c9f5-xrnfx member1 1/1 Running 0 111s$ karmadactl get svc --operation-scope membersNAME CLUSTER TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ADOPTIONsample-app member1 ClusterIP 10.11.29.250 <none> 80/TCP 3m53s Y在 member1 和 member2 集群中监控您的应用为了监控您的应用,您需要配置一个指向该应用的 ServiceMonitor。假设您已配置 Prometheus 实例来使用带有 app:sample-app 标签的 ServiceMonitor,那么请创建一个 ServiceMonitor 以通过 Service 监控应用的指标:apiVersion: monitoring.coreos.com/v1kind: ServiceMonitormetadata: name: sample-app labels: app: sample-appspec: selector: matchLabels: app: sample-app endpoints: - port: httpkubectl create -f sample-app.monitor.yaml现在,您应该可以看到自定义指标 (http_requests_total) 出现在 Prometheus 实例中。通过仪表盘找到指标,并确保其含有 Namespace 和 Pod 标签。如果没有,请检查 ServiceMonitor 中的标签与 Prometheus CRD 中的标签是否匹配。在 member1 和 member2 集群中启动您的适配器部署了 prometheus-adapter 之后,为了暴露自定义指标,您需要更新适配器配置。apiVersion: v1kind: ConfigMapmetadata: name: adapter-config namespace: monitoringdata: config.yaml: |- "rules": - "seriesQuery": | {namespace!="",__name__!~"^container_.*"} "resources": "template": "<<.Resource>>" "name": "matches": "^(.*)_total" "as": "" "metricsQuery": | sum by (<<.GroupBy>>) ( irate ( <<.Series>>{<<.LabelMatchers>>}[1m] ) )kubectl apply -f prom-adapter.config.yaml# Restart prom-adapter podskubectl rollout restart deployment prometheus-adapter -n monitoring在 member1 和 member2 集群中注册 metrics API您还需要向 API 聚合器(主 Kubernetes API 服务器的一部分)注册自定义指标 API。为此,您需要创建一个 APIService 资源。apiVersion: apiregistration.k8s.io/v1kind: APIServicemetadata: name: v1beta2.custom.metrics.k8s.iospec: group: custom.metrics.k8s.io groupPriorityMinimum: 100 insecureSkipTLSVerify: true service: name: prometheus-adapter namespace: monitoring version: v1beta2 versionPriority: 100kubectl create -f api-service.yaml该 API 已注册为 custom.metrics.k8s.io/v1beta2,您可以使用以下命令进行验证:kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta2/namespaces/default/pods/*/http_requests?selector=app%3Dsample-app"输出结果类似于:{ "kind": "MetricValueList", "apiVersion": "custom.metrics.k8s.io/v1beta2", "metadata": {}, "items": [ { "describedObject": { "kind": "Pod", "namespace": "default", "name": "sample-app-9b7d8c9f5-9lw6b", "apiVersion": "/v1" }, "metric": { "name": "http_requests", "selector": null }, "timestamp": "2023-06-14T09:09:54Z", "value": "66m" } ]} 如果 karmada-metrics-adapter 安装成功,您也可以在 Karmada 控制平面中使用上述命令进行验证。在 Karmada 控制平面部署 FederatedHPA接下来让我们在 Karmada 控制平面中部署 FederatedHPA。apiVersion: autoscaling.karmada.io/v1alpha1kind: FederatedHPAmetadata: name: sample-appspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: sample-app minReplicas: 1 maxReplicas: 10 behavior: scaleDown: stabilizationWindowSeconds: 10 scaleUp: stabilizationWindowSeconds: 10 metrics: - type: Pods pods: metric: name: http_requests target: averageValue: 700m type: Value部署完成后,您可以检查 FederatedHPA:NAME REFERENCE-KIND REFERENCE-NAME MINPODS MAXPODS REPLICAS AGEsample-app Deployment sample-app 1 10 1 15d将 Service 导出到 member1 集群正如前文所提到的,我们需要一个多集群 Service 来将请求转发到 member1 和 member2 集群中的 Pod,因此让我们创建这个多集群 Service。在 Karmada 控制平面创建一个 ServiceExport 对象,然后创建一个 PropagationPolicy 将 ServiceExport 对象分发到 member1 和 member2 集群。apiVersion: multicluster.x-k8s.io/v1alpha1kind: ServiceExportmetadata: name: sample-app---apiVersion: policy.karmada.io/v1alpha1kind: PropagationPolicymetadata: name: serve-export-policyspec: resourceSelectors: - apiVersion: multicluster.x-k8s.io/v1alpha1 kind: ServiceExport name: sample-app placement: clusterAffinity: clusterNames: - member1 - member2在 Karmada 控制平面创建一个 ServiceImport 对象,然后创建一个 PropagationPolicy 将 ServiceImport 对象分发到 member1 集群。apiVersion: multicluster.x-k8s.io/v1alpha1kind: ServiceImportmetadata: name: sample-appspec: type: ClusterSetIP ports: - port: 80 protocol: TCP---apiVersion: policy.karmada.io/v1alpha1kind: PropagationPolicymetadata: name: serve-import-policyspec: resourceSelectors: - apiVersion: multicluster.x-k8s.io/v1alpha1 kind: ServiceImport name: sample-app placement: clusterAffinity: clusterNames: - member1部署完成后,您可以检查多集群 Service:$ karmadactl get svc --operation-scope membersNAME CLUSTER TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ADOPTIONderived-sample-app member1 ClusterIP 10.11.59.213 <none> 80/TCP 9h Y在 member1 集群中安装 hey http 负载测试工具为了发送 http 请求,这里我们使用 hey。下载 hey 并复制到 kind 集群容器中。wget https://hey-release.s3.us-east-2.amazonaws.com/hey_linux_amd64chmod +x hey_linux_amd64docker cp hey_linux_amd64 member1-control-plane:/usr/local/bin/hey测试扩容首先检查 Pod 的分发情况。$ karmadactl get pods --operation-scope membersNAME CLUSTER READY STATUS RESTARTS AGEsample-app-9b7d8c9f5-xrnfx member1 1/1 Running 0 111s检查多集群 Service ip。$ karmadactl get svc --operation-scope membersNAME CLUSTER TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ADOPTIONderived-sample-app member1 ClusterIP 10.11.59.213 <none> 80/TCP 20m Y使用 hey 请求多集群 Service,以提高 nginx Pod 的自定义指标(http_requests_total)。docker exec member1-control-plane hey -c 1000 -z 1m http://10.11.59.213/metrics等待 15 秒,副本将扩容,然后您可以再次检查 Pod 分发状态。$ karmadactl get po --operation-scope members -l app=sample-appNAME CLUSTER READY STATUS RESTARTS AGEsample-app-9b7d8c9f5-454vz member2 1/1 Running 0 84ssample-app-9b7d8c9f5-7fjhn member2 1/1 Running 0 69ssample-app-9b7d8c9f5-ddf4s member2 1/1 Running 0 69ssample-app-9b7d8c9f5-mxqmh member2 1/1 Running 0 84ssample-app-9b7d8c9f5-qbc2j member2 1/1 Running 0 69ssample-app-9b7d8c9f5-2tgxt member1 1/1 Running 0 69ssample-app-9b7d8c9f5-66n9s member1 1/1 Running 0 69ssample-app-9b7d8c9f5-fbzps member1 1/1 Running 0 84ssample-app-9b7d8c9f5-ldmhz member1 1/1 Running 0 84ssample-app-9b7d8c9f5-xrnfx member1 1/1 Running 0 87m测试缩容1 分钟后,负载测试工具将停止运行,然后您可以看到工作负载在多个集群中缩容。$ karmadactl get pods --operation-scope members -l app=sample-appNAME CLUSTER READY STATUS RESTARTS AGEsample-app-9b7d8c9f5-xrnfx member1 1/1 Running 0 91m更多Karmada云原生多云容器引擎使用教程与技术交流,欢迎关注Karmada社区公众号或添加社区小助手k8s2222,回复Karmada进群。Karmada 公众号 Karmada 是CNCF 首个多云多集群容器编排项目(孵化级),旨在帮助用户像使用单个集群一样轻松管理跨云多集群,让基于 Karmada 的多云方案无缝融入云原生技术生态。社区吸引了来自华为、道客、浙江大学、滴滴、腾讯、中国电子云等60多家公司的全球贡献者,广泛分布于22个国家和地区。Karmada 现已在华为云、道客、兴业数金、中国移动、中国联通、携程、360集团、新浪、中通快递等众多企业单位生产应用,为企业提供从单集群到多云架构的平滑演进方案。Karmada官网:https://karmada.io/项目地址:cid:link_0Slack地址:https://slack.cncf.io/(#karmada)
  • [技术干货] 【Karmada使用教程】使用资源指标跨集群弹性扩缩容
    Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。本系列文章将介绍Karmada的使用教程,本文介绍如何使用资源指标跨集群弹性扩缩容。在 Karmada 中,为了自动扩展工作负载以满足需求,FederatedHPA 会跨多个集群扩/缩容工作负载。当负载增加时,如果 Pod 数量低于配置的最大值,FederatedHPA 会扩容工作负载(Deployment、StatefulSet 或其他类似资源)的副本。当负载减少时,如果 Pod 数量高于配置的最小值,FederatedHPA 会缩容工作负载的副本。本文档将引导您完成这样 📝一个案例:启用 FederatedHPA 来自动扩缩容跨集群部署的 nginx。演示案例将执行以下操作: member1 集群中存在一个 Deployment 的 Pod。Service 部署在 member1 和 member2 集群。请求多集群 Service 来提高 Pod 的 CPU 使用率。Pod 副本将在 member1 和 member2 集群中扩容。前提条件▍Karmada 已安装您可以参考快速入门安装 Karmada,或直接运行 hack/local-up-karmada.sh 脚本,该脚本也用于运行 E2E 测试。▍成员集群网络确保至少已有两个集群加入 Karmada,并且成员集群之间的容器网络已连通。如果您使用 hack/local-up-karmada.sh 脚本部署 Karmada,Karmada 中会有 3 个成员集群,并且集群 member1 和 member2 间的容器网络已连通。您可以使用 Submariner 或其他相关开源项目来连接成员集群之间的网络。📌注意:为了防止路由冲突,集群中 Pod 和 Service 的 CIDR 必须互不重叠。▍ServiceExport 和 ServiceImport 自定义资源已安装我们需要在成员集群中安装 ServiceExport 和 ServiceImport 以启用多集群 Service。在 Karmada 控制平面 上安装了 ServiceExport 和 ServiceImport 后,我们就可以创建 ClusterPropagationPolicy,将以下两个 CRD 分发到成员集群。# propagate ServiceExport CRDapiVersion: policy.karmada.io/v1alpha1kind: ClusterPropagationPolicymetadata: name: serviceexport-policyspec: resourceSelectors: - apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition name: serviceexports.multicluster.x-k8s.io placement: clusterAffinity: clusterNames: - member1 - member2--- # propagate ServiceImport CRDapiVersion: policy.karmada.io/v1alpha1kind: ClusterPropagationPolicymetadata: name: serviceimport-policyspec: resourceSelectors: - apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition name: serviceimports.multicluster.x-k8s.io placement: clusterAffinity: clusterNames: - member1 - member2▍成员集群中已安装 metrics-server我们需要为成员集群安装 metrics-server 以提供 metrics API,通过运行以下命令来安装:hack/deploy-k8s-metrics-server.sh ${member_cluster_kubeconfig} ${member_cluster_context_name} 如果您使用 hack/local-up-karmada.sh 脚本部署 Karmada,则可以运行以下命令在三个成员集群中部署 metrics-server:hack/deploy-k8s-metrics-server.sh $HOME/.kube/members.config member1hack/deploy-k8s-metrics-server.sh $HOME/.kube/members.config member2hack/deploy-k8s-metrics-server.sh $HOME/.kube/members.config member3▍Karmada 控制平面已安装 karmada-metrics-adapter我们需要在 Karmada 控制平面中安装 karmada-metrics-adapter 以提供 metrics API,通过运行以下命令来安装:hack/deploy-metrics-adapter.sh ${host_cluster_kubeconfig} ${host_cluster_context} ${karmada_apiserver_kubeconfig} ${karmada_apiserver_context_name}如果您使用 hack/local-up-karmada.sh 脚本部署 Karmada,将默认安装 karmada-metrics-adapter。在 member1 和 member2 集群中部署 Deployment我们需要在 member1 和 member2 集群中部署 Deployment(1 个副本)和 Service。apiVersion: apps/v1kind: Deploymentmetadata: name: nginx labels: app: nginxspec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx resources: requests: cpu: 25m memory: 64Mi limits: cpu: 25m memory: 64Mi---apiVersion: v1kind: Servicemetadata: name: nginx-servicespec: ports: - port: 80 targetPort: 80 selector: app: nginx---apiVersion: policy.karmada.io/v1alpha1kind: PropagationPolicymetadata: name: nginx-propagationspec: resourceSelectors: - apiVersion: apps/v1 kind: Deployment name: nginx - apiVersion: v1 kind: Service name: nginx-service placement: clusterAffinity: clusterNames: - member1 - member2 replicaScheduling: replicaDivisionPreference: Weighted replicaSchedulingType: Divided weightPreference: staticWeightList: - targetCluster: clusterNames: - member1 weight: 1 - targetCluster: clusterNames: - member2 weight: 1部署完成后,您可以检查 Pod 和 Service 的分发情况:$ karmadactl get pods --operation-scope membersNAME CLUSTER READY STATUS RESTARTS AGEnginx-777bc7b6d7-mbdn8 member1 1/1 Running 0 9h$ karmadactl get svc --operation-scope membersNAME CLUSTER TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ADOPTIONnginx-service member1 ClusterIP 10.11.216.215 <none> 80/TCP 9h Ynginx-service member2 ClusterIP 10.13.46.61 <none> 80/TCP 9h Y在 Karmada 控制平面部署 FederatedHPA接下来让我们在 Karmada 控制平面中部署 FederatedHPA。apiVersion: autoscaling.karmada.io/v1alpha1kind: FederatedHPAmetadata: name: nginxspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx minReplicas: 1 maxReplicas: 10 behavior: scaleDown: stabilizationWindowSeconds: 10 scaleUp: stabilizationWindowSeconds: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 10部署完成后,您可以检查 FederatedHPA:$ kubectl --kubeconfig $HOME/.kube/karmada.config --context karmada-apiserver get fhpaNAME REFERENCE-KIND REFERENCE-NAME MINPODS MAXPODS REPLICAS AGEnginx Deployment nginx 1 10 1 9h将 Service 导出到 member1 集群正如前文所提到的,我们需要一个多集群 Service 来将请求转发到 member1 和 member2 集群中的 Pod,因此让我们创建这个多集群 Service。在 Karmada 控制平面创建一个 ServiceExport 对象,然后创建一个 PropagationPolicy 将 ServiceExport 对象分发到 member1 和 member2 集群。apiVersion: multicluster.x-k8s.io/v1alpha1kind: ServiceExportmetadata: name: nginx-service---apiVersion: policy.karmada.io/v1alpha1kind: PropagationPolicymetadata: name: serve-export-policyspec: resourceSelectors: - apiVersion: multicluster.x-k8s.io/v1alpha1 kind: ServiceExport name: nginx-service placement: clusterAffinity: clusterNames: - member1 - member2在 Karmada 控制平面创建一个 ServiceImport 对象,然后创建一个 PropagationPolicy 将 ServiceImport 对象分发到 member1 集群。apiVersion: multicluster.x-k8s.io/v1alpha1kind: ServiceImportmetadata: name: nginx-servicespec: type: ClusterSetIP ports: - port: 80 protocol: TCP---apiVersion: policy.karmada.io/v1alpha1kind: PropagationPolicymetadata: name: serve-import-policyspec: resourceSelectors: - apiVersion: multicluster.x-k8s.io/v1alpha1 kind: ServiceImport name: nginx-service placement: clusterAffinity: clusterNames: - member1部署完成后,您可以检查多集群 Service:$ karmadactl get svc --operation-scope membersNAME CLUSTER TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ADOPTIONderived-nginx-service member1 ClusterIP 10.11.59.213 <none> 80/TCP 9h Y在 member1 集群中安装 hey http 负载测试工具为了发送 http 请求,这里我们使用 hey。下载 hey 并复制到 kind 集群容器中。wget https://hey-release.s3.us-east-2.amazonaws.com/hey_linux_amd64chmod +x hey_linux_amd64docker cp hey_linux_amd64 member1-control-plane:/usr/local/bin/hey测试扩容首先检查 Pod 的分发情况。$ karmadactl get pods --operation-scope membersNAME CLUSTER READY STATUS RESTARTS AGEnginx-777bc7b6d7-mbdn8 member1 1/1 Running 0 61m检查多集群 Service ip。$ karmadactl get svc --operation-scope membersNAME CLUSTER TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ADOPTIONderived-nginx-service member1 ClusterIP 10.11.59.213 <none> 80/TCP 20m Y使用 hey 请求多集群 Service,以提高 nginx Pod 的 CPU 使用率。docker exec member1-control-plane hey -c 1000 -z 1m http://10.11.59.213等待 15 秒,副本将扩容,然后您可以再次检查 Pod 分发状态。$ karmadactl get pods --operation-scope members -l app=nginxNAME CLUSTER READY STATUS RESTARTS AGEnginx-777bc7b6d7-c2cfv member1 1/1 Running 0 22snginx-777bc7b6d7-mbdn8 member1 1/1 Running 0 62mnginx-777bc7b6d7-pk2s4 member1 1/1 Running 0 37snginx-777bc7b6d7-tbb4k member1 1/1 Running 0 37snginx-777bc7b6d7-znlj9 member1 1/1 Running 0 22snginx-777bc7b6d7-6n7d9 member2 1/1 Running 0 22snginx-777bc7b6d7-dfbnw member2 1/1 Running 0 22snginx-777bc7b6d7-fsdg2 member2 1/1 Running 0 37snginx-777bc7b6d7-kddhn member2 1/1 Running 0 22snginx-777bc7b6d7-lwn52 member2 1/1 Running 0 37s测试缩容1 分钟后,负载测试工具将停止运行,然后您可以看到工作负载在多个集群中缩容。$ karmadactl get pods --operation-scope members -l app=nginxNAME CLUSTER READY STATUS RESTARTS AGEnginx-777bc7b6d7-mbdn8 member1 1/1 Running 0 64m更多Karmada云原生多云容器引擎使用教程与技术交流,欢迎关注Karmada社区公众号或添加社区小助手k8s2222,回复Karmada进群。 Karmada 公众号 Karmada 是CNCF 首个多云多集群容器编排项目(孵化级),旨在帮助用户像使用单个集群一样轻松管理跨云多集群,让基于 Karmada 的多云方案无缝融入云原生技术生态。社区吸引了来自华为、道客、浙江大学、滴滴、腾讯、中国电子云等60多家公司的全球贡献者,广泛分布于22个国家和地区。Karmada 现已在华为云、道客、兴业数金、中国移动、中国联通、携程、360集团、新浪、中通快递等众多企业单位生产应用,为企业提供从单集群到多云架构的平滑演进方案。Karmada官网:https://karmada.io/项目地址:cid:link_1Slack地址:https://slack.cncf.io/(#karmada) 
  • [技术干货] 【Karmada使用教程】使用 Karmada-search 来体验多集群检索
     Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。本系列文章将介绍Karmada的使用教程,本文介绍如何通过使用 Karmada-search 来体验多集群检索。本指南将涵盖以下内容:✅ 在 Karmada 控制面上安装 karmada-search 组件✅ 缓存多个集群的 Deployment 资源。✅ 使用 OpenSearch 图形界面检索 Kubernetes 资源。前提条件在安装 karmada-search 之前,您必须先安装 Karmada 控制平面。要启动 Karmada,您可以参考安装概述(https://karmada.io/zh/docs/installation/)。如果您只是想尝试 Karmada,我们建议使用 hack/local-up-karmada.sh 构建开发环境。git clone cid:link_1cd karmadahack/local-up-karmada.sh安装 karmada-search如果您使用 hack/local-up-karmada.sh,那 karmada-search 已经安装好了。如果您通过 Helm 安装 Karmada,可以选择以下任意一种方式进行安装:在 host 模式下安装 karmada-searchhelm upgrade --install karmada -n karmada-system --create-namespace --dependency-update \ --cleanup-on-fail ./charts/karmada \ --set components={"search"}在 component 模式下单独安装 karmada-search为 karmada-search 编辑 values.yaml 文件:installMode: "component"components: [ "search"]...执行下述命令:kubectl config use-context hosthelm install karmada -n karmada-system ./charts/karmada如果您通过 Karmada Operator 安装 Karmada,可以在安装 Karmada 组件时,执行下述命令:kubectl create namespace testkubectl apply -f - <<EOFapiVersion: operator.karmada.io/v1alpha1kind: Karmadametadata: name: karmada-demo namespace: testspec: components: karmadaSearch: {}EOF此外,karmadactl 支持一键安装 karmada-search。karmadactl addons enable karmada-searchkarmadactl addons enable karmada-search有关更多详细信息,您可以参考 karmadactl addons instruction(https://karmada.io/zh/docs/reference/karmadactl/karmadactl-commands/karmadactl_addons)。缓存多个集群的 Deployment 资源在接下来的步骤中,我们将在缓存成员集群的 Deployment 资源。根据示例,我们已经将一个 nginx Deployment 分发到了 member1 和 member2。1️⃣ 创建一个 ResourceRegistry,它将缓存目标集群中的 Deployment 资源。### deployment-search.yamlapiVersion: search.karmada.io/v1alpha1kind: ResourceRegistrymetadata: name: deployment-searchspec: targetCluster: clusterNames: - member1 - member2 resourceSelectors: - apiVersion: apps/v1 kind: Deploymentkubectl --kubeconfig $HOME/.kube/karmada.config --context karmada-apiserver create -f deployment-search.yaml2️⃣ 通过 Kubernetes API 进行测试您可以通过以下命令从 member1 和 member2 获取 deployment 资源。kubectl --kubeconfig $HOME/.kube/karmada.config --context karmada-apiserver get --raw /apis/search.karmada.io/v1alpha1/search/cache/apis/apps/v1/deployments输出类似于(忽略不相关的字段):{ "kind": "List", "apiVersion": "apps/v1", "metadata": {}, "items": [{ "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision": "1", "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"metadata\":{\"annotations\":{},\"labels\":{\"app\":\"nginx\"},\"name\":\"nginx\",\"namespace\":\"default\"},\"spec\":{\"replicas\":2,\"selector\":{\"matchLabels\":{\"app\":\"nginx\"}},\"template\":{\"metadata\":{\"labels\":{\"app\":\"nginx\"}},\"spec\":{\"containers\":[{\"image\":\"nginx\",\"name\":\"nginx\"}]}}}}\n", "resource.karmada.io/cached-from-cluster": "member1", "resourcebinding.karmada.io/name": "nginx-deployment", "resourcebinding.karmada.io/namespace": "default", "resourcetemplate.karmada.io/uid": "b46d2736-78d8-47db-b589-6e819139ba33" }, "creationTimestamp": "2022-11-18T08:34:28Z", "generation": 1, "labels": { "app": "nginx", "propagationpolicy.karmada.io/name": "nginx-propagation", "propagationpolicy.karmada.io/namespace": "default", "resourcebinding.karmada.io/key": "687f7fb96f", "work.karmada.io/name": "nginx-687f7fb96f", "work.karmada.io/namespace": "karmada-es-member1" } } }, { "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "annotations": { "deployment.kubernetes.io/revision": "1", "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"apps/v1\",\"kind\":\"Deployment\",\"metadata\":{\"annotations\":{},\"labels\":{\"app\":\"nginx\"},\"name\":\"nginx\",\"namespace\":\"default\"},\"spec\":{\"replicas\":2,\"selector\":{\"matchLabels\":{\"app\":\"nginx\"}},\"template\":{\"metadata\":{\"labels\":{\"app\":\"nginx\"}},\"spec\":{\"containers\":[{\"image\":\"nginx\",\"name\":\"nginx\"}]}}}}\n", "resource.karmada.io/cached-from-cluster": "member2", "resourcebinding.karmada.io/name": "nginx-deployment", "resourcebinding.karmada.io/namespace": "default", "resourcetemplate.karmada.io/uid": "e785db97-4d17-4871-99be-6d629c556b89" }, "creationTimestamp": "2022-11-21T02:23:26Z", "generation": 1, "labels": { "app": "nginx", "propagationpolicy.karmada.io/name": "nginx-propagation", "propagationpolicy.karmada.io/namespace": "default", "resourcebinding.karmada.io/key": "687f7fb96f", "work.karmada.io/name": "nginx-687f7fb96f", "work.karmada.io/namespace": "karmada-es-member2" } } }]} 使用 OpenSearch 图形界面检索 Kubernetes 资源karmada-search 还支持将缓存资源同步到独立存储服务,如 Elasticsearch 或 OpenSearch。通过利用搜索引擎,您可以按字段和索引执行具有所有所需功能的全文搜索;根据分数对结果进行排名、按字段对结果进行排序,并聚合结果。以下是使用 OpenSearch 以图形界面检索 Kubernetes 资源的示例。1️⃣ 部署 OpenSearch 和 OpenSearch 仪表盘使用以下脚本部署 OpenSearch 和 OpenSearch 仪表盘。./hack/deploy-karmada-opensearch.sh $HOME/.kube/karmada.config karmada-host验证安装结果:kubectl --kubeconfig $HOME/.kube/karmada.config --context karmada-host get po -A输出类似于:NAMESPACE NAME READY STATUS RESTARTS AGEkarmada-system karmada-opensearch-77454fbcf5-7rpvz 1/1 Running 0 155mkarmada-system karmada-opensearch-dashboards-596bf4d9dd-n9429 1/1 Running 0 156m...2️⃣ 更新 ResourceRegistry 与 backendStore### deployment-search.yamlapiVersion: search.karmada.io/v1alpha1kind: ResourceRegistrymetadata: name: deployment-searchspec: backendStore: openSearch: addresses: - http://karmada-opensearch.karmada-system.svc:9200 targetCluster: clusterNames: - member1 - member2 resourceSelectors: - apiVersion: apps/v1 kind: Deploymentkubectl --kubeconfig $HOME/.kube/karmada.config --context karmada-apiserver apply -f deployment-search.yaml3️⃣ 暴露仪表板的服务您需要将 Web 服务暴露到主机端口,以便可以通过 HTTP 访问仪表板。kubectl --kubeconfig $HOME/.kube/karmada.config --context karmada-host port-forward svc/karmada-opensearch-dashboards 5601:5601 -nkarmada-system --address=0.0.0.04️⃣ 访问仪表盘访问 OpenSearch 仪表板(http://NodeIP:5601):现在 Deployment 的数据已经上传到 OpenSearch 中的 member1 和 member2。您可以利用搜索引擎自己体验多集群检索。更多Karmada云原生多云容器引擎使用教程与技术交流,欢迎关注Karmada社区公众号或添加社区小助手k8s2222,回复Karmada进群。 Karmada 公众号 Karmada 是CNCF 首个多云多集群容器编排项目(孵化级),旨在帮助用户像使用单个集群一样轻松管理跨云多集群,让基于 Karmada 的多云方案无缝融入云原生技术生态。社区吸引了来自华为、道客、浙江大学、滴滴、腾讯、中国电子云等60多家公司的全球贡献者,广泛分布于22个国家和地区。Karmada 现已在华为云、道客、兴业数金、中国移动、中国联通、携程、360集团、新浪、中通快递等众多企业单位生产应用,为企业提供从单集群到多云架构的平滑演进方案。Karmada官网:https://karmada.io/项目地址:cid:link_1Slack地址:https://slack.cncf.io/(#karmada)
  • [技术干货] 【Karmada使用教程】通过 Karmada 分发 CRD
    Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。本系列文章将介绍Karmada的使用教程,本文介绍如何通过 Karmada 分发 CRD。在本节中,我们将引导您完成以下内容:✅ 安装 Karmada 控制平面。✅ 将 CRD 分发到多个集群。✅ 在特定集群中自定义 CRD。启动 Karmada 集群想要启动 Karmada,您可以参考安装概述。如果您只想尝试 Karmada,请使用 hack/local-up-karmada.sh 构建开发环境。git clone cid:link_0cd karmadahack/local-up-karmada.sh分发 CRD下面的步骤指导您如何分发 CRD Guestbook。假设您在 Karmada 仓库的 guestbook 目录下。cd samples/guestbook使用 Karmada 配置设置 KUBECONFIG 环境变量。export KUBECONFIG=${HOME}/.kube/karmada.config1️⃣ 在 Karmada 的控制平面上创建 Guestbook CRDkubectl apply -f guestbooks-crd.yaml 此 CRD 应该被应用到 karmada-apiserver。2️⃣ 创建 ClusterPropagationPolicy,将 Guestbook CRD 分发到 member1kubectl apply -f guestbooks-clusterpropagationpolicy.yaml # guestbooks-clusterpropagationpolicy.yamlapiVersion: policy.karmada.io/v1alpha1kind: ClusterPropagationPolicymetadata: name: example-policyspec: resourceSelectors: - apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition name: guestbooks.webapp.my.domain placement: clusterAffinity: clusterNames: - member1根据 ClusterPropagationPolicy 中定义的规则,此 CRD 将分发到成员集群。📌 注意:在这里我们只能使用 ClusterPropagationPolicy 而不是 PropagationPolicy。 更多详细信息,请参考 FAQ PropagationPolicy and ClusterPropagationPolicy3️⃣ 在 Karmada 控制平面上创建名为 guestbook-sample 的 Guestbook CRkubectl apply -f guestbook.yaml4️⃣ 创建 PropagationPolicy,将 guestbook-sample 分发到 member1kubectl apply -f guestbooks-propagationpolicy.yaml# guestbooks-propagationpolicy.yamlapiVersion: policy.karmada.io/v1alpha1kind: PropagationPolicymetadata: name: example-policyspec: resourceSelectors: - apiVersion: webapp.my.domain/v1 kind: Guestbook placement: clusterAffinity: clusterNames: - member15️⃣ 检查 Karmada 中 guestbook-sample 的状态kubectl get guestbook -oyaml输出类似于以下内容:apiVersion: webapp.my.domain/v1kind: Guestbookmetadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"webapp.my.domain/v1","kind":"Guestbook","metadata":{"annotations":{},"name":"guestbook-sample","namespace":"default"},"spec":{"alias":"Name","configMapName":"test","size":2}} creationTimestamp: "2022-11-18T06:56:24Z" generation: 1 labels: propagationpolicy.karmada.io/name: example-policy propagationpolicy.karmada.io/namespace: default name: guestbook-sample namespace: default resourceVersion: "682895" uid: 2f8eda5f-35ab-4ac3-bcd4-affcf36a9341spec: alias: Name configMapName: test size: 2自定义 CRD1️⃣ 创建 OverridePolicy,将覆盖 member1 中 guestbook-sample 的 size 字段。kubectl apply -f guestbooks-overridepolicy.yaml# guestbooks-overridepolicy.yamlapiVersion: policy.karmada.io/v1alpha1kind: OverridePolicymetadata: name: guestbook-samplespec: resourceSelectors: - apiVersion: webapp.my.domain/v1 kind: Guestbook overrideRules: - targetCluster: clusterNames: - member1 overriders: plaintext: - path: /spec/size operator: replace value: 4 - path: /metadata/annotations operator: add value: {"OverridePolicy":"test"}2️⃣ 检查来自成员集群的 guestbook-sample 的 size 字段kubectl --kubeconfig=${HOME}/.kube/members.config config use-context member1kubectl --kubeconfig=${HOME}/.kube/members.config get guestbooks -o yaml如果按预期工作,则 .spec.size 将被覆盖为 4 :apiVersion: webapp.my.domain/v1kind: Guestbookmetadata:annotations:OverridePolicy: testkubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"webapp.my.domain/v1","kind":"Guestbook","metadata":{"annotations":{},"name":"guestbook-sample","namespace":"default"},"spec":{"alias":"Name","configMapName":"test","size":2}}resourcebinding.karmada.io/name: guestbook-sample-guestbookresourcebinding.karmada.io/namespace: defaultresourcetemplate.karmada.io/uid: 2f8eda5f-35ab-4ac3-bcd4-affcf36a9341creationTimestamp: "2022-11-18T06:56:37Z"generation: 2labels:propagationpolicy.karmada.io/name: example-policypropagationpolicy.karmada.io/namespace: defaultresourcebinding.karmada.io/key: 6849fdbd59work.karmada.io/name: guestbook-sample-6849fdbd59work.karmada.io/namespace: karmada-es-member1name: guestbook-samplenamespace: defaultresourceVersion: "430024"uid: 8818e33d-10bf-4270-b3b9-585977425bc9spec:alias: NameconfigMapName: testsize: 4 更多Karmada云原生多云容器引擎使用教程与技术交流,欢迎关注Karmada社区公众号或添加社区小助手k8s2222,回复Karmada进群。 Karmada 公众号  Karmada 是CNCF 首个多云多集群容器编排项目(孵化级),旨在帮助用户像使用单个集群一样轻松管理跨云多集群,让基于 Karmada 的多云方案无缝融入云原生技术生态。社区吸引了来自华为、道客、浙江大学、滴滴、腾讯、中国电子云等60多家公司的全球贡献者,广泛分布于22个国家和地区。Karmada 现已在华为云、道客、兴业数金、中国移动、中国联通、携程、360集团、新浪、中通快递等众多企业单位生产应用,为企业提供从单集群到多云架构的平滑演进方案。Karmada官网:https://karmada.io/项目地址:cid:link_0Slack地址:https://slack.cncf.io/(#karmada)
  • [技术干货] 【Karmada使用教程】快速开始,通过 Karmada 分发 Deployment
    Karmada 是开放的多云多集群容器编排引擎,旨在帮助用户在多云环境下部署和运维业务应用。凭借兼容 Kubernetes 原生 API 的能力,Karmada 可以平滑迁移单集群工作负载,并且仍可保持与 Kubernetes 周边生态工具链协同。本系列文章将介绍Karmada的使用教程,本文介绍如何通过 Karmada 分发 Deployment。本指南涵盖了:在名为 host cluster 的 Kubernetes 集群中安装 karmada 控制面组件。将一个成员集群接入到 karmada 控制面。通过使用 karmada 分发应用程序。前提条件Go v1.18+kubectl v1.19+kind v0.14.0+安装 Karmada 控制面1. 克隆此代码仓库到你的机器git clone cid:link_12. 更改到 karmada 目录cd karmada3. 部署并运行 Karmada 控制面运行以下脚本:hack/local-up-karmada.sh该脚本将为你执行以下任务:启动一个 Kubernetes 集群来运行 Karmada 控制面,即 host cluster。根据当前代码库构建 Karmada 控制面组件。在 host cluster 上部署 Karmada 控制面组件。创建成员集群并接入 Karmada。如果一切良好,在脚本输出结束时你将看到以下类似消息:Local Karmada is running.To start using your Karmada environment, run: export KUBECONFIG="$HOME/.kube/karmada.config"Please use 'kubectl config use-context karmada-host/karmada-apiserver' to switch the host and control plane cluster.To manage your member clusters, run: export KUBECONFIG="$HOME/.kube/members.config"Please use 'kubectl config use-context member1/member2/member3' to switch to the different member cluster.Karmada 中有两个上下文环境:karmada-apiserver kubectl config use-context karmada-apiserverkarmada-host kubectl config use-context karmada-hostkarmada-apiserver 是与 Karmada 控制面交互时要使用的 主要 kubeconfig, 而 karmada-host 仅用于调试 Karmada 对 host cluster 的安装。 你可以通过运行 kubectl config view 随时查看所有集群。 要切换集群上下文,请运行 kubectl config use-context [CONTEXT_NAME]Demo 分发应用程序在以下步骤中,我们将通过 Karmada 分发一个 Deployment。1. 在 Karmada 中创建 nginx deployment首先创建名为 nginx 的 deployment:kubectl create -f samples/nginx/deployment.yaml2. 创建将 nginx 分发到成员集群的 PropagationPolicy随后我们需要创建一个策略将 Deployment 分发到成员集群。kubectl create -f samples/nginx/propagationpolicy.yaml3. 从 Karmada 查看 Deployment 状态你可以从 Karmada 查看 Deployment 状态,无需访问成员集群:$ kubectl get deploymentNAME    READY   UP-TO-DATE   AVAILABLE   AGEnginx   2/2     2            2           20s 更多Karmada云原生多云容器引擎使用教程与技术交流,欢迎关注Karmada社区公众号或添加社区小助手k8s2222,回复Karmada进群。Karmada 公众号 Karmada 是CNCF 首个多云多集群容器编排项目(孵化级),旨在帮助用户像使用单个集群一样轻松管理跨云多集群,让基于 Karmada 的多云方案无缝融入云原生技术生态。社区吸引了来自华为、道客、浙江大学、滴滴、腾讯、中国电子云等60多家公司的全球贡献者,广泛分布于22个国家和地区。Karmada 现已在华为云、道客、兴业数金、中国移动、中国联通、携程、360集团、新浪、中通快递等众多企业单位生产应用,为企业提供从单集群到多云架构的平滑演进方案。Karmada官网:https://karmada.io/项目地址:cid:link_1Slack地址:https://slack.cncf.io/(#karmada)
  • [问题求助] CCI CloudBursting该服务的可用性等级是多少?
     CCI CloudBursting该服务的可用性等级是多少?
  • [问题求助] CCI CloudBursting弹性套件如何支持弹性过程中的地址替换、业务配置零改造?
     CCI CloudBursting弹性套件如何支持弹性过程中的地址替换、业务配置零改造?
  • [问题求助] CCI镜像快照能力如何实现单镜像5s内下载?
    CCI镜像快照能力如何实现单镜像5s内下载?
  • [问题求助] CCI CloudBursting对编程语言有什么要求吗?
    CCI CloudBursting对编程语言有什么要求吗?
  • KubeEdge Sedna的高性能提现在哪些地方?
    KubeEdge Sedna的高性能提现在哪些地方?