Kubernetes包管理器Helm的本质

news2024/11/28 18:43:01

1eff61885f2c67bb3de8e62aa75e6484.jpeg

“本质”类的文章,通常很难带流量。而且写起来非常吃力。

那我为什么还要写?写作是对自己的锻炼。写作是让自己的思想更有深度的一种有效方式。

如果你觉得这篇文章对你有帮助,也你麻烦你转发这篇文章,这是对我的帮助。谢谢。

Kubernetes 的包管理器的本质

“Helm 是 Kubernetes 的包管理器”。Helm的官方网站如是说。

那什么是“Kubernetes 的包管理器”?

我们假设需要在没包管理器的场景下部署资源,你需要一个个文件手工地执行 kubectl apply-f abc.yaml,abc.yaml就是Kubernetes的资源的定义文件。

文件内容如下:

当需要卸载资源呢?你又需要手工执行 kubectldelete-f abc.yaml

所以每次发布,你都必须有一个发布记录,记录下哪些YAML要执行apply,哪些yaml要执行delete。而且delete后,你还要记得将那个文件从文件夹中删除。

如果每次手工执行,工作量大不说,还很容易出错。所以,有人会想到使用Shell脚本或者Python脚本来解决这些问题。

当你通过Shell脚本或者Python脚本能自动化解决以上问题时,实际上就等于实现了一个Kubernetes 的包管理器。

当我们真正理解以上所说的Kubernetes资源的部署问题后,你就明白了Kubernetes 的包管理器其实就两个核心功能:

  1. 自动化执行Kubenetes资源更新;

  2. 跟踪Kubenetes资源更新记录(本质还是版本化)。

我们在选择包管理器时,务必要从这两个角度考虑。像Grafana公司Tanka,并不是一开始就实现“跟踪Kubenetes资源更新记录”功能,具体可以看:https://github.com/grafana/tanka/issues/88 。

Helm是如何实现包管理的

注:本文讲的是Helm3。Helm2与Helm3存在较大差异。

Helm的包:Chart

假如存在一个微服务x,我们将其部署到Kubernetes中,需要准备Deployment、HPA、Service的这三种资源的YAML文件。这三个文件,统一放在一个文件夹中。

Helm本身是一个命令行工具。通过package子命令,可以将整个文件夹打包成一个tgz的压缩包。打包命令为:helmpackagex-service--version1.0 。打包结果是一个tgz包。如下图:d547176104cd3e16f81cdbe17d81ace6.png

这个tgz包,我们称之为Chart包。本质上它就是Kubernetes的资源文件的一个集合。

我们可以将Chart包上传到Nexus这类制品管理工具进行版本化控制。这涉及到Chart的管理的工程实践,不在本文范围。

在有了Chart包以后,我们可以通过命令 helm install<release><chart路径>将svc安装到指定的Kubernetes集群上。如x-svc的部署指令将会是:helm install x-svc./x-svc-1.0.tgz

release是Helm的一个概念,即发布名。每执行一次helm install,对于Helm来说就是创建一个release。通常我们使用应用名作为发布名。

release这个概念在资源变更跟踪中环节非常重要。后面会反复使用此概念。

使用模板技术解决Chart的规模性问题

实际工作中,我们还会有y-svc、z-svc……n个服务。我们是不是每个服务要创建一个Chart?另外,每个服务都将被部署到三个环境中,那么,是不是每个环境还要单独又创建一个Chart?最终,我们需要服务与环境两个维度进行排列组合个Chart。

如果不能很好解决这个问题。Chart的数量会爆炸式增长。Helm如何解决这个问题呢?

它通过模板技术解决。换句话说,就是将Chart中资源文件中的容易变化的部分配置抽离出来变成变量,不变的部分变成模板。

变量部分配置统一放在Chart包中的values.yaml文件中。所以,这部分配置,我们通常也称为values配置,或者values文件。

这样,我们的Chart包的结构就变成如下(实际还有一些别的文件,但是不是本文讨论范围):

80a5b57f9211e2c3d40ea28fdb48db38.png

对于Chart中不变的部分,Helm使用gotemplate模板语言进行描述。就是说我们可以在deployments.yaml中直接写gotemplate模板语言了,如代码1:

我们无意挑起模板语言的战争,我们对gotemplate没有好感。你需要小心翼翼地去维护模板文件中的空格数量。如代码1的最后一行,它的意思是指该YAML块缩进12个空格。

关键问题我们该如何确定它应该是12,而不是10呢?而且,如果重构这部分代码,我又要重新算一次空格的数量!

使用gotemplate作为它的模板语言是它的最大错误。我们可能需要另外写一篇文章介绍规避这个问题的方法。

在写Helm的gotemplate模板时,建议不要写太复杂的逻辑,代码宁可重复,甚至另创建一个新的Chart。

执行资源变更

当values与Chart都已经准备好之后,我们通过以下命令,即可将x-svc的所有的资源部署到指定的namespace中:

helm install x-svc ./svc-chart-1.0.tgz -f x-svc-value.yaml

注意,一个不存在的服务,首次部署时是要执行install子命令。将来更新时,就只能执行upgrade子命令了。

以此类推,y-svc的部署命令就是:


 
helm install y-svc ./svc-chart-1.0.tgz -f y-svc-value.yaml

在执行install成功后,如果你需要修改该release,你需要执行upgrade指令,如下:

helm upgrade y-svc ./svc-chart-2.0.tgz -f y-svc-value.yaml

但是,helm是如何知道是要执行创建/变更资源,还是要执行删除资源呢?svc-chart-2.0.tgz比1.0版本可能少了deployment资源。

这就涉及到资源变更的跟踪了。

资源变更跟踪

在介绍“资源变更跟踪”前,我们先介绍几个重要的相关子命令:

  1. upgrade:更新已存在的release。如: helm upgrade y-svc./svc-chart-1.0.tgz-f y-svc-value.yaml

  2. list:列出所有的已经安装的release;

  3. rollback: 将指定的release进行回滚。甚至可以指定回滚到某个版本,命令: helm rollback<RELEASE>[REVISION][flags]

  4. history: 列出release的发布记录。

有些同学可能发现问题了:执行helm命令时,即没有默认的,也没有显示指定的release持久化方式,这些release信息是记录在哪里的?

同时,这又与我们上文说的“资源变更跟踪”有什么关系?

它们是相关的。Helm的核心原理就在此:

  1. 当首次部署时,使用install,这时,Helm会直接在指定命名空间(默认是default)下,创建一个helm.sh/release类型的secret。secret的名称定义为:sh.helm.release.v1.release.v1。secret的内容是这次执行的所有的Kubernetes资源的YAML内容。

  2. 当使用upgrade更新时,Helm从sh.helm.release.v1.release.v1的secret取出所有的YAML资源内容与本次将要执行更新的YAML资源内容进行对比,计算出本次更新需要执行的操作,是删除,变更。源码:https://github.com/helm/helm/blob/main/pkg/action/upgrade.go#L286

  3. 当upgrade执行成功,Helm会创建名为sh.helm.release.v1.release.v2的secret。当你看到这个v2的时候,你就已经知道了。Helm是通过结合secret的名称约定和secret的内容来记录下每一次发布的。当下次upgrade时,Helm会取v2的secret,然后执行更新,并创建v3的secret。以此类推。

为了展示的更友好,Helm把这些底层都隐藏下来了,所以,当你执行history指令时,你看到的将是:

28aa5639377005e0a568ddb688685802.png

截图取自Helm官网

至此,整个Helm的本质,已经介绍完。剩下细节可以通过查文档学习了。

小结

虽然本文标题写的是Helm的本质,其实写的是Kubernetes的包管理器的本质:

  1. 自动化执行Kubenetes资源更新;

  2. 跟踪Kubenetes资源更新记录(本质还是版本化)。

你可以拿这两次去评估Kustomize或者另的包管理工具。

往期好文推荐:

  • 云原生部署之Helm最佳实践(上)

  • 云原生部署之Helm最佳实践(下)

  • Helm3单元测试教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/88139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

socket.io 使用protobuf 协议发送消息

一、服务端 1、maven引入netty-socketio <dependency><groupId>com.corundumstudio.socketio</groupId><artifactId>netty-socketio</artifactId><version>1.7.22</version></dependency> 2、服务端java代码 Service public…

艾美捷内皮细胞生长添加剂不同研究工具推荐

艾美捷Relia Tech内皮细胞生长添加剂可用于培养没有饲养细胞的杂交瘤细胞&#xff08;Pintus&#xff0c;1983&#xff09;。这些脑提取物中的活性因子已被鉴定为aFGF的变体&#xff08;Burgesse&#xff0c;1985&#xff09;。该ECGF产品补充了生理浓度的人rec.VEGF-A&#xf…

初识 Markdown编辑器

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

真兰仪表通过深交所注册:拟募资17.4亿 上半年净利下降27%

雷递网 雷建平 12月13日上海真兰仪表科技股份有限公司&#xff08;简称&#xff1a;“真兰仪表”&#xff09;日前通过注册&#xff0c;准备在深交所创业板上市。真兰仪表计划募资17.4亿元。其中&#xff0c;7.76亿用于真兰仪表科技有限公司燃气表产能扩建项目&#xff0c;6.12…

NFA的确定化

一、实验目的 &#xff08;1&#xff09;通过本次实验&#xff0c;加深对正则表达式、NFA、DFA及其识别的语言的理解&#xff1b; &#xff08;2&#xff09;掌握从NFA到DFA的转换&#xff0c;以及用子集法把NFA转换成DFA理论&#xff0c;编程实现将NFA&#xff08;不确定有穷…

SAP 事务代码BD20不能处理状态为51的IDoc

SAP 事务代码BD20不能处理状态为51的IDoc 对于SAP IDoc相关的事务代码比如WE02,WE19,BD87等都比较熟悉&#xff0c;因为使用的比较多。但是对于事务代码BD20却很少使用。 笔者在近期的一个项目上&#xff0c;听到客户的global team有使用该事务代码&#xff0c;设置成了一个job…

Oracle RMAN备份相关信息查询

查询 RMAN 备份状态主要是通过视图V$RMAN_STATUS 来进行&#xff0c;这个视图可以查询到 RMAN 执行的操作。 我们主要查看两列&#xff1a;OPERATION 和 STATUS。 OPERATION 的值有&#xff1a;RMAN、BACKUP、DELETE、CROSSCHECK、DELETE OBSOLETE等。 STATUS的值有&#xff1a…

中国电信携手华为建成全球首个支持5G RedCap联合测试能力的5G开放实验室

近日&#xff0c;中国电信物联网开放实验室宣布与华为共同完成了5G RedCap实验室技术验证&#xff0c;并建成了全球首个具备5G R17标准RedCap联合测试能力的开放实验室。 此次技术验证&#xff0c;为RedCap的规模商用奠定了坚实基础&#xff0c;有助于打造RedCap行业终端生态认…

良心总结!Git 各指令的本质,真是通俗易懂啊

1前言 作为当前世界上最强大的代码管理工具Git相信大家都很熟悉&#xff0c;但据我所知有很大一批人停留在clone、commit、pull、push...的阶段&#xff0c;是不是对rebase心里没底只敢用merge&#xff1f;碰见版本回退就抓瞎&#xff1f;别问我怎么知道的&#xff0c;问就是&…

什么是成熟的自动化运维平台?

本文首发于知乎&#xff0c;由嘉为蓝鲸原创。 商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 当企业遇到运维管理对象的急速增长&#xff0c;业务需求频繁变更等传统运维场景问题时&#xff0c;依靠手工运维已经远远满足不了需求&#xff0c;因此我们需要搭建…

2022,itbird的年终总结报告

最近公司要求个人在做年终总结了&#xff0c;趁着这个机会&#xff0c;也想对自己的2022年进行一下回顾总结&#xff0c;最重要的是&#xff0c;对2023的目标&#xff0c;可以有一个指引。 就从工作和生活两方面来讲吧。 1.工作 1.1 行业的状态 本人从事的是android开发工作…

Cuda个别库函数的兼容性 - shuffle\数学库\原子

兼容性针对的是不同的Cuda版本和设备计算能力(compute capability) shuffle 在C\C扩展一节 新版本函数见Cuda12.0 文档 __shfl_sync, __shfl_up_sync, __shfl_down_sync, and __shfl_xor_sync exchange a variable between threads within a warp. Supported by devices of …

信创入围认证详解

信创是一个统称概念&#xff0c;实际是把现有与信息技术相关的行业结合在一起&#xff0c;命名为“信息技术应用创新产业”&#xff0c;简称“信创”。一般来说&#xff0c;信创包括基础硬件、基础软件、应用软件、信息安全四大板块。其中&#xff0c;基础硬件主要包括&#xf…

让最近爆火的ChatGPT来谈谈,作为一个技术人该如何写好一篇技术博文

ChatGPT 是由 OpenAI 训练的一个大型语言模型。专门设计用于回答用户提出的问题&#xff0c;我可以提供有价值的信息&#xff0c;并帮助用户解决问题 下面的回答均来自ChatGPT CharGPT如何写好一篇技术博文&#xff1f;写技术博文需要具备那些能力就用java实现冒泡排序来写一篇…

C语言画贝塞尔曲线的函数

程序截图 简单说明 这个函数就是 void drawBezierCurve(COLORREF color, const unsigned int len, ...) color 是贝塞尔曲线的颜色&#xff0c;len 是画出贝塞尔曲线所需要的点的个数&#xff0c;最少 1 个&#xff0c;不要乱传。之后的参数传的就是画出贝塞尔曲线要的点&am…

大数据时代,数据实时同步解决方案的思考—最全的数据同步总结

F、 客户端开发&#xff0c;在maven中引入canal的依赖 com.alibaba.otter canal.client 1.0.21 代码示例&#xff1a; package com.example; import com.alibaba.otter.canal.client.CanalConnector; import com.alibaba.otter.canal.client.CanalConnectors; import c…

[附源码]Nodejs计算机毕业设计基于Web美食网站设计Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

C++ Reference: Standard C++ Library reference: Containers: map: map: begin

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/begin/ 公有成员函数 <map> std::map::begin C98 iterator begin(); const_iterator begin() const; C11 iterator begin() noexcept; const_iterator begin() const noexcept;返回指向开始的iterato…

[附源码]Python计算机毕业设计甘肃草地植物数字化标本库管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

图拉普拉斯矩阵

正定矩阵 在线性代数里&#xff0c;正定矩阵 (positive definite matrix) 有时会简称为正定阵。 广义定义&#xff1a;设M是n阶方阵&#xff0c;如果对任何非零向量z&#xff0c;都有z⃗TMz⃗>0\vec{z}^TM\vec{z}>0zTMz>0&#xff0c;则称M为正定矩阵。 狭义定义&…