Helm templates 中的語法


官方文檔:https://helm.sh/docs/chart_template_guide/function_list/

_helpers.tpl

在chart中以 “下划線” 開頭的文件,稱為”子模版”。
例如在 _helper.tpl 中定義子模塊,格式:{{- define "模版名字" -}} 模版內容 {{- end -}}

{{- define "nginx.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}

# 若 .Values.nameOverride 為空,則默認值為 .Chart.Name

引用模板,格式:{{ include "模版名字" 作用域}}

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "nginx.fullname" . }}

內置對象

Build-in Objects: https://helm.sh/docs/chart_template_guide/builtin_objects/

Chart 預定義對象可直接在各模板中使用。

Release:      代表Release對象,屬性包含:Release.Name、Release.Namespace、Release.Revision等
Values:       表示 values.yaml 文件數據
Chart:        表示 Chart.yaml 數據
Files:        用於訪問 chart 中非標准文件

Capabilities: 用於獲取 k8s 集群的一些信息
   - Capabilities.KubeVersion.Major:K8s的主版本

Template:     表示當前被執行的模板
   - Name:表示模板名,如:mychart/templates/mytemplate.yaml
   - BasePath:表示路徑,如:mychart/templates

變量

默認情況點( . ), 代表全局作用域,用於引用全局對象。
helm 全局作用域中有兩個重要的全局對象:Values 和 Release

# Values
# 這里引用了全局作用域下的Values對象中的key屬性。 
{{ .Values.key }}
Values代表的就是values.yaml定義的參數,通過.Values可以引用任意參數。
例子:
{{ .Values.replicaCount }}

# 引用嵌套對象例子,跟引用json嵌套對象類似
{{ .Values.image.repository }}

# Release 
其代表一次應用發布,下面是Release對象包含的屬性字段:
Release.Name       - release的名字,一般通過Chart.yaml定義,或者通過helm命令在安裝應用的時候指定。
Release.Time       - release安裝時間
Release.Namespace  - k8s名字空間
Release.Revision   - release版本號,是一個遞增值,每次更新都會加一
Release.IsUpgrade  - true代表,當前release是一次更新.
Release.IsInstall  - true代表,當前release是一次安裝
Release.Service:   - The service that is rendering the present template. On Helm, this is always Helm.

自定義模版變量。

# 變量名以$開始命名, 賦值運算符是 := (冒號+等號)
{{- $relname := .Release.Name -}}

引用自定義變量:
#不需要 . 引用
{{ $relname }}

include

include 是一個函數,所以他的輸出結果是可以傳給其他函數的

# 例子1:
env:
  {{- include "xiaomage" . }}

# 結果:
          env:
- name: name
  value: xiaomage
- name: age
  value: secret
- name: favourite
  value: "Cloud Native DevSecOps"
- name: wechat
  value: majinghe11

# 例子2:
env:
  {{- include "xiaomage" . | indent 8}}

# 結果:
          env:
            - name: name
              value: xiaomage
            - name: age
              value: secret
            - name: favourite
              value: "Cloud Native DevSecOps"
            - name: wechat
              value: majinghe11

with

with 關鍵字可以控制變量的作用域,主要就是用來修改 . 作用域的,默認 . 代表全局作用域,with 語句可以修改 . 的含義

# 例子:
# .Values.favorite 是一個 object 類型
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}   # 相當於.Values.favorite.drink
food:  {{ .food  | upper | quote }}
{{- end }}

toYaml 轉 yaml

將數據轉為yaml格式

spec:
  strategy:
{{ toYaml .Values.strategy | indent 4 }}

------------------------------------------------------------------
values.yaml數據:
strategy:
  type: RollingUpdate
  rollingUpdate:
    maxUnavailable: 0

------------------------------------------------------------------
渲染效果:
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0

Values 對象

values 對象的值有四個來源

  1. chart 包中的 values.yaml 文件
  2. 父 chart 包的 values.yaml 文件
  3. 使用 helm install 或者 helm upgrade 的 -f 或者 --values 參數傳入的自定義的 yaml 文件
  4. 通過 --set 參數傳入的值
cat global.yaml 
course: k8s

cat mychart/templates/configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  course:  {{ .Values.course }}

helm install --name mychart --dry-run --debug -f global.yaml ./mychart/
helm install --name mychart --dry-run --debug --set course="k8s" ./mychart/

# 運行部分結果:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "Hello World"
  course:  k8s
# 編輯 mychart/values.yaml,在最后加入
course:
  k8s: klvchen
  python: lily

cat mychart/templates/configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  k8s:  {{ quote .Values.course.k8s }}      # quote 叫雙引號
  python:  {{ .Values.course.python }}

helm install --name mychart --dry-run --debug ./mychart/

# 運行結果:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "Hello World"
  k8s:  "klvchen"
  python:  lily

管道

k8s:  {{ quote .Values.course.k8s }} # 加雙引號
k8s:  {{ .Values.course.k8s | upper | quote }} # 大寫字符串加雙引號
k8s:  {{ .Values.course.k8s | repeat 3 | quote }} # 加雙引號和重復3次字符串

if/else 條件

if/else 塊是用於在模板中有條件地包含文本塊的方法,條件塊的基本結構

{{ if PIPELINE }}
   # Do something
{{ else if OTHER PIPELINE }}
   # Do something else
{{ else }}
   # Default case
{{ end }}

# 判斷條件,如果值為以下幾種情況,管道的結果為 false:
1. 一個布爾類型的假
2. 一個數字零
3. 一個空的字符串
4. 一個 nil(空或null)
5. 一個空的集合(map, slice, tuple, dict, array)
除了上面的這些情況外,其他所有的條件都為真。

# 例子
cat mychart/templates/configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: {{ .Values.hello | default "Hello World" | quote }}
  k8s:  {{ .Values.course.k8s | upper | quote | repeat 3 }}
  python:  {{ .Values.course.python | repeat 3 | quote }}
  {{ if eq .Values.course.python "django" }}web: true{{ end }}

helm install --name mychart --dry-run --debug ./mychart/

運行部分結果:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "Hello World"
  k8s:  "KLVCHEN""KLVCHEN""KLVCHEN"
  python:  "djangodjangodjango"
  web: true

# 空格控制
{{- if eq .Values.course.python "django" }}
web: true
{{- end }}

With 關鍵字

with 關鍵字可以控制變量的作用域

{{ .Release.xxx }} 其中的.就是表示對當前范圍的引用,.Values就是告訴模板在當前范圍中查找Values對象的值。

with 語句可以允許將當前范圍 . 設置為特定的對象,比如我們前面一直使用的 .Values.course,我們可以
使用 with 來將范圍指向 .Values.course:(templates/configmap.yaml)

with主要就是用來修改 . 作用域的,默認 . 代表全局作用域,with語句可以修改.的含義.

語法:
{{ with 引用的對象 }}
這里可以使用 . (點), 直接引用with指定的對象
{{ end }}

例子:
#.Values.favorite是一個object類型
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}   #相當於.Values.favorite.drink
food: {{ .food | upper | quote }}
{{- end }}

range 關鍵字

range主要用於循環遍歷數組類型。

語法1:
# 遍歷map類型,用於遍歷鍵值對象
# 變量key代表對象的屬性名,val代表屬性值
{{- range key,val := 鍵值對象 }}
{{ $key }}: {{ $val | quote }}
{{- end}}

語法2:
{{- range 數組 }}
{{ . | title | quote }} # . (點),引用數組元素值。
{{- end }}

例子:
# values.yaml定義
# map類型
favorite:
  drink: coffee
  food: pizza
 
# 數組類型
pizzaToppings:
  - mushrooms
  - cheese
  - peppers
  - onions
 
# map類型遍歷例子:
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}
{{- end}}
 
# 數組類型遍歷例子:
{{- range .Values.pizzaToppings}}
{{ . | quote }}
{{- end}}

參考:https://chenyongjun.vip/articles/136


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM