helm chart包编写

木木1年前技术文章412

相关文档

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 }} ```

https://teamo-md.oss-cn-shanghai.aliyuncs.com/img/202207201635130.png

可以看到quote函数的作用为给我们的值添加引号


相关文章

ES运维(八)添加IK分词器

ES运维(八)添加IK分词器

一、概述ES自带standard analyzer、simple analyzer、whitespace analyzer、stop analyzer、language analyzer、patter...

MySQL 8.0 新特性:Instant Add Column

MySQL 8.0 新特性:Instant Add Column

一、前言MySQL 8.0 支持 “快速加列” 功能,既添加字段时可以支持 “INSTANT” 快速完成。通过只修改数据字典的方法来实现大表快速加列,避免之前加列操作必须做的数据拷贝,从而大幅缩小大表...

大数据即席查询-Presto

一、Presto 概念Presto 是一个开源的分布式 SQL 查询引擎,数据量支持 GB 到 PB 字节,主要用来秒级查询的场景。注:虽然 Presto 可以解析 SQL,但它不是一个标准的数据库。...

记一次zkfc故障问题定位

记一次zkfc故障问题定位

问题现象:    zkfc进程频繁告警问题分析:    1.查看zkfc日志显示如下,大量的与zk连接超时的信息,达到一...

PG的执行计划

一、Explain基本使用1.1 命令解释explain [ ( option [,...] ) ] statement explain [ analyze ] [ verbose ] statem...

Java-API对HDFS的操作(IDEA版)

Java-API对HDFS的操作(IDEA版)

前期工作首先就是安装maven在win系统下不配置hadoop环境,直接运行代码会报错,显示缺少winutils.exe 和 hadoop.dll 两个文件首先添加pom.xml文件  <dep...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。