使用Karmada實現Helm應用的跨叢集部署

語言: CN / TW / HK
摘要:藉助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/

 

 

點選關注,第一時間瞭解華為雲新鮮技術~