最近给部门的小伙伴做了一个关于helm
的入门介绍,收到了不错的反响,于将资料整理分享给博客的读者们。
本文第一部分介绍helm
是做什么的以及能解决什么问题。第二部分介绍helm
的核心概念及安装使用helm
的教程,
第三部分介绍helm
使用的核心即chart
的开发,这一章节通过一个示例给大家演示基本的开发步骤。最后一部分,
简单说明如何搭建私有模板仓。在读完后,相信你会对Helm
及生态有一个简单的了解。
什么是 helm
如标题所示,官方给Helm
的定义是 kubernetes 的包管理器。那么什么是包管理器呢?
什么是包管理工具
包管理器一组软件工具,它们以一致的方式自动安装、升级、配置和删除计算机操作系统的计算机程序 -维基百科
helm 帮助用户管理 kubernetes 程序,helm chart 帮助用户定义、安装和升级最复杂的 Kubernetes 应用程序,Charts 很容易 创建,版本管理,共享和发布,所以停止 copy-and-paste,开始使用 helm -helm 官方
核心概念
helm
的官方文档中的描述更加详细,这里只列出一些重要的概念:
Helm Concept | 描述 | 重点 |
---|---|---|
Chart(unpackaged) | 一个文件夹的文件,遵循 chart 的准则 | 可以直接部署到集群 |
Chart(packaged) | 上述文件的压缩包 tar.gz | 可以直接部署到集群 |
Chart name | Chart.yaml 定义包的名称 | 部分标识 chart |
Templates | 构成应用程序的一组 Kubernetes 清单 | Golang 模板引擎 |
Values | 可以在 Kubernetes 清单中参数化的设置 | 用于 template 渲染 |
Chart version | chart 版本 | 部分标示 chart |
App Version | chart 中包含的应用程序版本 | 与 chart 版本独立 |
Release | kubernetes 集群中部署的 chart | 同一个 chart 可能部署多个 release |
Release name | release 任意名称 | 独立于 chart name |
Release Revision | 每次部署/升级应用程序时递增的数字 | 于 chart 版本无关 |
helm 发展
- 每个月超过百万次下载
- CNCF Incubating project
- 繁荣的社区
helm 如何使用
helm 安装
helm3
剔除了服务 Tiller,直接与kubernetes apiserver
通信,所以安装相比helm2
更加简单。
1 |
|
对于需要从 Helm2 升级到 helm3 的用户,官方提供了升级插件,我是使用插件进行升级的,没有遇到问题。
chart
chart
:一个包含足够信息的 Helm 包,用于将一组 Kubernetes 资源安装到 Kubernetes 集群中。
helm 命令行工具能够自动生成一个 chart 结构:helm create myapp
templates
包含了所有所需 kubernetes 各个资源的模板文件,Value.yaml
文件存储chart
的默认值,
这些值可以通过helm install ,helm upgrade
更新,Chart.yaml
包含了chart
的描述信息,如版本,名称等。
charts
目录存储其依赖的第三方chart
。
安装 Chart
在根据正在运行的 Kubernetes 集群进行身份验证的环境中,使用 Helm 从本地 chart 目录或 chart repo 安装。
使用自定义值
查看 release 状态
查看所有运行的 release
升级 release
回滚 release
移除一个 release
helm chart 如何开发
chart
的开发是Helm
的核心,也比较复杂。Helm
使用Go
模板对资源文件进行模板化,除了Go
附带的几个内置函数,还添加了许多其他函数。
chart 开发核心特性
以下列举了helm chart
开发中几个核心知识点,这里只简单罗列,如果你需要使用,还是建议参考官方文档。
- 内置对象:
Release,Values,Chart,Files
; - Values 文件,
--set
>-f customValue
> default file; - 模板函数及流水线:对传入 template 的值进行轻度处理,helm 内置了 60 多个常见函数;
- 控制语句的使用;
- 变量;
- 命名模版;
- 访问 templates 中的文件;
- 帮助文件 NOTS.Txt 如何编写;
- subcharts 与全局变量;
- .helmignore 文件忽略不需要的文件;
- chart 开发如何进行调试:
helm lint
,helm install --dry-run --debug
,helm get manifest
;
开发一个 chart Demo
我们通过一个Go
web 程序iim
,来演示开发一个 chart 的完整流程。web 应用镜像已经推送到镜像仓中。
- 首先在项目中创建 chart 目录,我们使用
helm create iim
工具生成。其中templates
会自动生成 deployment,service ,serviceaccount 资源文件,以及自定义帮助文件模板。我们可以移除一些不必要的文件,如 serviceaccount,因为这里不需要使用这些 kubernetes 资源; _NOTES.txt
:关于应用的帮助信息,如访问地址 __helpers.tpl
: 放置 chart 帮助程序的地方,便于后续重用 - 修改 deployment.yaml,添加入口程序参数。
1 | containers: |
- 修改程序默认配置,即 Value.yaml 文件
1 | replicaCount: 1 |
- 修改程序说明文件,即
Chart.yaml
文件
1 | apiVersion: v2 |
- 检测
Chart
是否合法
1 | # 校验 |
- 运行
1 | ➜ iim git:(haier-shanghai) ✗ helm install iim . |
搭建私有仓库
定义与方案
a chart repository
存储和共享打包好的charts
。官方 chart repository维护了许多常用中间件的chart
。
本质上,一个chart repo
就是一个普通的 http server,其包含一个index.yaml
文件和一些packaged chart
。
index.yaml
定义了chart repo
的元数据。因此,用户可以使用Google Cloud Storage bucket,Amazon S3 bucket,Github Page
去搭建私有仓。
https://example.com/charts
这个 chart repo 的布局如下:
1 | charts/ |
其中的index.yaml
内容如下:
1 | apiVersion: v1 |
ChartMuseum
是开源的helm chart repository
,使用Golang
开发,并且对主流的云存储
都有支持。其本身也支持容器化部署,提供了丰富的 api,重要的是其支持多租户。
1 | charts |
搭建chart repo
demo
我们以chartmusuem
为例,介绍如何搭建chart repo
,以及如何将我们上面开发好的chart
打包发布到我们的仓库中。
- 安装并启动 chartmusuem:
1 | curl -LO https://s3.amazonaws.com/chartmuseum/release/latest/bin/linux/amd64/chartmuseum |
- helm 添加 repo:
1 | ➜ helmdemo helm repo add chartmuseum http://192.168.5.82:9081 |
- 将开发好的 chart 打包 tgz 文件并且发布到我们的仓库中:
1 | ➜ helmdemo create myappone |
- 其他集群下载使用私有仓库的 chart
1 | ➜ myappone helm repo update |
一句话
- kubeapps: 一个
web ui
工具部署helm chart
; - helm 支持丰富的插件,版本升级工具即通过插件实现的;
- helm 提供了
golang sdk
; - 目前包括
openshift
在内的厂商都支持Helm
; lens
:一个kubernetes
管理看板,支持Helm
,其交互设计非常值得学习。
总结
Helm
已经成为事实上kubernetes
包管理器的标准,并且也成功从 CNCF 中毕业。Helm
能够很好的解决企业使用 kubernetes 所遇到的各种痛点,
且新版本的helm
架构更加清晰,职责也更加明确。在阅读本文后,相信您也对Helm
有了一个初步的认识。