Helm ABC

来自牛奶河Wiki
阿奔讨论 | 贡献2024年7月23日 (二) 16:37的版本 →‎函数
跳到导航 跳到搜索

yaml 中的语法、函数。

控制结构

# values.yaml
favorite:
  drink: coffee
  food: pizza
pizzaToppings:
  - mushrooms
  - cheese
  - peppers
  - onions

# Source: mychart/templates/configmap.yaml
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 }}
  {{ if eq .drink "coffee" }}mug: "true"{{ end }}
  {{- end }}
  toppings: |-
    {{- range .Values.pizzaToppings }}
    - {{ . | title | quote }}
    {{- end }}

# Output
apiVersion: v1
kind: ConfigMap
metadata:
  name: edgy-dragonfly-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"
  mug: "true"
  toppings: |-
    - "Mushrooms"
    - "Cheese"
    - "Peppers"
    - "Onions"

if

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

  # if 写成换行,就需要用 {{- 格式删除空格/回车
  {{- if eq $.Values.favorite.drink "coffee" }}
  mug: "true"
  {{- end }}

  # 要确保 {{- 和其他命令之间有一个空格。{{- 3 }} 表示“删除左边空格并打印3”,而 {{-3 }} 表示“打印 -3 ”。

with

用来指定范围,PIPELINE 值不为空时执行

{{- with PIPELINE }}
# restricted scope
{{- end }}

# 修改配置映射中的 . 的作用域指向 .Values.favorite
# .drink --> .Values.favorite.drink
# $.Release --> .Release

range

range 方法遍历列表(list)、元组(tuple )、map、dict 等多值结构,若不指定变量(如:列表、元组),则 . 为当前的值。

  • range 内部会改变变量路径,相当于 with。解决办法是预先定义变量,或者使用 $. 绝对路径
  • 在 Helm 模板中,$index 内置变量会在 range 循环内自动生成,代表着循环中当前迭代的索引
  ## 1
  toppings: |-
    {{- range $index, $topping := .Values.pizzaToppings }}
    {{ $index }}: {{ $topping }}
    {{- end }}

  ## 1 - output
  toppings: |-
    0: mushrooms
    1: cheese
    2: peppers
    3: onions 

  ## 2
  sizes: |-
    {{- range tuple "small" "medium" "large" }}
    - {{ . }}
    {{- end }}

  ## 2 - output
  sizes: |-
    - small
    - medium
    - large

Sample

需要说明的是默认值:如果值是 true/false,{{ ...| default false }} 显然是正确的(default true 不合适),否则当原值不存在,或者是 false,都会触发 default。

# values.yaml
loop:
  - 1
  - 2
enable:
  pizza: true
  baozi: false
favorite:
  drink: coffee
  food: pizza
pizzaToppings:
  - mushrooms
  - cheese
  - peppers
  - onions

# templates/configmap.yaml
{{- $Release        := .Release.Name }}
{{- $enable         := .Values.enable.pizza | default false }}
{{- $favorite       := .Values.favorite }}
{{- $pizzaToppings  := .Values.pizzaToppings }}
{{- if $enable }}
{{- range $loop1 := .Values.loop }}
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ $Release }}-configmap-{{ $loop1 }}
  myvalue: "Hello World"
  {{- range $ky, $val := $favorite }}
  {{ $ky }}: {{ $val }}
  {{- end }}
toppings: |-
  {{- range $pizzaToppings }}
  - {{ . | title }}
  {{- end }}
---
{{- end }}
{{- end }}

函数

Helm 函数的一般建议使用方法是类似于管道的方法,如:

  • .Values.pizza | default false
  • .Values.pizza | quote
分类 名称 功能 备注
字符串 quote 转为字符串
default 默认值 空、false 均被判定

Error

  • Error: YAML parse error on ??.yaml: error converting YAML to JSON: yaml: line 8: did not find expected key

一般此种情况,多是缩进格式问题