写点什么

使用 Karmada 实现 Helm 应用的跨集群部署

  • 2022 年 6 月 28 日
  • 本文字数:2435 字

    阅读完需:约 8 分钟

使用Karmada实现Helm应用的跨集群部署

本文分享自华为云社区《 使用Karmada实现Helm应用的跨集群部署【云原生开源】》,作者:华为云云原生开源团队。

背景


通过使用 Kubernetes 原生 API 并提供高级调度功能,Karmada 已经实现了多集群场景下的 Kubernetes 资源(包括 CRD)的分发以及管理。但当前多集群应用往往不是单一的资源形式,使用 Helm 对应用进行打包的使用场景也非常常见。


借助 Karmada 原生 API 的支持能力,Karmada 可以借助 Flux 轻松实现 Helm 应用的跨集群部署。

部署 Karmada


要部署 Karmada,你可以参考社区的安装文档(https://github.com/karmada-io/karmada/blob/master/docs/installation/installation.md)。如果想快速体验 Karmada,我们建议通过 hack/local-up-karmada.sh 构建一个 Karmada 的开发环境。

部署 Flux


在 Karmada 控制面中,你需要安装 Flux 的 CRD,但不需要安装 Flux 控制器来调和基于 CRD 创建的 CR 对象,它们被视为资源模板,而不是特定的资源实例。基于 Karmada 的 work API,它们将被封装为一个 work 对象下发给成员集群,最终由成员集群中的 Flux 控制器进行调和。


kubectl apply -k github.com/fluxcd/flux2/manifests/crds?ref=main --kubeconfig ~/.kube/karmada.config
复制代码


在成员集群中,你可以基于以下命令安装完整的 Flux 组件。


flux install --kubeconfig ~/.kube/members.config --context member1
flux install --kubeconfig ~/.kube/members.config --context member2
复制代码


你可以参考此处的文档(https://fluxcd.io/docs/installation/)来获得更详细的安装 Flux 的细节。

提示:如果你想在你所有的集群上管理基于 HelmRelease 的应用,你需要在你的所有成员集群中安装 Flux。

Helm release 分发


准备工作就绪,下面将以一个 podinfo 的简单应用为例演示如何完成 Helm chart 分发。

1.在 Karmada 控制平面中定义一个 Flux 的 HelmRepository CR 对象和一个 HelmRelease CR 对象。它们将视作资源模板。


apiVersion: source.toolkit.fluxcd.io/v1beta2kind: HelmRepositorymetadata:  name: podinfospec:  interval: 1m  url: https://stefanprodan.github.io/podinfo  
复制代码


---


apiVersion: helm.toolkit.fluxcd.io/v2beta1kind: HelmReleasemetadata:  name: podinfospec:  interval: 5m  chart:    spec:      chart: podinfo      version: 5.0.3      sourceRef:        kind: HelmRepository        name: podinfo
复制代码


2. 定义一个 Karmada 的 PropagationPolicy 对象将它们的资源实例下发到成员集群:


apiVersion: policy.karmada.io/v1alpha1kind: PropagationPolicymetadata:  name: helm-repospec:  resourceSelectors:    - apiVersion: source.toolkit.fluxcd.io/v1beta2      kind: HelmRepository      name: podinfo  placement:    clusterAffinity:      clusterNames:        - member1        - member2
复制代码


---


apiVersion: policy.karmada.io/v1alpha1kind: PropagationPolicymetadata:  name: helm-releasespec:  resourceSelectors:    - apiVersion: helm.toolkit.fluxcd.io/v2beta1      kind: HelmRelease      name: podinfo  placement:    clusterAffinity:      clusterNames:        - member1        - member2
复制代码


上述配置将会把 Flux 的资源对象下发到成员集群 member1 和 member2 中。


3. 将上述对象提交给 Karmada-apiserver:


kubectl apply -f ../helm/ --kubeconfig ~/.kube/karmada.config
复制代码


你将会得到以下的输出结果:


helmrelease.helm.toolkit.fluxcd.io/podinfo createdhelmrepository.source.toolkit.fluxcd.io/podinfo createdpropagationpolicy.policy.karmada.io/helm-release createdpropagationpolicy.policy.karmada.io/helm-repo created
复制代码


4. 切换至成员集群验证应用是否成功下发


helm --kubeconfig ~/.kube/members.config --kube-context member1 list
复制代码


你将会得到以下的输出结果:



基于 Karmada 的 PropagationPolicy,你可以灵活地将 Helm 应用发布到你期望的集群。

为特定集群定制 Helm 应用


上述的示例显示了如何将同一个 Helm 应用分发到 Karmada 中的多个集群。此外,你还可以使用 Karmada 的 OverridePolicy 为特定集群定制 Helm 应用。例如,上述应用包括了一个 Pod 副本,如果你只想更改 member1 集群中的应用所包含的 Pod 副本数,你可以参考以下的 OverridePolicy 策略。

1.定义一个 Karmada 的 OverridePolicy 对象。


apiVersion: policy.karmada.io/v1alpha1kind: OverridePolicymetadata:  name: example-override  namespace: defaultspec:  resourceSelectors:  - apiVersion: helm.toolkit.fluxcd.io/v2beta1    kind: HelmRelease    name: podinfo  overrideRules:  - targetCluster:      clusterNames:        - member1    overriders:      plaintext:        - path: "/spec/values"          operator: add          value:            replicaCount: 2
复制代码


2. 将上述对象提交给 Karmada-apiserver:


kubectl apply -f example-override.yaml --kubeconfig ~/.kube/karmada.config
复制代码


你将会得到以下的输出结果:


overridepolicy.policy.karmada.io/example-override created
复制代码


3. 在 Karmada 控制平面中应用上述策略后,你会发现 member1 成员集群中的 Pod 实例数已变更为 2,但 member2 集群中的那些保持不变。


kubectl --kubeconfig ~/.kube/members.config --context member1 get po
复制代码


你将会得到以下的输出结果:


NAME                       READY   STATUS    RESTARTS   AGEpodinfo-68979685bc-6wz6s   1/1     Running   0          6m28spodinfo-68979685bc-dz9f6   1/1     Running   0          7m42s
复制代码

参考文档:


https://github.com/karmada-io/karmada/blob/master/docs/working-with-flux.md

附:Karmada 社区技术交流地址

添加 Karmada 社区助手微信 k8s2222 进入社区交流群,和 Maintainer 零距离。

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

Slack 地址:https://slack.cncf.io/


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
使用Karmada实现Helm应用的跨集群部署_云原生_华为云开发者联盟_InfoQ写作社区