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

摘要:藉助Karmada原生API的支援能力,Karmada可以藉助Flux輕鬆實現Helm應用的跨集群部署。

本文分享自華為雲社區《 使用Karmada實現Helm應用的跨集群部署【雲原生開源】》,作者:華為云云原生開源團隊。

背景

通過使用 Kubernetes 原生 API 並提供高級調度功能,Karmada已經實現了多集群場景下的Kubernetes資源(包括CRD)的分發以及管理。但當前多集群應用往往不是單一的資源形式,使用Helm對應用進行打包的使用場景也非常常見。

藉助Karmada原生API的支援能力,Karmada可以藉助Flux輕鬆實現Helm應用的跨集群部署。

部署Karmada

要部署Karmada,你可以參考社區的安裝文檔(//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

你可以參考此處的文檔(//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

參考文檔:

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

附:Karmada社區技術交流地址

添加Karmada社區助手微信k8s2222進入社區交流群,和Maintainer零距離。

項目地址://github.com/karmada-io/karmada

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

 

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