helm模板文件chart编写语法详解
admin
2023-04-02 10:02:03
0

charts编写介绍

开始

快速创建一个chart模板,helm create mychart,执行命令后本地生成一个mychart目录.

chart目录结构

  • Chart.yaml: 该chart的描述文件,包括ico地址,版本信息等
  • vakues.yaml: 给模板文件使用的变量
  • charts: 依赖其他包的charts文件
  • requirements.yaml: 依赖的charts
  • README.md: 开发人员自己阅读的文件
  • templates: 存放k8s模板文件目录
    • NOTES.txt 说明文件,helm install之后展示给用户看的内容
    • deployment.yaml 创建k8s资源的yaml文件
    • _helpers.tpl: 下划线开头的文件,可以被其他模板引用.

一个最小的chart目录,只需要包含一个Chart.yaml,和templates目录下一个k8s资源文件.如:

    # mychart/Chart.yaml
    apiVersion: v1
    appVersion: 2.9.0
    version: 1.1.1

    # mychart/templates/configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: mychart-configmap
    data:
      myvalue: "Hello World"

helm的模板语法实现原理:

- go-template双
- sprig

helm模板语法

  1. 模板引用方式,{{ .Release.Name }}, 通过双括号注入,小数点开头表示从最顶层命名空间引用.

  2. helm内置对象
    # Release, release相关属性
    # Chart, Chart.yaml文件中定义的内容
    # Values, values.yaml文件中定义的内容
  3. 模板中使用管道
    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 }}
  4. if语句
    {{ if PIPELINE }}
    # Do something
    {{ else if OTHER PIPELINE }}
    # Do something else
    {{ else }}
    # Default case
    {{ end }}
  5. 操作符, and/eq/or/not

    {{/* include the body of this if statement when the variable .Values.fooString exists and is set to "foo" */}}
    {{ if and .Values.fooString (eq .Values.fooString "foo") }}
        {{ ... }}
    {{ end }}
    
    {{/* do not include the body of this if statement because unset variables evaluate to false and .Values.setVariable was negated with the not function. */}}
    {{ if or .Values.anUnsetVariable (not .Values.aSetVariable) }}
       {{ ... }}
    {{ end }}
  6. 控制语句块在渲染后生成模板会多出空行,需要使用{{- if ...}}的方式消除此空行.如:
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: {{ .Release.Name }}-configmap
    data:
      myvalue: "Hello World"
      {{- if eq .Values.favorite.drink "coffee"}}
      mug: true
      {{- end}}
  7. 引入相对命名空间,with命令:
    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 }}
  8. range命令实现循环,如:

    # values.yaml
    favorite:
      drink: coffee
      food: pizza
    pizzaToppings:
      - mushrooms
      - cheese
      - peppers
      - onions
    
    #configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: {{ .Release.Name }}-configmap
    data:
      myvalue: "Hello World"
      toppings: |-
        {{- range .Values.pizzaToppings }}
        - {{ . }}
        # .表示range的命令空间下的取值
        {{- end }}
        {{- range $key, $val := .Values.favorite }}
        {{ $key }}: {{ $val | quote }}
        {{- end}} 
  9. 变量赋值
    ApiVersion: v1
    Kind: ConfigMap
    Metadata:
      name: {{ .Release.Name }}-configmap
    Data:
      myvalue: "Hello World"
      # 由于下方的with语句引入相对命令空间,无法通过.Release引入,提前定义relname变量
      {{- $relname := .Release.Name -}}
      {{- with .Values.favorite }}
      food: {{ .food }}
      release: {{ $relname }}
      # 或者可以使用$符号,引入全局命名空间
      release: {{ $.Release.Name }}
      {{- end }}
  10. 公共模板,define定义,template引入,在templates目录中默认下划线_开头的文件为公共模板(_helpers.tpl)

    # _helpers.tpl文件
    {{- define "mychart.labels" }}
      labels:
        generator: helm
        date: {{ now | htmlDate }}
    {{- end }}
    
    # configmap.yaml文件
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: {{ .Release.Name }}-configmap
      {{- template "mychart.labels" }}
    data:
      myvalue: "Hello World"
  11. template语句的升级版本include,template是语句无法在后面接管道符来对引入变量做定义,
    include实现了此功能.

    # _helpers.tpl文件
    {{- define "mychart.app" -}}
    app_name: {{ .Chart.Name }}
    app_version: "{{ .Chart.Version }}+{{ .Release.Time.Seconds }}"
    {{- end -}}
    
    # configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: {{ .Release.Name }}-configmap
      labels:
        {{- include "mychart.app" . | nindent 4 }}
    data:
      myvalue: "Hello World"
      {{- range $key, $val := .Values.favorite }}
      {{ $key }}: {{ $val | quote }}
      {{- end }}
      {{- include "mychart.app" . | nindent 2 }}
    
    # 如果使用template只能手动空格,不能使用管道后的nindent函数来做缩进
  12. 一个坑helm install stable/drupal --set image=my-registry/drupal:0.1.0 --set livenessProbe.exec.command=[cat,docroot/CHANGELOG.txt] --set livenessProbe.httpGet=null
    ,livenessProbe在values.yaml中定义了httpGet,需要手动设置为null,然后设置exec的探针.

相关内容

热门资讯

17岁高中生写作业至凌晨,外出... 5月11日,据青海大通县融媒体中心消息:大通县公安局表示,5月8日6时15分,大通县公安局桥头派出所...
天猫“国货严选”纯棉一次性内裤... 淘宝天猫国货严选旗舰店内一次性内裤宣称“纯棉”,“假一赔十”,实际收到商品为“100%聚酯纤维”。近...
字节砍掉30%的AI项目?背后... 来源:市场资讯 (来源:钛媒体APP) 5月9日,一则关于字节跳动AI战略的消息,在社交媒体上迅速发...
戴尔电脑频繁出现蓝屏死机、重启... IT之家 5 月 11 日消息,Windows 11 更新时常出故障并引发各类问题,其中最让用户恼火...
分享PD氮化镓快充哪个品牌款式... 现在不少小伙伴选氮化镓快充头,尤其是苹果用户,找来找去都会纠结:PD氮化镓快充哪个品牌款式多,苹果氮...
激光近视手术和ICL晶体植入哪... 很多想摘镜的朋友都会纠结:选激光手术,还是ICL晶体植入?到底哪种更安全、更适合自己?广州英华眼科蔡...
原创 天... 备受科技圈关注的联发科技 MTK 天玑开发者大会即将启幕,# 天玑开发者大会# 话题提前霸占数码热搜...
量子力学如何开辟了人类认识和改... 量子力学是 20 世纪最具颠覆性、最具奠基性的基础科学革命成果,与相对论共同构筑起现代物理学两大支柱...
广西企业储存罐爆裂,大量棕褐色... 5月11日,贵港市港北区应急管理局发布情况通报:2026年5月11日14时许,广西对比生物科技有限公...
涉及文物归还,马克龙:这一进程... 据法新社报道,法国总统马克龙当地时间5月11日在肯尼亚内罗毕举行的经济峰会上表示,归还殖民时期掠夺的...