本文分享自华为云社区《 使用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/v1beta2
kind: HelmRepository
metadata:
name: podinfo
spec:
interval: 1m
url: https://stefanprodan.github.io/podinfo
复制代码
---
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
name: podinfo
spec:
interval: 5m
chart:
spec:
chart: podinfo
version: 5.0.3
sourceRef:
kind: HelmRepository
name: podinfo
复制代码
2. 定义一个 Karmada 的 PropagationPolicy 对象将它们的资源实例下发到成员集群:
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: helm-repo
spec:
resourceSelectors:
- apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: HelmRepository
name: podinfo
placement:
clusterAffinity:
clusterNames:
- member1
- member2
复制代码
---
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: helm-release
spec:
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 created
helmrepository.source.toolkit.fluxcd.io/podinfo created
propagationpolicy.policy.karmada.io/helm-release created
propagationpolicy.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/v1alpha1
kind: OverridePolicy
metadata:
name: example-override
namespace: default
spec:
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 AGE
podinfo-68979685bc-6wz6s 1/1 Running 0 6m28s
podinfo-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/
点击关注,第一时间了解华为云新鲜技术~
评论