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


    摘要:借助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/

     

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

  • 相关阅读:
    【我的OpenGL学习进阶之旅】解决OpenGL在使用glUniform系列api时出现了 GL_INVALID_OPERATION 1282错误
    原生HTML,CSS,JS实现tab栏切换效果
    SQL SERVER Inregration Services-OLE DB、Oracle和ODBC操作
    基于阿里云服务实现短信验证码功能
    如何使用Redis?
    股指期货的详细玩法功能与应用解析
    信创之国产浪潮电脑+统信UOS操作系统体验1:硬件及软件常规功能支持情况介绍
    redis故障中出现的缓存击穿、缓存穿透、缓存雪崩?
    vscode 配置 Rust 运行环境
    成都正信晟锦:亲戚借了钱不认账怎么办是现金
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/16419453.html