helm说白了其实就是一个模板渲染系统,核心就在templates和values,模板使用了go template编写的,并且增加了sprig库,共计50个左右的附加模板函数和其他的一些函数。如果要进行使用,必然要遵循template的模板的约定),比如
{{ if pipeline }} T1 {{ else }} {{ if pipeline }} T0 {{end}} { end}
{{ range pipeline }} T1 {{ end }}
if或者range开头的都需要end结尾,并且可以指定引用a模板
{{ templete "a" }}
这些,可以在go文档库中找到,但是这些还不够,sprig还能解决一些大小写等的问题。
除此之外,helm的docs中也有自己的一些函数。
而这些模板存储在templates目录下, 当helm渲染charts,就会通过模板引擎传递目录中文件,而values可以通过两种方式提供:
- Chart 开发人员可以在 chart 内部提供一个名为
values.yaml
的文件,该文件可以包含默认的 values 值内容。 - Chart 用户可以提供包含 values 值的 YAML 文件,可以在命令行中通过
helm install
来指定该文件。
当用户提供自定义 values 值的时候,这些值将覆盖 chart 中 values.yaml
文件中的相应的值。
简单示例
mysql的包,目录结构如下
[root@linuxea.com /data/helm/mysql]# tree ./
./
├── Chart.yaml
├── README.md
├── templates
│ ├── configurationFiles-configmap.yaml
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── initializationFiles-configmap.yaml
│ ├── NOTES.txt
│ ├── pvc.yaml
│ ├── secrets.yaml
│ ├── serviceaccount.yaml
│ ├── servicemonitor.yaml
│ ├── svc.yaml
│ └── tests
│ ├── test-configmap.yaml
│ └── test.yaml
└── values.yaml
2 directories, 15 files
打开svc.conf你会看到如下的格式,这种就是template的样式,这些值是通过value来进行替换成value中的值
[root@linuxea.com /data/helm/mysql]# cat templates/svc.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ template "mysql.fullname" . }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ template "mysql.fullname" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: "{{ .Release.Name }}"
heritage: "{{ .Release.Service }}"
annotations:
{{- if .Values.service.annotations }}
{{ toYaml .Values.service.annotations | indent 4 }}
{{- end }}
{{- if and (.Values.metrics.enabled) (.Values.metrics.annotations) }}
{{ toYaml .Values.metrics.annotations | indent 4 }}
{{- end }}
spec:
type: {{ .Values.service.type }}
{{- if (and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerIP))) }}
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
{{- end }}
ports:
- name: mysql
port: {{ .Values.service.port }}
targetPort: mysql
{{- if .Values.service.nodePort }}
nodePort: {{ .Values.service.nodePort }}
{{- end }}
{{- if .Values.mysqlx.port.enabled }}
- name: mysqlx
port: 33060
targetPort: mysqlx
protocol: TCP
{{- end }}
{{- if .Values.metrics.enabled }}
- name: metrics
port: 9104
targetPort: metrics
{{- end }}
selector:
app: {{ template "mysql.fullname" . }}
以上面port: {{ .Values.service.port }}
为例 ,values.yaml的值如下,意思就是替换城3306端口
service:
annotations: {}
type: ClusterIP
port: 3306
而这种方式也可以通过--set
来进行替换
预定义 Values
在模板中用 .Values
可以获取到 values.yaml
文件(或者 --set
参数)提供的 values 值,此外,还可以在模板中访问其他预定义的数据。预定义可用于每个模板、并且不能被覆盖的 values 值,与所有 values 值一样,名称都是区分大小写的,而预定义的都是大写开头的,如下的values都可以在模板中获取到
Release.Name
:release 的名称(不是 chart),通过helm ls查看到的Release.Namespace
:release 被安装到的命名空间Release.Service
:渲染当前模板的服务,在 Helm 上,实际上该值始终为 HelmRelease.IsUpgrade
:如果当前操作是升级或回滚,则该值为 trueRelease.IsInstall
:如果当前操作是安装,则该值为 trueChart
:Chart.yaml
文件的内容,可以通过Chart.Version
来获得 Chart 的版本,通过Chart.Maintainers
可以获取维护者信息Files
: 一个包含 chart 中所有非特殊文件的 map 对象,这不会给你访问模板的权限,但是会给你访问存在的其他文件的权限(除非使用.helmignore
排除它们),可以使用{{ index .Files "file.name" }}
或者{{ .Files.Get name }}
或者{{ .Files.GetString name }}
函数来访问文件,你还可以使用{{ .Files.GetBytes }}
以[]byte
的形式获取访问文件的内容Capabilities
:也是一个类 map 的对象,其中包含有关 Kubernetes 版本({{ .Capabilities.KubeVersion }}
)和支持的 Kubernetes API 版本({{ .Capabilities.APIVersions.Has "batch/v1" }}
)信息。常被用来判断版本信息等
注意
任何未知的 Chart.yaml
字段都会被删除,在 Chart 对象内部无法访问他们,所以,Chart.yaml
不能用于将任意结构化的数据传递到模板中,但是可以使用 values 文件来传递。
模板渲染
当我们有一些模板是想渲染而不是执行到kubernetes的时候,就可以使用template
helm template mysql stable/mysql
helm install只是将上面的渲染直接安装了而已
除次之外,也可以使用--dry-run --debug
来查看整个渲染和执行的过程
helm install --dry-run --debug mysql123 stable/mysql
当然,他们都不会真的运行
CRD
helm3中, 当定义后,CRD被使用之前都会先安装CRD目录下所有的CRD,而这些CRD不能使用模板。而一旦CRD被使用,就会等到CRD安装成功,否则是不会渲染模板并安装的
因为CRD是全局安装的,所以在卸载的时候需要手动去卸载,并且CRD只有在安装操作的时候才会被创建,如果helm中的CRDS已经存在,且无论是什么版本,helm都不会重新安装或者升级。
而一旦删除CRD,将会自动删除集群中所有namespace的CRD