2-chart模板
模板内置对象
helm install my-release ./mychart
# {{ .Release.Name }} 的值为 my-release
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 指南 中列出了可获得属性
* Files: 在chart中提供访问所有的非特殊文件的对象。你不能使用它访问Template对象,只能访问其他文件。 请查看这个 文件访问部分了解更多信息
* 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文件
values的赋值方式
Helm模板提供的内置对象Values其内容来自于多个位置:
- 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文件结构化(官网不建议这样配置)
values文件也可以包含更多结构化的内容。比如我们可以在values.yaml文件中创建一个favorite项,然后添加一些key:
favorite:
drink: coffee
food: pizza
模板中使用以下变量进行引用:
drink: {{ .Values.favorite.drink }}
food: {{ .Values.favorite.food }}
删除默认的key
如果需要从默认的value中删除key,可以将key设置为null。否则Helm会把默认的key和重写的key合并在一起
helm install stable/drupal --setimage=my-registry/drupal:0.1.0 --set livenessProbe.exec.command=[cat,docroot/CHANGELOG.txt]--set livenessProbe.httpGet=null
模板函数
helm有超过60个可用函数,可在以下链接中查看
https://masterminds.github.io/sprig/
https://pkg.go.dev/text/template
函数应用
quote:将传入的字符串值用双引号包裹起来
upper:将传入的字符串大写表示
repeat:将传入的字符串重复特定的次数
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{.Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{.Values.favorite.drink | repeat 5 | quote }}
food: {{.Values.favorite.food | upper | quote }}
default函数
在模板中指定一个默认值,当key没有指定值时,使用默认值:
# 当.Values.favorite.drink 没有指定其值时,drink的值为"tea"
drink: {{.Values.favorite.drink | default "tea" | quote }}
lookup函数
语法:
lookup apiVersion kind [namespace] [name]
lookup "v1" "Pod" "mynamespace" "mypod"
# name 和 namespace 都是选填的,且可以传空字符串("")作为空
下面的例子将返回mynamespace对象的annotations属性:
(lookup "v1" "Namespace" "" "mynamespace").metadata.annotations
更多函数和用法参见模板函数列表
https://helm.sh/zh/docs/chart_template_guide/function_list/
删除yaml文件中的空行
{{- (包括添加的横杠和空格)表示向左删除空白
-}}(包括添加的横杠和空格)表示向右删除空白
一定注意空格就是换行
要确保-和其他命令之间有一个空格。 {{- 3 }} 表示“删除左边空格并打印3”,而{{-3 }}表示“打印-3”。
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{.Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{.Values.favorite.drink | default "tea" | quote }}
food: {{.Values.favorite.food | upper | quote }}
{{- if eq .Values.favorite.drink "coffee" }} # 这行空行会被删除
mug: "true"
{{- end }} # 这行空行会被删除
使用with修改变量的作用域
. 是对当前作用域的引用,使用with来重置。.表示的作用域,作用范围到{{ end }}为止
apiVersion: v1
kind: ConfigMap
metadata:
name: {{.Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- with .Values.favorite }}
# 和上一个例子作比较,作用域被更新为.Values.favorite,因此不必再次指定
drink: {{.drink | default "tea" | quote }}
food: {{.food | upper | quote }}
# 这样写是错误的,因为作用域已重置
release: {{ .Release.Name }}
# 使用$从父作用域中访问Release.Name对象。当模板开始执行后$会被映射到根作用域
release: {{ $.Release.Name }}
{{- end }}
使用range操作循环
开始之前,我们先在values.yaml文件添加一个披萨的配料列表:
favorite:
drink:coffee
food:pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
现在我们有了一个pizzaToppings列表(模板中称为切片)。修改模板把这个列表打印到配置映射中:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{.Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- with .Values.favorite }}
drink: {{.drink | default "tea" | quote }}
food: {{.food | upper | quote }}
{{- end }}
toppings: |-
{{- range .Values.pizzaToppings }}
# 两种格式都可以
{{- range .Values.pizzaToppings }}
- {{ . | title | quote }}
{{- end }}
如果执行这个模板,输出是这样的:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: edgy-dragonfly-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
toppings: |-
- "Mushrooms"
- "Cheese"
- "Peppers"
- "Onions"
toppings: |-行是声明的多行字符串。所以这个配料列表实际上不是YAML列表, 是个大字符串。为什么要这样做?因为在配置映射data中的数据是由键值对组成,key和value都是简单的字符串。
要理解这个示例,请查看 Kubernetes ConfigMap 文档。 但对于我们来说,这个细节并不重要。
正如例子中所示,|-标识在YAML中是指多行字符串。这在清单列表中嵌入大块数据是很有用的技术。
变量
apiVersion: v1
kind: ConfigMap
metadata:
name: {{.Release.Name }}-configmap
data:
myvalue: "Hello World"
# 赋值
{{- $relname := .Release.Name -}}
{{- with .Values.favorite }}
drink: {{.drink | default "tea" | quote }}
food: {{.food | upper | quote }}
# 引用
release: {{ $relname }}
{{- end }}
变量在range中的使用
toppings: |-
# 同时将索引和值设为变量
{{- range $index, $topping := .Values.pizzaToppings }}
{{ $index }}: {{ $topping }}
{{- end }}
# 输出如下:
toppings:|-
0: mushrooms
1: cheese
2: peppers
3: onions
对于数据结构有key和value,可以使用range获取key和value。比如,可以通过.Values.favorite进行循环:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{.Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- range $key, $val := .Values.favorite }}
{{ $key }} : {{ $val | quote }}
{{- end }}
# 输出如下
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: eager-rabbit-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "pizza"
命名模板
定义命名模板 关键字 define
将命名模板写在 _开头,tpl结尾的文件中,例如:_helpers.tpl
{{- define "mychart.labels" }}
labels:
generator: helm
date: {{now | htmlDate }}
{{- end }}
引用命名模板 关键字 template
{{- template "mychart.labels" }}
设置模板范围
注意这个在template调用末尾传入的.,我们可以简单传入.Values或.Values.favorite或其他需要的范围。但一定要是顶层范围。
apiVersion: v1
kind: ConfigMap
metadata:
name: {{.Release.Name }}-configmap
{{- template "mychart.labels" . }}
处理模板缩进 关键字 include
相较于使用template,在helm中使用include被认为是更好的方式 只是为了更好地处理YAML文档的输出格式
apiVersion: v1
kind: ConfigMap
metadata:
name: {{.Release.Name }}-configmap
labels:
{{include "mychart.app" . | indent 4 }}
data:
myvalue: "Hello World"
{{- range $key, $val := .Values.favorite }}
{{$key }}:{{$val | quote }}
{{- end }}
{{include "mychart.app" . | indent 2 }}
使用.File访问文件
* 通常处于安全考虑,一些文件无法通过.Files对象访问:
* 无法访问templates/中的文件
* 无法访问使用.helmignore排除的文件
* helm应用 subchart之外的文件,包括父级中的,不能被访问的
.File.Get获取文件中的所有内容
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
{{- $files := .Files }}
{{- range tuple "config1.toml" "config2.toml" "config3.toml" }}
{{ . }}: |- # . 分别代表"config1.toml" "config2.toml" "config3.toml"
{{ $files.Get . }} # 依次获取文件中的内容
{{- end }}
.File.Glob 遍历Chart文件目录,返回文件路径列表。可以进行通配符匹配
{{ $currentScope := .}}
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{- with $currentScope}}
{{ .Files.Get $path }}
{{- end }}
{{ end }}
# $path为临时变量,代表.File.Glob中的每个元素
# $_是一个用于占位的变量,因为在这个循环中只对文件路径感兴趣,不需要处理文件内容
# **.yaml通配yaml结尾的文件
或者
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{ $.Files.Get $path }} # $将作用域置为.
{{ end }}
简化 ConfigMap 和 Secret 数据的生成
AsConfig 和 AsSecrets 是 Helm 3 引入的两个内置函数,用于将字符串或文件内容转换为 ConfigMap 和 Secret 对象的数据格式。
简化 ConfigMap 和 Secret 数据的生成
apiVersion: v1
kind: ConfigMap
metadata:
name: conf
data:
{{ (.Files.Glob "foo/*").AsConfig | indent 2 }}
apiVersion: v1
kind: Secret
metadata:
name: very-secret
type: Opaque
data:
{{ (.Files.Glob "bar/*").AsSecrets | indent 2 }}
b64enc对文件内容进行编码
apiVersion: v1
kind: Secret
metadata:
name: {{ .Release.Name }}-secret
type: Opaque
data:
token: |-
{{ .Files.Get "config1.toml" | b64enc }}
# token的值为 bWVzc2FnZSA9IEhlbGxvIGZyb20gY29uZmlnIDEK
Lines读取文件的每一行
data:
some-file.txt: {{ range .Files.Lines "foo/bar.txt" }}
{{ . }}{{ end }}
全局chart值
全局值是使用完全一样的名字在所有的chart及子chart中都能访问的值。
全局变量需要显式声明。不能将现有的非全局值作为全局值使用。
父chart会覆盖子chart中的值
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
salad: {{ .Values.global.salad }} # 使用global来显式声明
.helmignore文件,排除不想包含在chart中的文件
.helmignore文件示例
# 匹配任意文件或目录名字叫.helmignore
.helmignore
# 匹配任意文件或目录名字叫.git
.git
# 匹配任意txt文件
*.txt
# 只匹配目录,名字叫mydir
mydir/
# 只匹配顶级目录中的txt文件
/*.txt
# 只匹配顶级目录中的foo.txt文件
/foo.txt
# 匹配任意文件叫 ab.txt, ac.txt, or ad.txt
a[b-d].txt
# 匹配子目录temp*下的任意文件
*/temp*
*/*/temp*
temp?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)