最简单的Helm教程
学习前置条件
- 你得了解Kubernetes,拥有实际的使用经验那是最好不过了
Helm是什么?
我们打开Helm的官网:Helm的官网
可以看到官网的第一页就告诉了我们Helm是什么。

**Helm是Kubernetes(k8s)的包管理工具。**这就类似于Linux系统常用的apt、yum等包管理工具。
进一步说Helm这个k8s的包管理工具,具体能帮助我们做什么呢?如下图所示:

Helm可帮助我们管理 Kubernetes 应用程序——Helm Charts 可帮助您定义、安装和升级即使是最复杂的 Kubernetes 应用程序。
Charts很容易创建、版本化、共享和发布——所以开始使用 Helm 并停止复制和粘贴。
如果说上面的说明让你有些听不懂,那我们用示例讲解一遍。
在我们的日常工作中,肯定是有多套环境的。一般会有开发环境、预生产测试环境、生产环境,甚至还有压测环境,生产环境可能又分为多个地方资源池的环境。
现在我们的服务大多都是微服务化的,一个应用有几个甚至几十个的微服务,每一个微服务都对应了一个部署的yaml文件,那可能就是几个甚至几十个yaml文件。
假如我们新增了一个要部署的环境,或者是我们的yaml文件需要修改的时候,那我们就需要到这几个甚至几十上百个yaml文件中进行修改。这太费时费力了,而且还容易搞错。
其实我们的yaml文件中,大部分内容是相同的,为什么不能将那一些不同点抽离出来,做成配置,到时候,直接维护那一点配置文件,这不就简化了我们的工作吗。
这其实就是Helm的一个作用。
当然不仅仅只有这个作用,类似还有版本管理、回滚和发布。这些都是在我们的k8s的使用中很需要的一些功能。
总之一句话,使用Helm可以简化k8s应用部署。
Helm的下载与安装
在开始学习Helm之前,我们得先拥有学习的环境,大家在学习的过程中一边学习,一边实践,这样才学习得更快。
Helm的下载
Helm下载路径:https://github.com/helm/helm/releases
目前的最新版本是v3.11.3,大家选择安装的时候,选择跟自己的k8s版本兼容的版本即可。
| Helm的版本 | 支持的Kubernetes版本 |
|---|---|
| 3.11.x | 1.26.x - 1.23.x |
| 3.10.x | 1.25.x - 1.22.x |
| 3.9.x | 1.24.x - 1.21.x |
| 3.8.x | 1.23.x - 1.20.x |
| 3.7.x | 1.22.x - 1.19.x |
| 3.6.x | 1.21.x - 1.18.x |
| 3.5.x | 1.20.x - 1.17.x |
| 3.4.x | 1.19.x - 1.16.x |
| 3.3.x | 1.18.x - 1.15.x |
| 3.2.x | 1.18.x - 1.15.x |
| 3.1.x | 1.17.x - 1.14.x |
| 3.0.x | 1.16.x - 1.13.x |
| 2.16.x | 1.16.x - 1.15.x |
| 2.15.x | 1.15.x - 1.14.x |
| 2.14.x | 1.14.x - 1.13.x |
| 2.13.x | 1.13.x - 1.12.x |
| 2.12.x | 1.12.x - 1.11.x |
| 2.11.x | 1.11.x - 1.10.x |
| 2.10.x | 1.10.x - 1.9.x |
| 2.9.x | 1.10.x - 1.9.x |
| 2.8.x | 1.9.x - 1.8.x |
| 2.7.x | 1.8.x - 1.7.x |
| 2.6.x | 1.7.x - 1.6.x |
| 2.5.x | 1.6.x - 1.5.x |
| 2.4.x | 1.6.x - 1.5.x |
| 2.3.x | 1.5.x - 1.4.x |
| 2.2.x | 1.5.x - 1.4.x |
| 2.1.x | 1.5.x - 1.4.x |
| 2.0.x | 1.4.x - 1.3.x |
下面我以下载Windows上使用的Helm v3.11.3版本为例。
-
打开Helm的下载页面,找到v3.11.3版本下载的部分。
-
在Installation and Upgrading部分,选择Windows环境使用的二进制安装包。

-
下载下来的是一个压缩包:helm-v3.11.3-windows-amd64.zip,压缩包里面的文件也很简单。

Helm的安装
-
将安装包压缩到任意一个地方,例如我解压的位置为:
E:\software\windows-amd64 -
将安装包解压的路径配置到环境变量中,并点击确定。

-
现在已经可以在命令行中使用helm的命令了。使用命令
helm version可以显示helm的版本。
Helm内的概念解释
Chart
Chart是一个Helm包*。*它包含在Kubernetes集群内运行应用程序、工具或服务所需的所有资源定义。等同于Yum使用的RPM文件。
Repository
存储库是可以收集和共享Charts的地方。例如我们可以在Jfrog的Artifactory上创建一个Helm制品库,我们创建了Chart之后,可以将Chart推到这个Helm制品库中,以此共享给其他人。当然我们也可以从Helm制品库中下载Helm的Chart。
Release
Release是在 Kubernetes 集群中运行的Chart实例。一个图表通常可以多次安装到同一个集群中。每次安装时,都会创建一个新版本。
Helm的最简单实战
查看帮助信息
学习一个工具,最开始要学习的就是如何查看帮助信息。
helm -h

创建一个Chart
创建一个Chart,可以使用如下命令:
helm create my-chart
返回
Creating my-chart
这样,我们就创建了一个名为my-chart的Chart。我们也可以看到,在当前目录中多了一个名为my-chart的目录。目录结构如下所示:

- charts目录:该
charts/目录可能包含其他图表(我们称之为subcharts)。 - templates目录:该
templates/目录用于保存模板文件。当 Helm使用Chart创建实例时,它会通过模板渲染引擎发送templates/目录中的所有文件。然后它收集这些模板的结果并将它们发送到 Kubernetes。 - .helmignore文件:
.helmignore文件用来指定你不想包含在你的helm chart中的文件。 - Chart.yaml文件:该
Chart.yaml文件包含chart的描述。可以从模板中访问它。 - values.yaml文件:该
values.yaml文件对模板很重要。该文件包含chart的默认值。这些值可能会在helm install或helm upgrade期间被覆盖。
配置Repisotory
-
使用命令新增Repository配置
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts输出:
"aliyun" has been added to your repositories此时就新增了一个名为
aliyun的Repository。 -
更新Repository信息
helm repo update输出:
Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "aliyun" chart repository Update Complete. ⎈Happy Helming!⎈
推送Chart到Repository
创建了Chart文件之后,就可以推送到Repository之中。
-
新增有推送权限的Repository。
helm repo add --username ****** --password ****** artifact_sr6-release-helm-local "https://xxx/helm/artifact-sr6/artifact_sr6-release-helm-local"输出:
"artifact_sr6-release-helm-local" has been added to your repositories -
将chart打包
helm package my-chart输出:
Successfully packaged chart and saved it to: D:\个人事项\xxx\xxx\5月\代码\my-chart-0.1.0.tgz -
将chart推送到Repository。
curl -F "chart=@my-chart-0.1.0.tgz" -u ******:****** https://xxx/helm/api/artifact-sr6/artifact_sr6-release-helm-local/charts输出:
{ "saved" : true }到此就已经将helm的chart推送到了Repository。

从Repository拉取Chart
-
使用命令下载并解压chart包。
helm pull aliyun/mysql --untar发现当前目录下多了一个
mysql的目录,目录里面的内容为:
这便是一个名为
mysql的chart包。
Helm的chart模版指南
内置对象
- Release:此对象描述版本本身。它里面有几个对象:
Release.Name: 发布名称Release.Namespace:要发布到的命名空间(如果清单没有覆盖)Release.IsUpgrade:如果当前操作是升级或回滚,则设置为true。Release.IsInstall:如果当前操作是安装,则设置为true。Release.Revision:此版本的修订号。在安装时,这是 1,并且随着每次升级和回滚而递增。Release.Service:呈现当前模板的服务。在 Helm 上,这始终是Helm.
- Values:从
values.yaml文件和用户提供的文件传递到模板的值。默认情况下,Values为空。 - Chart: Chart.yaml文件的内容。Chart.yaml中的任何数据都可以在这里访问。例如
{{ .Chart.Name }}-{{ .Chart.Version }},将打印出mychart-0.1.0. - Files:这提供了对chart中所有非特殊文件的访问。虽然不能使用它来访问模板,但可以使用它来访问chart中的其他文件。
Files.Get是按名称获取文件的函数 (.Files.Get config.ini)Files.GetBytes是一个将文件内容作为字节数组而不是字符串获取的函数。这对于图像之类的东西很有用。Files.Glob是一个返回名称与给定 shell glob 模式匹配的文件列表的函数。Files.Lines是一个逐行读取文件的函数。这对于遍历文件中的每一行很有用。Files.AsSecrets是一个将文件主体作为 Base 64 编码字符串返回的函数。Files.AsConfig是一个将文件主体作为 YAML 映射返回的函数。
- Capabilities:这提供了有关 Kubernetes 集群支持哪些功能的信息。
Capabilities.APIVersions是一组版本。Capabilities.APIVersions.Has $version指示版本(例如,batch/v1)或资源(例如,apps/v1/Deployment)在集群上是否可用。Capabilities.KubeVersion并且Capabilities.KubeVersion.Version是 Kubernetes 版本。Capabilities.KubeVersion.Major是 Kubernetes 的主要版本。Capabilities.KubeVersion.Minor是 Kubernetes 次要版本。Capabilities.HelmVersion是包含 Helm 版本详细信息的对象,它是相同的输出helm versionCapabilities.HelmVersion.Version是 semver 格式的当前 Helm 版本。Capabilities.HelmVersion.GitCommit是 Helm git sha1。Capabilities.HelmVersion.GitTreeState是 Helm git 树的状态。Capabilities.HelmVersion.GoVersion是使用的 Go 编译器的版本。
- Template: 包含有关当前正在执行的模板的信息
Template.Name:当前模板的命名空间文件路径(例如mychart/templates/mytemplate.yaml)Template.BasePath:当前图表模板目录的命名空间路径(例如mychart/templates)。
Capabilities.HelmVersion.GitTreeState是 Helm git 树的状态。
Capabilities.HelmVersion.GoVersion是使用的 Go 编译器的版本。- Template: 包含有关当前正在执行的模板的信息
Template.Name:当前模板的命名空间文件路径(例如mychart/templates/mytemplate.yaml)Template.BasePath:当前图表模板目录的命名空间路径(例如mychart/templates)。



















