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?
posted @   立勋  阅读(18)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示