Helm 是 Kubernetes 的包管理器,允许你通过模板来动态生成 Kubernetes 的资源配置文件。模板在 Helm Chart 中使用 Go 语言的 text/template
语法,Helm 在其基础上添加了一些特定的功能和内置对象,例如 .Values
、.Release
和 .Chart
等。
1. 基本模板语法
1.1 变量表达式
Helm 模板使用双大括号 {{ ... }}
包裹 Go 语言模板的表达式。例如,引用一个变量可以通过:
{{ .Values.someValue }}
在这个例子中,someValue
是 values.yaml
文件中的一个配置项。
1.2 条件语句
你可以使用 if
来控制逻辑:
{{ if .Values.enabled }}
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
{{ end }}
这里,只有当 enabled
为 true
时,才会生成 ConfigMap
。
1.3 循环
通过 range
遍历列表或字典:
{{ range .Values.items }}
- {{ .name }}: {{ .value }}
{{ end }}
这个例子会循环 items
数组,并生成相应的 name
和 value
。
1.4 注释
Helm 中的注释可以使用 {{/* */}}
包裹:
{{/* This is a comment in Helm template */}}
1.5 模板函数
Helm 内置了一些模板函数,例如 quote
, toYaml
, default
等。你可以使用这些函数来处理数据:
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | quote }}"
2. .Values
、.Release
和 .Chart
详解
在 Helm 中,模板通过 上下文对象 来提供数据,这些对象可以在模板中访问。
2.1 .Values
.Values
代表 Helm Chart 的 values.yaml
文件中定义的值。它包含了用户传入的所有可配置项。通过 .Values
,你可以动态地将用户定义的配置值插入到模板中。
-
示例:假设
values.yaml
文件包含以下内容:
replicaCount: 3
image:
repository: myapp
tag: latest
那么你可以在模板中这样引用:
replicas: {{ .Values.replicaCount }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
.Values
是一个对象,通常会反映 values.yaml
的层次结构,因此可以像访问结构体字段一样访问其嵌套值。
2.2 .Release
.Release
是一个全局对象,包含有关当前 Helm 部署的信息。它提供了以下常用字段:
-
.Release.Name
:发布的名称,通常是用户通过 Helm 安装命令指定的名称。 -
.Release.Namespace
:发布的命名空间。 -
.Release.Revision
:当前发布的修订版本号,每次升级发布时该值会递增。 -
.Release.Service
:部署此 Helm Chart 的 Helm 服务,通常为Helm
。
metadata:
name: {{ .Release.Name }}-app
namespace: {{ .Release.Namespace }}
2.3 .Chart
.Chart
是一个对象,包含当前 Helm Chart 的元数据信息,这些信息来源于 Chart.yaml
文件。常用的字段包括:
-
.Chart.Name
:Chart 的名称。 -
.Chart.Version
:Chart 的版本号。 -
.Chart.AppVersion
:应用程序的版本(通常是 Chart 部署的应用程序的版本,而不是 Chart 本身的版本)。 -
.Chart.Description
:Chart 的描述。 -
示例:在模板中,您可以通过
.Chart
获取 Chart 的元数据信息:
annotations:
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
3. 示例模板
假设我们有一个 values.yaml
文件:
replicaCount: 3
image:
repository: nginx
tag: 1.19.0
service:
port: 80
enabled: true
我们可以创建一个模板文件 deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-{{ .Values.image.repository }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
spec:
containers:
- name: {{ .Values.image.repository }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: {{ .Values.service.port }}
在这个模板中,我们使用 .Values
来获取用户定义的值,使用 .Release.Name
和 .Release.Namespace
来动态生成 Deployment 的名称和命名空间。
4. 内置对象总结
.Values
:引用values.yaml
文件中的内容,允许用户自定义 Chart 的配置。.Release
:包含与 Helm Release(发布)相关的元数据信息,如名称、命名空间、修订版本等。.Chart
:提供与 Helm Chart 自身相关的元数据信息,如名称、版本、描述等。
通过结合这些内置对象和 Helm 提供的模板语法,你可以构建灵活、动态的 Kubernetes 资源配置文件,适应不同的部署场景和需求。