最近个人学习Helm,感觉Helm的功能很强大!分享一些干货给大家吧,希望有所帮助!
基本概念
Chart
一个Helm包,包含在K8S集群内,运行一个应用,工具或者服务所需要的所有的资源定义[注意不包含镜像只是定义],类似于一个RPM包
Repository
Charts在这里被汇集并共享,它有点像Fedora Package Database,但是是用于kubernetes packages
Release
一个Release相当于一个Chart运行在K8S集群中的一个实例,一个Chart可以在相同集群中安装多次,每次安装,一个Release就被创建,例如MySQL chart,如果你想让两个数据库运行在你的集群,你可以安装相同的Chart多次,每一次一个release,它拥有自己的Release名字。
部署
可以参考如下的网站进行安装
https://helm.sh/doc/intro/install/
https://kubeapps.com/doc/getting-started/
Helm Search
概念
本质上就是Helm的公有仓库,你可以登录注册将自己的Helm包上传到那上面,也可以在那里搜索喜欢的包然后下载使用吧
官网地址
https://artifacthub.io
Helm基础命令
基础命令篇
添加公有Repo
helm repo add https://charts.bitnami.com/bitnami
添加私有Repo
helm repo add --username=no-user --password admin@123 https://github.bithaha.com/helm
列出Repo
helm repo list
列出已经安装的charts
helm list
- 注意 默认是查看default命名空间下
- 若要切换,-n namespace即可,如:
helm list -n abc
搜索Repo
helm search repo nginx
安装helm包
helm install bitnami-nginx bitnami/nginx
- 注意 默认是安装到default命名空间下
- 若指定命名空间,请务必确保命名空间存在的情况之下再指定 :
helm install bitnami-nginx bitnami/nginx -n abc
安装指定版本的helm包
helm install bithaha bithaha/test-helm --version 0.1.0
卸载一个charts包
helm uninstall bitnami-nginx
helm设置参数
设置参数
helm install bithaha bithaha/test-helm --version 0.1.0 --set replicaCount=2,image.tag=1.21
这段意思大概是安装一个test-helm,版本是0.1.0,设置副本数量为2,images的版本是1.21
查看参数
helm get values test-helm
重置一下value
helm upgrade bithaha bithaha/test-helm --reset-values
按照特定文件更新下helm中的数值
helm upgrade -f values.yaml bithaha bithaha/test-helm
显示所有的values
helm get values -a bithaha
helm创建自己的charts
创建chart
helm create qqq-helm
检查chart
helm lint qqq-helm
添加lcon
vim qqq-helm/chart.yaml
description下面加入:
icon: 图片地址
打包chart
helm package qqq-helm
Helm模板
官方文档
https://helm.sh/docs/chart_temlpate_guide/getting_started/
chart默认结构
tree qqai-helm qqai-helm | >charts (目录:用于子Charts,默认没有任何文件) >chart.yaml(对chart的基本描述文件) >templates (模板文件) ——》 deployment.yaml ——》 _helpers.tpl ——》 hpa.yaml ——》 ingress.yaml ——》 NOTES.txt ——》 serviceaccount.yaml ——》 service.yaml ——》 tests(自动测试) >test-connection.yaml >values.yaml(默认配置文件)
chart.yaml格式解释
apiVersion: v2 name: qqai-helm description: A Powerful Tools Over World icon: baidu.png XXXXXXXXXX XXXXXXXXXX type: application xxxxxxxxxx version: 0.1.0 xxxxxxxxxx apiVersion: "1.16.0"
templates目录
# 目录结构 >templates (模板文件) ——》 deployment.yaml ——》 _helpers.tpl ——》 hpa.yaml ——》 ingress.yaml ——》 NOTES.txt ——》 serviceaccount.yaml ——》 service.yaml ——》 tests(自动测试) >test-connection.yaml * _helpers.tpl: 模板帮助,可以在整个Chart里重复使用 * NOTES.txt: 帮助文档,可以提示用户如何使用啊,入门啊等等 * tests目录:可以实现类似自动化测试的玩意 * 其他的yaml文件就是我们熟悉的啦,这个就不解释了昂
templates实战
1、在templates目录中创建一个configmap的YAML文件
cat >/root/qqai-helm/templates/configmap.yaml <<EOF apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "fook" EOF
英文句号代表顶级的意思,然后隔一个句号是作为分隔符来使用。
Release则是内置的对象。
这样写法类似Ansible但并不是在使用Ansible而是使用的K8s平台,千万不要和Ansible混为一谈!
2、测试模板可用性
helm install --debug --dry-run qqai-helm-demo ./qqai-helm
常用的对象说明
Release--顶级的对象
Release.Name: Install的时候的名称
Release.Namespace: 命名空间,这个没啥好解释的,默认值是default
Release.IsUpgrade:是升级,如果true那就升级了。
Release.IsInstall: 是安装,如果true那就是安装了。
Release.Revision:历史版本
Release.Service:没有其他的,就是
Values,Chart--普通的对象
Values: 来自于values.yaml中定义的参数,默认的Value是空值的
Chart: 来自于Chart.yaml中定义的参数,可以根据需要灵活搭配
比如 {{ .chart.Name }}-{{ .chart.Version }}==mychat-0.1.0
Values文件
Values来自于多个源,下面是覆盖顺序,最后的优先
- Chart中的values.yaml文件
- 子Chart中的values.yaml文件
- 可以用 -f 指定一个yaml文件去引用里面的值
- 可以用--set来直接定义一个value
Values实战
cat /root/qqai-helm/values.yaml <<EOF banben: v1 shuiguo: apple mingzi: name: zhangsan EOF cat /root/qqai-helm/configmap.yaml <<EOF apiVersion: {{ .Values.banben}} kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" name: {{ .Values.mingzi.name }} fruit: {{ .Values.shuiguo }} EOF
验证一下吧
helm install --debug --dry-run qqai-helm-demo ./qqai-helm
模板函数与管道符
引用上述的案例吧
cat /root/qqai-helm/values.yaml <<EOF banben: v1 shuiguo: apple mingzi: name: zhangsan EOF cat /root/qqai-helm/configmap.yaml <<EOF apiVersion: {{ .Values.banben}} kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" name: {{ .Values.mingzi.name }} fruit: {{ .Values.shuiguo }} EOF
Helm支持在模板中增加函数使能更多样化的用法,可以参考官方文档去定义你自己喜欢的样式以及功能吧!
https://helm.sh/docs/chart_template_guide/fuction_list/
若将上述案例添加相关的函数,可以像下面这样的做法
cat /root/qqai-helm/values.yaml <<EOF banben: v1 shuiguo: apple mingzi: name: zhangsan EOF cat /root/qqai-helm/configmap.yaml <<EOF apiVersion: {{ .Values.banben}} kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" name: {{ .Values.mingzi.name |repeat 5 }} age: {{ .Values.mingzi.age |default "18" }} fruit: {{ .Values.shuiguo | upper | quote}} EOF
其中,upper是大写的意思,quote是双引号的意思,repeat xxx是重复了多少次,default "xxx" 是 默认值为"xxxx",如果模板中已经定义了,那么就按照模板中的来,否则按照定义的默认值来走。
流程控制概述
可以通过流程控制来控制helm的逻辑流程,保证部署的正确性。
流程控制-if/else: 如果或者
基本格式
{{ if PIPELINE }} # Do something {{ else if OTHER PIPELINE }} # Do something {{ else }} # Default case {{ end }}
成为false的条件
- 布尔值为假
- 数字为0
- 字符串的空
- ......
范例
还是请我们老演员登场
cat /root/qqai-helm/values.yaml <<EOF banben: v1 shuiguo: apple mingzi: name: zhangsan # age: 30 EOF cat /root/qqai-helm/configmap.yaml <<EOF apiVersion: {{ .Values.banben}} kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" name: {{ .Values.mingzi.name |repeat 5 }} age: {{ .Values.mingzi.age |default "18" }} fruit: {{ .Values.shuiguo | upper | quote}} {{ if eq .Values.mingzi.age "30" }}mug: "true"{{ end }} EOF
感觉还是很乱写的,必须要调优
cat /root/qqai-helm/configmap.yaml <<EOF apiVersion: {{ .Values.banben}} kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" name: {{ .Values.mingzi.name |repeat 5 }} age: {{ .Values.mingzi.age |default "18" }} fruit: {{ .Values.shuiguo | upper | quote}} {{- if eq .Values.mingzi.age "30" }} mug: "true" {{- end }} EOF
然后你会发现配置文件输出的是相当的美了,哈哈,成就感满满
流程控制-with: 指定一个范围
这里需要一个范例来解释下with的具体含义
cat /root/qqai-helm/values.yaml <<EOF mingzi: name: zhangsan age: ten EOF cat /root/qqai-helm/configmap.yaml <<EOF apiVersion: {{ .Values.banben}} kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" {{- with .Values.mingzi }} name: {{ .name|default "lisi"|quote }} age: {{ .age |upper|quote }} {{- end }} EOF
其中 "{{- with .Values.mingzi }}"是在下面数值引用的时候方便,不用刻意的加大量前缀例如:"name: {{ .Values.mingzi.name|default "lisi"|quote }}",加入with这个定义,大大提升了可读性并且保证了helm模板文件编写的整洁型。
当然这个with只能调用普通的对象中的项目名,不能也将顶级的对象直接加入进去,因为一个with针对的是一个前缀而不是全局的前缀,这点一定切记昂!
就是说,只能引入一个前缀中所有的变量啊,但是要引用其他的需要结束当前的引用动作然后写入新的动作就可以了,这个明白否?
案例
# 以下为错误示范 cat /root/qqai-helm/configmap.yaml <<EOF apiVersion: {{ .Values.banben}} kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" {{- with .Values.mingzi }} name: {{ .name|default "lisi"|quote }} age: {{ .age |upper|quote }} release: {{ .Release.Name }} {{- end }} EOF # 以下为正确示范 cat /root/qqai-helm/configmap.yaml <<EOF apiVersion: {{ .Values.banben}} kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" {{- with .Values.mingzi }} name: {{ .name|default "lisi"|quote }} age: {{ .age |upper|quote }} {{- end }} release: {{ .Release.Name }} EOF cat /root/qqai-helm/configmap.yaml <<EOF apiVersion: {{ .Values.banben}} kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" {{- with .Values.mingzi }} name: {{ .name|default "lisi"|quote }} age: {{ .age |upper|quote }} # 利用 “$” 来恢复父系的前缀 release: {{ $.Release.Name }} {{- end }} EOF PS:以上两种解决方案都是可行的
流程控制-range: For循环
下面演示range如何循环起来
Values.yaml
cat /root/qqai-helm/values.yaml <<EOF mingzi: name: zhangsan age: ten job: - sales - engineer - guestserver EOF
configmap.yaml
cat /root/qqai-helm/configmap.yaml <<EOF apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }} data: config: prometheus {{- with .Values.mingzi }} name: {{ mingzi|upper }} {{- end}} group: |- {{- range .Values.job }} - {{ .|title|quote }} {{- end}} EOF cat /root/qqai-helm/configmap1.yaml <<EOF apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }} data: config: prometheus {{- with .Values.mingzi }} name: {{ mingzi|upper }} {{- end}} group: |- {{- range $index, $abc :=.Values.job }} - {{ $index }}: {{ $abc }} {{- end}} EOF
Helm之变量--Variables
下面一个示范教你如何来定义变量
# 普通的定义 cat /root/qqai-helm/configmap.yaml <<EOF apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: config: "hello world" {{- $relname :=.Release.Name -}} {{- with .Values.favorite }} drink: {{ .drink|default "coka" |quote }} release: {{ $relname }} {{- end}} # 比较高级一点的定义 cat /root/qqai-helm/configmap.yaml <<EOF apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }} data: config: prometheus {{- with .Values.mingzi }} name: {{ mingzi|upper }} {{- end}} group: |- {{- range $index, $abc :=.Values.job }} # 这里是循环后,将变量abc再套了个双引号函数,$index是索引的意思 - {{ $index }}: {{ $abc|quote }} {{- end}} EOF
Templates
下面案例可以告诉你怎么定义这个模板
# 定义一个模板 {{- define "qqai-helm.labels" }} labels: generator: helm date: {{ now | htmlDate }} {{- end }} apiVersion: v1 kind: ConfigMap metadata: name:{{ .Release.Name }}-configmap # 此处引用模板 {{- template "qqai-helm-labels" }} data: myvalue: "hello world" ps: 也可以将这些模板配置放到_helpers.tpl 或者template.tpl 然后可以被资源类yaml进行调用哦 一定注意格式,一定注意格式,一定注意格式
NOTES.txt
帮助信息,在安装时可以提醒用户如何操作,随便写写就好,要让用户明白即可。
第一次写,希望各位有所收货
标签:qqai,yaml,--,chart,helm,干货,values,Helm,围观 From: https://www.cnblogs.com/flyskyzero/p/16872601.html