helm3自定义chart编写

当我们安装好helm之后我们可以开始自定义chart,那么我们需要先创建出一个模板如下:

helm create myapp

之后我们可以一下目录结构,目录的作用我简要介绍一下:

templates/ 目录包括了模板文件。当Helm评估chart时,会通过模板渲染引擎将所有文件发送到templates/目录中。 然后收集模板的结果并发送给Kubernetes。

  • _helpers.tpl里面的内容是定义模板用的,所有模板都可以再这里定义,然后再任何yaml文件当中都可以调用这个文件下的模板
  • NOTES.txt: chart的"帮助文本"。这会在你的用户执行helm install时展示给他们。
  • deployment.yaml: 创建Kubernetes 工作负载的基本清单
  • service.yaml: 为你的工作负载创建一个 service终端基本清单。
  • _helpers.tpl: 放置可以通过chart复用的模板辅助对象

values.yaml 文件也导入到了模板。这个文件包含了chart的 默认值 。这些值会在用户执行helm install 或 helm upgrade时被覆盖。

Chart.yaml 文件包含了该chart的描述。你可以从模板中访问它。charts/目录 可以 包含其他的chart(称之为 子chart)。 指南稍后我们会看到当涉及模板渲染时这些是如何工作的。

 

$tree myapp/
myapp/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

3 directories, 10 files

现在展示一下我所创建的chart为例

$tree myapp/
myapp/
├── charts
├── Chart.yaml
├── templates
│   ├── configmap.yaml
│   └── _helpers.tpl
├── test.yaml
├── values.yaml
└── values.yaml.bak

2 directories, 7 files

其中我修改过的内容如下:

$cat values.yaml
favorite:
  drink: coffee
  food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
$cat templates/configmap.yaml
{{ $release := "ok" }}
apiVersion: v1
kind: ConfigMap
metadata:
    name: {{ .Release.Name }}-configmap
    labels:
    {{- include "mychart.labels" . | indent 8 }}
data:
    myvalue: "Hello World"
    {{- with .Values.favorite }}
    drink: {{ .drink }}
    food: {{ .food }}
    release: {{ $release }}
    {{- end }}
    {{- if eq .Values.favorite.drink "coffee" }}
    mug: true
    {{- end }}
    toppings: |-
        {{- range $.Values.pizzaToppings }}
        -{{ . | title | quote }}
        {{- end }}
    size: |-
        {{- range $index,$name := tuple "small" "medium" "large" }}
        {{ $index }}: {{ $name }}
        {{- end }}
$cat templates/_helpers.tpl
{{/* Generate basic labels */}}
{{- define "mychart.labels" }}
generator: helm
date: {{ now | htmlDate }}
chart: {{ .Chart.Name }}
version: {{ .Chart.Version }}
{{- end }}

 上述所需要的技术点:

设置自定义变量

{{ $release := "ok" }}

引用内部变量,其中.就是当前作用域的变量,Release.Name为helm install的名字

name: {{ .Release.Name }}-configmap

引用模板,其中{{-代表去除前面的空格-}}代表去除后面的空格,include代表引用模板,mychart.labels为引用模板的内容(内容再_helpers.tpl中),后面的.代表全局作用域,否则_helpers中的有些内容将获取不到,管道符|代表把前面的内容赋予给管道符,然后缩进8个空格

{{- include "mychart.labels" . | indent 8 }}

with代表循环,循环的只为values.yam文件中的内容,注意,必须为大写Values,{{.drink}}为所循环出来的下一级,也就是values.yaml下的favorite下的drink字段,其实也可以循环tuple等类型

{{- with .Values.favorite }}
    drink: {{ .drink }}
    food: {{ .food }}
    release: {{ $release }}
{{- end }}

if判断语句,eq代表等于(还有ge,lt,ne等),那么下面的意思是如果values.yaml文件中favorite下的drink内容为coffee,那么就添加一个mug:true字段

{{- if eq .Values.favorite.drink "coffee" }}
mug: true
{{- end }}

range也代表循环,$代表顶级作用域,意思是说不管再那个作用域,只要出现$都可以调用顶级的变量,那么循环的内容也再_helpers.tpl文件中,.代表循环出来的单个内容然后给title处理变成抬头,再给quote函数处理,quote代表字符串化

toppings: |-
        {{- range $.Values.pizzaToppings }}
        -{{ . | title | quote }}
        {{- end }}

对于range也可以循环tuple等类型,如下,其中$index代表索引,$name代表循环tuple的具体内容

size: |-
        {{- range $index,$name := tuple "small" "medium" "large" }}
        {{ $index }}: {{ $name }}
        {{- end }}

对于_helpers.tpl内容解释如下,{{/* */}}代表注释,{{- define代表定义一个模板,后面跟着模板名字,其中.Chart代表调用Chart.yaml文件的内容

{{/* Generate basic labels */}}
{{- define "mychart.labels" }}
generator: helm
date: {{ now | htmlDate }}
chart: {{ .Chart.Name }}
version: {{ .Chart.Version }}
{{- end }}

以上内容执行后如下:可以跟着文件对照一下结果

$helm install mytest ../myapp/ --dry-run --debug
install.go:173: [debug] Original chart version: ""
install.go:190: [debug] CHART PATH: /home/admin/myapp

NAME: mytest
LAST DEPLOYED: Thu Jun 10 19:08:17 2021
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}

COMPUTED VALUES:
favorite:
  drink: coffee
  food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions

HOOKS:
MANIFEST:
---
# Source: myapp/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
    name: mytest-configmap
    labels:
        generator: helm
        date: 2021-06-10
        chart: myapp
        version: 0.1.0
data:
    myvalue: "Hello World"
    drink: coffee
    food: pizza
    release: ok
    mug: true
    toppings: |-
        -"Mushrooms"
        -"Cheese"
        -"Peppers"
        -"Onions"
    size: |-
        0: small
        1: medium
        2: large

未完待续...................

posted @ 2021-06-10 18:36  力王7314  阅读(1665)  评论(0编辑  收藏  举报