helm3 Chart模版

949 阅读3分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

前面章节,我们在安装chart时,非常的方便,install一下就可以了,但不是每种应用都有,比如自已写的项目,就需要自行制作了

创建chart

使用create关键字,来创建一个chart demo

helm create mychart
cd mychart
[root@k8s-node1 mychart]# tree 
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml
  • 可以看到 有chart.yaml values.yaml 以及templates 模板,主要是在模版里面配置,
  • 这个chart.yaml 是版本说明文件,可以使用helm show 查看
  • 这个values.yaml 是配置文件,可以使用替换相关配置
  • 而templates 目录下,就是k8s中所接角的 deployment,service,sericeacccount,ingress 等配置模板

模版

接下来创建全部的模版,来熟悉模版本的学习

rm -rf templates/*

然后创建一个ConfigMap 类型的资源 配置 configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "Hello World"
cd mychart
helm install full-coral 

创建成功后可以看到相关输出 13.png

查看模版

查看上小节 创建的chart 所加载的模版文件

helm get manifest full-coral

看到有这么一行 # Source: mychart/templates/configmap.yaml

删除刚刚创建的chart

helm uninstall full-coral

模版调用

现在使用 模版调用的方式写配置文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"

可以看到使用2个花括号 {{ }} ,这是helm中的模版命令

我们这次使用 debug模式,并用只渲染不安装模版本的方式,看看输出

helm install --debug --dry-run goodly-guppy ./mychart

可以看到将chart 名称goodly-guppy 直接放到模版里面了,configmap 也叫goodly-guppy-configmap了

内置对象

上一小节中出现了Release,这是helm的内置对象,就是可以在模版访问的高级对象之一 内置对象还有如下

  • Release: 该对象描述了版本发布本身。包含了以下对象:

    • Release.Name: release名称
    • Release.Namespace: 版本中包含的命名空间(如果manifest没有覆盖的话)
    • Release.IsUpgrade: 如果当前操作是升级或回滚的话,需要将该值设置为true
    • Release.IsInstall: 如果当前操作是安装的话,需要将该值设置为true
    • Release.Revision: 此次修订的版本号。安装时是1,每次升级或回滚都会自增
    • Release.Service: 该service用来渲染当前模板。Helm里一般是Helm
  • Values: Values是从values.yaml文件和用户提供的文件传进模板的。Values默认为空

  • Chart: Chart.yaml文件内容。 Chart.yaml里的任意数据在这里都可以可访问的。比如 {{ .Chart.Name }}-{{ .Chart.Version }} 会打印出 mychart-0.1.0

  • Files: 在chart中提供访问所有的非特殊文件。当你不能使用它访问模板时,你可以访问其他文件。 请查看这个 文件访问部分了解更多信息

    • Files.Get 通过文件名获取文件的方法。 (.Files.Getconfig.ini
    • Files.GetBytes 用字节数组代替字符串获取文件内容的方法。 对图片之类的文件很有用
    • Files.Glob 用给定的shell glob模式匹配文件名返回文件列表的方法
    • Files.Lines 逐行读取文件内容的方法。迭代文件中每一行时很有用
    • Files.AsSecrets 使用Base 64编码字符串返回文件体的方法
    • Files.AsConfig 使用YAML格式返回文件体的方法
  • Capabilities: 提供关于Kubernetes集群支持功能的信息

    • Capabilities.APIVersions 是一个版本集合
    • Capabilities.APIVersions.Has $version 说明集群中的版本 (e.g., batch/v1) 或是资源 (e.g., apps/v1/Deployment) 是否可用
    • Capabilities.KubeVersion 和 Capabilities.KubeVersion.Version 是Kubernetes的版本号
    • Capabilities.KubeVersion.Major Kubernetes的主版本
    • Capabilities.KubeVersion.Minor Kubernetes的次版本

emplate: 包含了已经被执行的当前模板信息

  • Template.Name: 当前模板的命名空间文件路径 (e.g. mychart/templates/mytemplate.yaml)
  • Template.BasePath: 当前chart模板目录的路径 (e.g. mychart/templates)

Values对象

在目录有一个values.yaml配置文件,可以使用values对象来传递值

将上一章的 Chart更新部分,,使用 -f values.yaml 或 使用 --set 等就是使用了values对象

模板函数和流水线

我们在 values.yaml 文件中加入 以下数据

favorite:
  drink: coffee
  food: pizza

然后在 更改configmap.yaml 配置 其中quote和upper就是一个函数,helm 有超过60个可用函数,一个个记下来肯定不现实,需要什么功能去查就可以了 helm.sh/zh/docs/cha… 多个函数可以使用|管理符进行连接

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ quote .Values.favorite.drink }}
  food: {{ .Values.favorite.food | upper | quote }}

流程控制

Helm的模板语言提供了以下控制结构:

  • if/else, 用来创建条件语句
  • with, 用来指定范围
  • range, 提供"for each"类型的循环

例子如下

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  #if
  drink: {{ .Values.favorite.drink | default "tea" | quote }}
  food: {{ .Values.favorite.food | upper | quote }}
  {{ if eq .Values.favorite.drink "coffee" }}mug: "true"{{ end }}

  #with
 {{- with .Values.favorite }}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  {{- end }}
  
  #range
{{- with .Values.favorite }}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  {{- end }}
  toppings: |-
    {{- range .Values.pizzaToppings }}
    - {{ . | title | quote }}
    {{- end }}    

和平时写代码差不多,if判断,range遍历,wich取值

templates目录

在templates目录中, 以tpl为后缀的是帮助文件,notes.txt为说明文件 其它yaml文件基本上kubernetes资源定义的清单 命名以下划线(_)开始的文件,不会被渲染

命名模版

这个分类中大部分内容用不到,我们常用的也只有include 方法 字面意思就是包括,实际使用中上 将部分内容直接插 include当前置

配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  labels:
{{ include "mychart.app" . | indent 4 }}
data:
  myvalue: "Hello World"
  {{- range $key, $val := .Values.favorite }}
  {{ $key }}: {{ $val | quote }}
  {{- end }}
{{ include "mychart.app" . | indent 2 }}

结果

使用 helm install --dry-run --debug . 跑一下看看输出结果

# Source: mychart/templates/configmap.yaml
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: edgy-mole-configmap
  labels:
    app_name: mychart
    app_version: "0.1.0+1478129987"
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "pizza"
  app_name: mychart
  app_version: "0.1.0+1478129987"

调试模版

  • helm lint 是验证chart是否遵循最佳实践的首选工具
  • helm install --dry-run --debug 或 helm template --debug:debug模式调试模版,且不会实际执行相关动作
  • helm get manifest: 这是查看安装在服务器上的模板内容

总结

helm 的模版学习之前 一定要掌握kubernetes 资源的定义,也就是会写k8s yaml,否则看不懂 helm 模版的内容

正所谓实践出真知,一边看文档的同时,多实际操作,有助于理解