摘要:藉助Karmada原生API的支援能力,Karmada可以藉助Flux輕鬆實現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/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/