写点什么

helm charts 内置函数

作者:ghostwritten
  • 2022 年 5 月 10 日
  • 本文字数:3346 字

    阅读完需:约 11 分钟

helm charts 内置函数

1. 定义 chart

Helm 的 github 上面有一个比较完整的文档,一个 chart 包就是一个文件夹的集合,文件夹名称就是 chart 包的名称,比如创建一个 mychart 的 chart 包:


$ helm create mychartCreating mychart$ tree mychart/mychart/├── charts├── Chart.yaml├── templates│   ├── deployment.yaml│   ├── _helpers.tpl│   ├── ingress.yaml│   ├── NOTES.txt│   └── service.yaml└── values.yaml
2 directories, 7 files
复制代码


templates 目录下面的文件:


  • NOTES.txt:chart 的 “帮助文本”。这会在用户运行 helm install 时显示给用户。

  • deployment.yaml:创建 Kubernetes deployment 的基本 manifest

  • service.yaml:为 deployment 创建 service 的基本 manifest

  • ingress.yaml: 创建 ingress 对象的资源清单文件

  • _helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用


然后我们把 templates 目录下面所有文件全部删除掉,这里我们自己来创建模板文件:


$ rm -rf mychart/templates/*.*
复制代码

2. 创建模板

这里我们来创建一个非常简单的模板 ConfigMap,在 templates 目录下面新建一个configmap.yaml文件:


apiVersion: v1kind: ConfigMapmetadata:  name: mychart-configmapdata:  myvalue: "Hello World"
复制代码


实际上现在我们就有一个可安装的 chart 包了,通过helm install命令来进行安装:


$ helm install ./mychart/NAME:   ringed-lynxLAST DEPLOYED: Fri Sep  7 22:59:22 2018NAMESPACE: defaultSTATUS: DEPLOYED
RESOURCES:==> v1/ConfigMapNAME DATA AGEmychart-configmap 1 0s
复制代码


在上面的输出中,我们可以看到我们的 ConfigMap 资源对象已经创建了。然后使用如下命令我们可以看到实际的模板被渲染过后的资源文件:


$ helm get manifest ringed-lynx
---# Source: mychart/templates/configmap.yamlapiVersion: v1kind: ConfigMapmetadata: name: mychart-configmapdata: myvalue: "Hello World"
复制代码


现在我们看到上面的 ConfigMap 文件是不是正是我们前面在模板文件中设计的,现在我们删除当前的release:


$ helm delete ringed-lynxrelease "ringed-lynx" deleted
复制代码

3. 添加一个简单的模板

我们可以看到上面我们定义的 ConfigMap 的名字是固定的,但往往这并不是一种很好的做法,我们可以通过插入 release 的名称来生成资源的名称,比如这里 ConfigMap 的名称我们希望是:ringed-lynx-configmap,这就需要用到 Chart 的模板定义方法了。


Helm Chart 模板使用的是Go语言模板编写而成,并添加了Sprig库中的 50 多个附件模板函数以及一些其他特殊的函。


需要注意的是 kubernetes 资源对象的 labelsname 定义被限制 63 个字符,所以需要注意名称的定义。


现在我们来重新定义下上面的 configmap.yaml 文件:


apiVersion: v1kind: ConfigMapmetadata:  name: {{ .Release.Name }}-configmapdata:  myvalue: "Hello World"
复制代码


我们将名称替换成了{{ .Release.Name }}-configmap,其中包含在{{和}}之中的就是模板指令,{{ .Release.Name }}release 的名称注入到模板中来,这样最终生成的 ConfigMap 名称就是以 release 的名称开头的了。这里的 Release 模板对象属于 Helm 内置的一种对象,还有其他很多内置的对象,稍后我们将接触到。


现在我们来重新安装我们的 Chart 包,注意观察 ConfigMap 资源对象的名称:


$ helm install ./mycharthelm install ./mychart/NAME:   quoting-zebraLAST DEPLOYED: Fri Sep  7 23:20:12 2018NAMESPACE: defaultSTATUS: DEPLOYED
RESOURCES:==> v1/ConfigMapNAME DATA AGEquoting-zebra-configmap 1 0s
复制代码


可以看到现在生成的名称变成了quoting-zebra-configmap,证明已经生效了,当然我们也可以使用命令helm get manifest quoting-zebra查看最终生成的清单文件的样子。

4. 调试

我们用模板来生成资源文件的清单,但是如果我们想要调试就非常不方便了,不可能我们每次都去部署一个release实例来校验模板是否正确,所幸的时 Helm 为我们提供了--dry-run --debug这个可选参数,在执行helm install的时候带上这两个参数就可以把对应的 values 值和生成的最终的资源清单文件打印出来,而不会真正的去部署一个 release 实例,比如我们来调试上面创建的 chart 包:


$ helm install . --dry-run --debug ./mychart[debug] Created tunnel using local port: '35286'
[debug] SERVER: "127.0.0.1:35286"
[debug] Original chart version: ""[debug] CHART PATH: /root/course/kubeadm/helm/mychart
NAME: wrapping-bunnyREVISION: 1RELEASED: Fri Sep 7 23:23:09 2018CHART: mychart-0.1.0USER-SUPPLIED VALUES:{}
COMPUTED VALUES:...HOOKS:MANIFEST:
---# Source: mychart/templates/configmap.yamlapiVersion: v1kind: ConfigMapmetadata: name: wrapping-bunny-configmapdata: myvalue: "Hello World"
复制代码


现在我们使用--dry-run就可以很容易地测试代码了,不需要每次都去安装一个 release 实例了,但是要注意的是这不能确保 Kubernetes 本身就一定会接受生成的模板,在调试完成后,还是需要去安装一个实际的 release 实例来进行验证的。

5. 内置对象

刚刚我们使用{{.Release.Name}}将 release 的名称插入到模板中。这里的 Release 就是 Helm 的内置对象,下面是一些常用的内置对象,在需要的时候直接使用就可以:


Release:这个对象描述了 release 本身。它里面有几个对象:


  • Release.Name:release 名称

  • Release.Time:release 的时间

  • Release.Namespace:release 的 namespace(如果清单未覆盖)

  • Release.Service:release 服务的名称(始终是 Tiller)。

  • Release.Revision:此 release 的修订版本号,从 1 开始累加。

  • Release.IsUpgrade:如果当前操作是升级或回滚,则将其设置为 true

  • Release.IsInstall:如果当前操作是安装,则设置为 true


Values:从values.yaml文件和用户提供的文件传入模板的值。默认情况下,Values 是空的。


ChartChart.yaml文件的内容。所有的 Chart 对象都将从该文件中获取。


Files:这提供对 chart 中所有非特殊文件的访问。虽然无法使用它来访问模板,但可以使用它来访问 chart 中的其他文件。请参阅 "访问文件" 部分。


  • Files.Get 是一个按名称获取文件的函数(.Files.Get config.ini

  • Files.GetBytes 是将文件内容作为字节数组而不是字符串获取的函数。这对于像图片这样的东西很有用。


Capabilities:这提供了关于 Kubernetes 集群支持的功能的信息。


  • Capabilities.APIVersions 是一组版本信息。

  • Capabilities.KubeVersion 提供了查找 Kubernetes 版本的方法。它具有以下值:MajorMinorGitVersionGitCommitGitTreeStateBuildDateGoVersionCompiler,和Platform

  • Capabilities.TillerVersion 提供了查找 Tiller版本的方法。它具有以下值:SemVerGitCommit,和 GitTreeStateCapabilities.APIVersions.Has $version指示集群上是否有可用的版本(例如 batch/v1)或资源(例如)。apps/v1/DeploymentCapabilities.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


上面这些值可用于任何顶级模板,要注意内置值始终以大写字母开头。这也符合 Go 的命名约定。当你创建自己的名字时,你可以自由地使用适合你的团队的惯例。




✈<font color= #FF4500 size=4 style="font-family:Courier New">推荐阅读:</font>


发布于: 刚刚阅读数: 3
用户头像

ghostwritten

关注

还未添加个人签名 2018.11.14 加入

还未添加个人简介

评论

发布
暂无评论
helm charts 内置函数_Kubernetes_ghostwritten_InfoQ写作社区