这是我参与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
创建成功后可以看到相关输出
查看模版
查看上小节 创建的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 模版的内容
正所谓实践出真知,一边看文档的同时,多实际操作,有助于理解