最简单的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 version
Capabilities.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
)。