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

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

最新文章

  1. OS X EI Capitan安装refind时出现Could not set boot device property: 0xe00002bc
  2. Python--While循环语句
  3. Mac OS finder : 显示和隐藏文件[夹] show and hide files or folders
  4. 怎么在Form1调用Form2中的成员?
  5. MySQL Database on Azure - 利用PowerShell快速创建使用数据库服务
  6. jmeter 启用gzip压缩——解决测试中web服务器上行流量过大的问题
  7. 『零行代码』解决键盘遮挡问题(iOS)
  8. 编写高质量代码改善python程序91个建议学习01
  9. ionic3使用moment.js
  10. CAS 无锁式同步机制
  11. LAS(Listener、Attender、Speller)端到端构架
  12. learning makeflie wildward character
  13. PropertiesUtils
  14. 破解webstorm
  15. ADO.NET 实体数据模型 异常-“序列化类型为 XX 的对象时检测到循环引用”
  16. 查询mysql事务隔离级别
  17. [原创]nginx添加module之threads
  18. Openstack入门篇(十五)之如何创建生产使用的openstack镜像
  19. 上传的文件放在SVN服务器的哪个目录下
  20. python -- 字符串和编码

热门文章

  1. Java实现平滑加权轮询算法--降权和提权
  2. 2021.07.26 P1010 幂次方(数论)
  3. CoAP调试工具 Mozi.IoT.CoAP
  4. python练习-20200826
  5. 新华三Gen10服务器ILO 5 安装中文语言包
  6. JSP标签、JSTL标签、EL表达
  7. Nessus简单介绍与安装
  8. Python 树表查找_千树万树梨花开,忽如一夜春风来(二叉排序树、平衡二叉树)
  9. [笔记] Powerful Number 筛
  10. 五三想休息,今天还学习,图解二叉树的层序遍历BFS(广度优先)模板,附面试题题解