linuxea:helm3模板渲染(2)

marksugar
2022-05-01 / 0 评论 / 261 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年05月01日,已超过98天没有更新,若内容或图片失效,请留言反馈。

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 上,实际上该值始终为 Helm
  • Release.IsUpgrade:如果当前操作是升级或回滚,则该值为 true
  • Release.IsInstall:如果当前操作是安装,则该值为 true
  • ChartChart.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

0

评论

博主关闭了当前页面的评论