最近个人学习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

帮助信息,在安装时可以提醒用户如何操作,随便写写就好,要让用户明白即可。

 

第一次写,希望各位有所收货

 

原文地址:http://www.cnblogs.com/flyskyzero/p/16872601.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性