helm chart包编写
相关文档
https://helm.sh/zh/docs/charttemplateguide/getting_started/
编写helm chart包
创建chart包
```Plain Text helm create
创建完成后可以看到如下目录结构,此时我们会得到一个文件夹,文件夹的名称为我们的`chart name` ![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201448213.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201448213.png) 查看templates目录 ![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201450383.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201450383.png) 可以看到已经创建好了一些文件 - `NOTES.txt`: chart的"帮助文本"。这会在你的用户执行`helm install`时展示给他们。 - `deployment.yaml`: 创建Kubernetes [工作负载](https://kubernetes.io/docs/user-guide/deployments/)的基本清单 - `service.yaml`: 为你的工作负载创建一个 [service终端](https://kubernetes.io/docs/user-guide/services/)基本清单。 - `_helpers.tpl`: 放置可以通过chart复用的模板辅助对象 我们先不管这些文件,通过手动创建这些文件来学习 ## 编写yaml文件 ### 编写简单yaml文件 我们先在templates目录下创建一个`configmap.yaml`文件
YAML apiVersion: v1 kind: ConfigMap metadata: name: hello-configmap data: value: "Hello World"
这样一个简单的chart包就编写完成了,此时目录结构如下 ![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201504049.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201504049.png) 此时我们返回chart文件夹所在目录执行相关命令,就可以把这个chart包安装到我们的kubernetes集群了
Plain Text helm install./
![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201509717.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201509717.png) 进入集群可以看到相关的configmap已经安装 ![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201511315.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201511315.png) 通过helm命令我们还可以看到已经加载的release模板
Plain Text helm get manifest
![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202209291624560.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202209291624560.png) 使用helm命令可以卸载已经安装的release
Plain Text helm uninstall
![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201516564.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201516564.png) ### 添加一个简单的模板调用 我们可以看到此时我们创建的configmap的名字是由我们已经写好的`configmap.yaml`文件中的字段决定的,这样并不实用,我们还可以通过插入release名称来生成我们configmap名称。
YAML apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: value: "Hello World"
- 模板命令 `{{ .Release.Name }}` 将release名称注入了模板。值作为一个 *命名空间对象* 传给了模板,用点(`.`)分隔每个命名空间的元素。 - `Release`前面的点表示从作用域最顶层的命名空间开始。这样`.Release.Name`就可解读为“通顶层命名空间开始查找 Release对象,然后在其中找Name对象”。 - `Release`是一个Helm的内置对象。 我们此时再安装这个chart包,可以看到configmap的名称已经变成通过release名称自动成的
Plain Text helm install./
![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201523688.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201523688.png)
Plain Text helm get manifest
![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201525668.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201525668.png) 查看集群 ![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201526325.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201526325.png) ### 渲染模板到控制台 这样每次都安装到kubernetes集群查看不太方便,我们可以通过下面的命令将yaml文件只渲染到控制台,不真实的安装到集群中来方便编写
Plain Text helm install --debug --dry-run./
![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201533113.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201533113.png) # 内置对象 对象可以通过模板引擎传递到模板中。 当然你的代码也可以传递对象。(我们在使用`with`和`range`语句时,会看到示例)。有几种方式可以在模板中创建新对象,比如说我们后面会看到的`tuple`功能。 对象可以是非常简单的:仅有一个值。或者可以包含其他对象或方法。比如,`Release`对象可以包含其他对象(比如:`Release.Name`)和`Files`对象有一组方法。 在上一部分中,我们用`{{ .Release.Name }}`在模板中插入版本名称。`Release`是你可以在模板中访问的顶层对象之一。 - `Release`: `Release`对象描述了版本发布本身。包含了以下对象: - `Release.Name`: release名称 - `Release.Namespace`: 版本中包含的命名空间(如果manifest没有覆盖的话) - `Release.IsUpgrade`: 如果当前操作是升级或回滚的话,该值将被设置为`true` - `Release.IsInstall`: 如果当前操作是安装的话,该值将被设置为`true` - `Release.Revision`: 此次修订的版本号。安装时是1,每次升级或回滚都会自增 - `Release.Service`: 该service用来渲染当前模板。Helm里始终`Helm` - `Values`: `Values`对象是从`values.yaml`文件和用户提供的文件传进模板的。默认为空 - `Chart`: `Chart.yaml`文件内容。 `Chart.yaml`里的所有数据在这里都可以可访问的。比如 `{{ .Chart.Name }}-{{ .Chart.Version }}` 会打印出 `mychart-0.1.0` - 在 [Chart 指南](https://helm.sh/zh/docs/topics/charts#Chart-yaml-文件) 中列出了可获得属性 - `Files`: 在chart中提供访问所有的非特殊文件的对象。你不能使用它访问`Template`对象,只能访问其他文件。 请查看这个 [文件访问](https://helm.sh/zh/docs/chart_template_guide/accessing_files)部分了解更多信息 - `Files.Get` 通过文件名获取文件的方法。 (`.Files.Getconfig.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` 是当前Helm语义格式的版本 - `Capabilities.HelmVersion.GitCommit` Helm的git sha1值 - `Capabilities.HelmVersion.GitTreeState` 是Helm git树的状态 - `Capabilities.HelmVersion.GoVersion` 是使用的Go编译器版本 - `Template`: 包含当前被执行的当前模板信息 - `Template.Name`: 当前模板的命名空间文件路径 (e.g. `mychart/templates/mytemplate.yaml`) - `Template.BasePath`: 当前chart模板目录的路径 (e.g. `mychart/templates`) # values文件 在上一部分我们了解了Helm模板提供的内置对象。其中一个是`Values`对象。该对象提供了传递值到chart的方法, 其内容来自于多个位置: - chart中的`values.yaml`文件 - 如果是子chart,就是父chart中的`values.yaml`文件 - 使用`-f`参数(`helm install -f myvals.yaml ./mychart`)传递到 `helm install` 或 `helm upgrade`的values文件 - 使用`--set` (比如`helm install --set foo=bar ./mychart`)传递的单个参数 以上列表有明确顺序:默认使用`values.yaml`,可以被父chart的`values.yaml`覆盖,继而被用户提供values文件覆盖, 最后会被`--set`参数覆盖,优先级为`values.yaml`最低,`--set`参数最高。 ## 尝试values的使用 将刚刚创建的chart包中原本的`values.yaml`文件内容删除 将如下内容写入`valuse.yaml`文件
YAML favoriteDrink: coffee
同时修改我们的`configmap.yaml`文件
YAML apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: value: "Hello World" drink: {{ .Values.favoriteDrink }}
渲染模板查看
Plain Text helm install --debug --dry-run./
![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201550928.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201550928.png) # 函数和流水线 ## 函数 Helm 有超过60个可用函数。其中有些通过 [Go模板语言](https://godoc.org/text/template)本身定义。其他大部分都是 [Sprig 模板库](https://masterminds.github.io/sprig/)。 通过函数我们可以实现一些更细微的操作 ### 示例values文件
YAML favorite: drink: coffee food: pizza
### 未使用函数
YAML apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" drink: {{ .Values.favorite.drink }} food: {{ .Values.favorite.food }}
![https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201635794.png](https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201635794.png) ### 使用函数
YAML apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" drink: {{ quote .Values.favorite.drink }} food: {{ quote .Values.favorite.food }} ```
可以看到quote函数的作用为给我们的值添加引号