helm介绍、组件、安装、和目录结构
为什么需要helm
随着应用增多,需要维护大量的yaml文件,不能根据一套yaml文件来创建多个环境,需要手动修改.
什么是helm和相关组件
-
概念
helm是k8s的包管理工具,主要用来管理helm中的各种chart包,可以方便的发现、共享和构建k8s应用。相当于centos中的yum工具,可以将服务相关的所有资源信息整合到一个chart包中,并且可以使用一套资源发布到多个环境中可以将应用程序的所有资源和部署信息组合到单个部署包中.
-
组件
Chart: 一个整合后的chart包,包含一个应用所有的k8s声明模板,类似于yum的rpm包 详细理解Chart: helm将打包的应用程序部署到k8s,并将他们构建成Chart,这些chart将所有与配置的应用程序资源以及所有版本都包含在一个易于管理的包中 helm把k8s资源打包到一个chart中,chart被保存到chart仓库,通过chart仓库可用来存储和分享chart helm客户端: helm客户端组件,负责和k8s-apiserver通信 Repository: 用于发布和存储chart包的仓库,类似于yum仓库和docker仓库 Release: 用chart包部署的一个实例,通过chart在k8s中部署的应用都会产生一个唯一的Release,同一chart多次部署就会产生多个Release. 详细理解Release: 将这些yaml部署完成后,会记录部署时的一个版本,维护了一个release版本,通过这个实例,可以创建pod等资源。
v2 和 v3 版本区别

1、helm3移除了Tiller组件直接使用kubeconfig文件与k8s通信,而helm2中helm客户端是通过Tiller组件和k8s通信的
2、删除release命令变更 helm delete release-name --purge ---->> helm uninstall release-name (helm3)
3、查看charts命令变更 helm inspect release-name ---->> helm show release-name (helm3)
4、拉取chart包命令变更 helm fecth chart-name ---->> helm pull chart-name (helm3)
5、helm3中必须指定release名称,如果需要生成一个随机名称,需要添加--generate-name选项, helm2中如果不指定release名称,可以自动生成一个随机名称 helm install ./mychart --generate-name
helm3的安装和chart的目录结构
helm版本与对应的k8s版本
Helm 版本 支持的 Kubernetes 版本
3.8.x 1.23.x - 1.20.x
3.7.x 1.22.x - 1.19.x
3.6.x 1.21.x - 1.18.x
3.5.x 1.20.x - 1.17.x
3.4.x 1.19.x - 1.16.x
3.3.x 1.18.x - 1.15.x
3.2.x 1.18.x - 1.15.x
helm3二进制安装
步骤:
a) wget https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz #下载helm包
b) tar xf helm-v3.5.2-linux-amd64.tar.gz && mv linux-amd64/helm /usr/local/bin/
c) helm version #检查是否安装成功
创建一个Chart包
步骤:
a) helm create mychart #创建一个chart,指定chart名: mychart
b) chart的目录结构
[root@public867 ~]# tree mychart/
mychart/ #chart包名称
├── charts #存放子chart的目录,目录里存放这个chart依赖的所有子chart
├── Chart.yaml #保存chart的基本信息,包括名字、描述信息等,这个变量文件可以被templates目录下的文件所引用
├── templates #模板文件目录,目录里面存放所有yaml模板文件,包含了所有部署应用的yaml文件
│ ├── deployment.yaml #创建deployment对象的模板文件
│ ├── _helpers.tpl #防止模板助手的文件,可以在整个chart中重复使用
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt #存放提示信息的文件,a介绍chart帮助信息,helm install部署后展示给观众,如何使用chart等
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests #用于测试的文件,测试完部署chart
│ └── test-connection.yaml
└── values.yaml #用于渲染模板的文件(变量文件,定义变量的值) 定义templates目录下的yaml文件可能引用到的变量
#values.yaml用于存储templates目录中模板文件中用到变量的值。
3、Chart.yaml字段说明
apiVersion: v2 #chart版本号
name: mychart #chart名
description: A Helm chart for Kubernetes #对项目的描述信息
type: application # #chart类型(可选) 有两种选择,默认为application,另一种是library
version: 0.1.0 #chart包的版本(必须)
appVersion: "1.16.0" #apiversion版本
编写一个chart和helm内置对象详解
helm3创建编写一个chart(不引用变量)
1、创建chart
helm create mychart
2、删除掉创建的myachrt中templates目录下的模板,自己新创建一个文件
rm -rf mychart/templates/*
vim mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-test-configmap
data:
myvalue: "hello-world"
3、创建一个release实例
helm install mytestconfigmap ./mychart/
4、列出创建的release实例
helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mytestconfigmap default 1 2023-05-02 deployed mychart-0.1.0 1.16.0
5、查看创建后的相关信息和验证k8s是否已经创建了该configmap
helm get manifest mytestconfigmap
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-test-configmap
data:
myvalue: "hello-world"
kubectl get cm
NAME DATA AGE
mychart-test-configmap 1 14m
helm3创建编写一个简单的chart(引用变量)
1、vim configmap-variable.yaml #在templates目录下创建该文件
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap #最前面的,从作用域最顶层命名空间开始,即:在顶层命名空间中开始查找Release对象,在查找Name对象 实际就是通过内置对象获取内置对象的变量值(release的名称)作为拼接成configmap的名字
data:
myvalue: {{ .Values.MY_VALUE }} #调用values.yaml文件中定义的变量MY_VALUE获取变量值
2、在mychart/values.yaml文件中定义MY_VALUE变量
vim values.yaml
MY_VALUE: "HELLO WORLD"
3、创建一个实例
helm install myvariablecfg ../mychart/
4、查看release实例
helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myvariablecfg default 1 2023-05-02 deployed mychart-0.1.0 1.16.0
5、通过k8s查看是否已经创建
kubectl get configmap
myvariablecfg-configmap 1 20s #其中name这一个字段就是在myvariable.yaml文件中进行拼接后产生的名字
- 总结:
通过使用变量的方法,后期更改方便,只需要更改变量文件即可
helm测试渲染命令
1、helm提供了一个用来渲染模板的命令,该命令可以将模板内容渲染出来,但是不会进行任何安装的操作,可以用该命令来测试模板渲染的内容是否正确,相当于一个测试命令
命令:
helm install release实例名称 chart目录 --debug --dry-run
helm3的内置对象详解
常用的内置对象
Release对象
Values对象
Chart对象
Capabilities对象
Template对象
内置对象详解
1、Release对象详解 描述了版本发布自身的一些信息
对象名称 描述
.Release.Name release的名称
.Release.Namespace release的命名空间
.Release.IsUpgrade 如果当前操作是升级或回滚的话,该值为true
.Release.IsInstall 如果当前操作是安装的话,该值为true
.Release.Revision 获取此次修订的版本号,初次安装为1,每次升级或回滚会自增
.Release.Service 获取渲染当前模板的服务名称,一般都是Helm
2、Values对象详解 描述的是value.yaml文件中的内容,默认为空.使用value对象可以获取到该文件中已定义的任何变量数值
value键值对 获取方法
name1:test1 .Values.name1
info:
name2:test2 .Values.info.name2
3、Chart对象 用于获取Chart.yaml文件中内容
对象名称 描述
.Chart.Name 获取chart内容
.Chart.Version 获取chart版本
4、capabilities对象 提供了关于k8s集群的信息
对象名称 描述
.Capabilities.APIVersion 返回k8s集群 API版本信息集合
.Capabilities.APIVersion.Has $version 用于检测指定的版本或资源在k8s集群中是否可用
.Capabilities.KubeVersion 获取k8s的版本号
.Capabilities.KubeVersion.Version 获取k8s的版本号
.Capabilities.KubeVersion.Major 获取k8s主版本号
.Capabilities.KubeVersion.Minor 获取k8s小版本号
5、Template对象 获取当前模板的信息
对象名称 描述
.Template.Name 用于获取当前模板的名称和路径 (例如: mychart/templates/mycfg.yaml)
.Template.BasePath 用于获取当前模板的路径 (例如: mychart/templates)
helm3常用命令和部署应用实战案例
helm3常用命令
1、helm version 查看helm客户端版本
2、helm repo add 仓库别名 仓库地址 添加chart仓库
3、helm repo index 仓库别名 仓库地址 索引chart仓库
4、helm repo list 仓库别名 仓库地址 列出chart仓库
5、helm repo remove 仓库别名 仓库地址 移除chart仓库
6、helm repo update 仓库别名 仓库地址 更新chart仓库
7、helm search repo/hub xx 根据关键字搜索chart包
8、helm show all/chart/readme/values chart包名 查看chart包的基本信息和详细信息
9、helm pull test-repo/tomcat --version 0.4.3 -untar 从远程仓库中下载拉取chart包并解压到本地。--untar是解压,如果不添加则为不解压chart包
10、helm create chart包名 创建chart包
11、helm install 实例名 chart包名 安装一个relase实例
12、helm install --values templates/my-values.yaml <release-name> <chart-name> 指定要执行的特定 YAML 文件
13、helm list 列出实例名
14、helm upgrade <release-name> <chart-name> 更新实例
helm upgrade <release-name> <chart-name> -f path文件路径 更新实例
15、helm rollback <release-name> 版本号 回滚到指定版本
16、helm uninstall <release-name> 卸载实例
17、helm history <release-name> 获取release实例历史
18、helm package chart路径 将chart目录打包成chart存档文件中,即打成tgz的压缩包
19、helm get manifest <release-name> 获取指定 release 的 K8s 渲染的 YAML 文件
20、helm get all <release-name> 查看实例所有信息
21、helm get notes <release-name> 获取 release 的备注信息
22、helm get values <release-name> 获取指定 release 的配置值信息
23、helm get hooks <release-name> 获取指定 release 中所有的钩子(hooks)
24、helm status <release-name> 显示该实例的状态,显示已命名版本的状态
27、helm upgrade <release-name> chart名 --set imageTag=1.19 指定实例和chart名进行相关set设置的升级
28、helm upgrade <release-name> chart名 -f ../mychart/values.yaml 指定实例和chart名和values.yaml升级
helm3部署应用的实战案例(发布、升级、回滚、卸载)
1、创建chart
helm create nginx-chart
2、清空默认的templates的内容,自己创建模板文件
vim nginx-chart/templates/nginx-deploy-svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.Name }}
namespace: {{ .Values.Namespace }}
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
app: {{ .Values.pod_label }}
template:
metadata:
labels:
app: {{ .Values.pod_label }}
spec:
containers:
- image: {{ .Values.image }}:{{ .Values.imageTag }}
name: {{ .Values.container_name }}
ports:
- containerPort: {{ .Values.containerport }}
---
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.Name }}
namespace: {{ .Values.Namespace }}
spec:
type: NodePort
ports:
- port: {{ .Values.port }}
targetPort: {{ .Values.targetport }}
nodePort: {{ .Values.nodeport }}
protocol: TCP
selector:
app: {{ .Values.pod_label }}
3、在nginx-chart/values.yaml文件中添加上述文件中变量对应的变量值
deployment_name: nginx-deployment
replicas: 2
pod_label: nginx-pod-label
image: nginx
imageTag: "1.19"
container_name: nginx-container
service_name: nginx-service
Namespace: cityos
port: 80
targetport: 80
containerport: 80
nodeport: 8080
Name: nginx
4、发布这个实例
helm install nginx-1.19 nginx-chart
5、验证
helm list kubectl get pod,svc -n cityos
6、更新helm 修改values.yaml文件中的镜像版本至1.20
helm upgrade nginx-1.19 nginx-chart -f /export/nginx-chart/values.yaml
helm upgrade nginx-1.19 nginx-chart --set imageTag=1.20
7、再次验证成功
8、回滚至1.19版本
helm rollback nginx-1.19 不添加版本号就回滚到上一个版本
9、验证成功
10、卸载chart
helm unisntall nginx-1.19
helm3内置函数详解
helm3的内置函数
0、函数的使用格式
格式1: 函数名 arg1 arg2...
格式2: arg1 | 函数名 更偏向使用这种格式
1、quote或squote函数
quote: 调用的变量值添加一个双引号
squote: 调用的变量值添加一个单引号
示例:
templates/quotefunc.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-quote
namespace: {{ .Release.Namespace }}
data: #value{1,2}格式1写法 value{3,4}格式2写法
value1: {{ quote .Values.name }} #调用的变量值添加一个双引号
value2: {{ squote .Values.name }} #调用的变量值添加一个单引号
value3: {{ .Values.name | quote }}
value4: {{ .Values.name | squote }}
values.yaml
name: test
只进行渲染不进行实际执行 看一下结果
helm install quotefunc chartfunc --debug --dry-run
部分结果如下:
Source: chartfunc/templates/quotefunc.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: quotefunc-quote
namespace: default
data:
value1: "test" #调用的变量值添加一个双引号
value2: 'test' #调用的变量值添加一个单引号
2、upper和lower函数
upper: 将字符串转换成大写
lower: 将字符串转换成小写
示例:
templates/upperlowerfunc.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
namespace: {{ .Release.Namespace }}
data: #value{1,2}格式1写法 value{3,4}格式2写法
value3: {{ .Values.name | quote | upper }} #转成大写并添加双引号
value4: {{ .Values.name | squote | lower }} #转成小写并添加单引号
values.yaml
name: test
只进行渲染不进行实际执行 看一下结果
helm install upperlowerfunc chartfunc --debug --dry-run
部分结果如下:
Source: chartfunc/templates/upperlowerfunc.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: upperlowerfunc
namespace: default
data:
value1: "TEST" #调用的变量值添加一个双引号
value2: 'test' #调用的变量值添加一个单引号
3、repeat函数
repeat: 将指定字符串重复输出指定的次数,repeat函数可以带有一个参数,用于设置重复多少次
示例:
templates/repeatfunc.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
namespace: {{ .Release.Namespace }}
data:
value1: {{ .Values.name | repeat 2 | quote }} #重复输出2次并将结果添加双引号并转换成大写
values.yaml
name: test
输出结果
# Source: chartfunc/templates/repeatfunc.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: repeatfunc
namespace: default
data:
value1: "testtest" #重复输出2次并将结果添加双引号并转换成大写
4、default函数
default: 使用default函数指定一个默认值,当引入的值不存在时,可以使用这个默认值
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
namespace: {{ .Release.Namespace }}
data:
value1: {{ .Values.location | default "BEIJING" | quote }} #调用变量值,引用的变量location不存在时使用定义的默认值且添加一个双引号
values.yaml中未定义location这个变量
执行结果:
# Source: chartfunc/templates/defaultfunc.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: repeatfunc
namespace: default
data:
value1: "BEIJING" #调用变量值,引用的变量location不存在时使用定义的默认值且添加一个双引号
5、lookup函数
lookup: 用于在当前k8s集群中获取一些资源的信息,类似于kubectl get ...
格式: lookup "apiVersion" "kind" "namespace" "name"
常用格式和kubectl命令相互对应关系:
kubectl命令 lookup函数
kubectl get pod -n cityos lookup "v1" "Pod" "cityos"
kubectl get ns lookup "v1" "Namespace" "" ""
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
namespace: {{ .Release.Namespace }}
data:
value1: {{ lookup "v1" "Namespace" "" "" | quote }}
查看执行结果
helm get manifest lookfunc
value1: "map[apiVersion:v1 items:[map[apiVersion:v1 kind:Namespace metadata:map[creationTimestamp:2022-10-31T10:07:51Z managedFields:[map[apiVersion:v1 fieldsType:FieldsV1 fieldsV1:map[f:status:map[f:phase:map[]]] manager:kubectl operation:Update time:2022-10-31T10:07:51Z]] name:cityos resourceVersion:1199866 selfLink:/api/v1/namespaces/cityos uid:a492f100-c025-48a1-89b"
helm3的逻辑和流程控制函数
eq: 参数是否相等 等于为true 反之为false
{{ eq 参数1 参数2 }}
ne: 参数是否不相等 不等于为true 反之为false
{{ ne 参数1 参数2 }}
lt: 第一个参数是否小于第二个参数 小于为true 反之false
{{ lt 参数1 参数2 }}
le: 第一个参数是否小于等于第二个参数 小于等于为true 反之false
{{ 1e 参数1 参数2 }}
gt: 第一个是否大于第二个参数 大于为true 反之false
{{ gt 参数1 参数2 }}
ge: 第一个参数是否大于等于第二个参数 大于等于为true 反之false
{{ ge 参数1 参数2 }}
and: 返回两个参数的逻辑与结果(布尔值) 两参数为真 结果为true 反之为false
{{ and .Values.name1 .Values.name2 | quote }}
or: 判断两个参数的逻辑或结果 其中有一个参数为真,结果为true 反之为false
{{ or .Values.name1 .Values.name2 | quote }}
not: 对参数的布尔值取反,如果参数是正常参数(非空),正常为true 反之是false
{{ not .Values.name1 | quote }}
default: 设置一个默认值 在参数的值为空的情况下,则使用默认值
{{ .Values.location | default "BEIJING" | quote }}
empty: 用于判断给定的值是否为空,如果为空返回为true,反之是false
{{ 值 | empty }}
coalesce: 用于扫描一个给定的列表,并返回第一个非空的值
{{ coalesce 0 1 2 }}
ternary: 接收两个参数和一个test值,如果test的布尔值为true,则返回第一个参数的值,反之则返回第二个参数的值
{{ ternary 参数1 参数2 true }}
helm3的字符串函数
1、trim、trimAll、trimPrefix、trimSuffix函数
含义:
trim: 用来去除字符串两边的空格,示例: trim " hello "
trimAll: 移除字符串中指定的字符 示例: trimAll "$" "$5.00"
trimPrefix和trimSuffix: 移除字符串中指定的前缀和后缀 示例: trimPrefix "-" "-hello"
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
namespace: {{ .Release.Namespace }}
data:
data1: {{ trim " test " }}
data2: {{ trimAll "%" "%test" }}
data3: {{ trimPrefix "-" "-test" }}
data4: {{ trimSuffix "+" "test+" }}
2、lower、upper、title、untitle函数
含义:
lower: 将所有字母转换成小写
upper: 将所有字母转换成大写
title: 将首字母转换成大写
untitle: 将大写的首字母转换成小写
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
namespace: {{ .Release.Namespace }}
data:
value3: {{ lower "HELLO" }}
value4: {{ upper "hello" }}
value5: {{ title "hello" }}
value6: {{ untitle "Hello" }}
3、snakecase、camelcase、kebabcase函数
含义:
snakecase: 将驼峰写法转换为下划线命名写法
camelcase: 将下划线命名写法转换为驼峰写法
kebabcase: 将驼峰写法转换为中横线写法
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: trimcfg-test
namespace: default
data:
data1: user_name
data2: UserName
data3: user-name
4、substr函数 切割字符串(指定切割起、始位置),并返回切割后的字串
三个参数:
start(int): 起始位置
end: 结束位置
string: 需要切割的字符串
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: trimcfg-test
namespace: default
data:
data3: {{ substr 3 5 "message" }} #sa
5、trunc函数 截断字符串 使用正整数或负整数来分别表示从左向右截取的个数和从右向左截取的个数
示例:
trunc 5 "Hello test" #Hello
trunc -5 "Hello world" #world
6、abbrev函数 使用省略号(...)切割字符串,保留指定长度。其中省略号也是计算在长度之内的
示例:
abbrev 5 "Hello world" #"He..."
7、randAlphaNum、randAlpha、randNumeric、randAscii 用于生成加密的随机字符串,指定生成的字符串长度
含义:
randAlphaNum: 使用0-9a-zA-Z生成随机字符串
randAlpha: 使用a-zA-Z生成随机字符串
randNumeric: 使用0-9 生成随机字符串
randAscii: 使用所有的可使用的ASCII字符,生成随机字符串
示例:
randAscii 10 生成长度为10的字符串,其余三个也一样的用法
8、hasPrefix、hasSuffix函数 测试一个字符串是否是指定字符串的前后缀的,返回布尔值
示例:
hasPrefix "He" "Hello" #true
hasSuffix "He" "Hello" #false
9、nospace 去除字符串中所有的空格
示例:
nospace " Test"
10、initials 截取指定字符串的每个单词的首字母并拼接在一起
示例:
initials "Peplo Peace" #PP
11、wrapWith函数 在文档指定的列数添加内容 例如添加内容"\t"
示例:
wrapWith 5 "\t" "Helloworld" #Hello world
12、cat函数 用于将多个字符串合并成一个字符串并使用空格分开
示例:
cat "Hello" "test" #"Hello test"
13、replace 用于执行简单的字符串替换 需要传递三个参数
第一个参数: 待替换的字符串
第二个参数: 将要替换的字符串
第三个参数: 源字符串
示例:
"I AM TEST" |replcae "" "-" #"I-AM-TEST"
14、shuffle 对字符串中的字符进行重新排序
示例:
shuffle "Hello" #Helol
15、indent、nindent 用于以指定长度来缩进指定字符串的所在行,其中nindent函数可以在缩进时在字符串开头添加新行
示例:
indent 4 "test"
nindent 5 "test"
区别:
nindent函数可以在缩进时在字符串开头添加新行,也就是在该行字符串上方会添加一行新的空行
16、plural函数 判断字符串的长度,并且根据长度返回不同的值,例如字符串的长度为1会返回plural函数的第一个参数,若不是1,则返回第二个参数
示例:
len "a" |plural "one" "many" #one
len "ab" |plural "one" "many" #many
helm3的类型转换和正则表达式函数
类型转换函数:带*号的表示常用的
(*)atoi函数: 将字符串转换为整型
(*)float64函数: 将字符串转换为flota64类型
(*)int函数: 转换为int类型
(*)toString函数: 转换为字符串
int64函数
toDecimal函数: 将unix八进制转换成int64
toStings: 将列表、切片或数组转换成字符串列表
toJson: 将列表、切片或数组、字典转换成json
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-test
data:
data1: {{ "16" | kindOf }} #转换前查看是啥类型,字符串
data2: {{ atoi "16" | kindOf }} #将字符串类型转换为整型,kindOf函数可以判断传入的这个参数的类型是什么
data3: {{ toString "16" | kindOf }}
正则表达式函数:
regexFind和mustRegexFind函数
regexFindAll和mustRegexFindAll函数
regexMatch和mustRegexMatch函数:
根据指定的正则来匹配字符串,匹配成功返回true
如果表达式有问题,regexMatch会直接抛出错误,mustRegexMatch会向模板引擎返回错误
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-rege
data:
data1: {{ regexMatch "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$" "test@xxx.com" }}
data2: {{ mustRegexMatch "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$" "test@xxx.com" }}
regexReplaceAll和mustRegexReplaceAll函数
regexReplaceAllLiteral和mustRegexReplaceAllLiteral函数
regexSplit和mustRegexSplit函数:
指定一个分隔符,将字符串进行切割,并返回切割后的字符串切片
helm3的加密函数和编码解码函数
加密函数:
sha1sum、sha256sum、adler32sum、htpasswd、encryptAES、decryptAES
编码、解码函数:
Base64、Base32
helm3的日期函数
常用的日期函数:
now函数: 用于返回当前日期时间
date函数: 将日期信息格式化 示例: now | date "2006-01-02"
dataInZone函数: 与date用法一致,但可以指定时区返回时间 示例: dataInZone "2006-01-02"(now)"UTC"
duration函数: 将给定的秒数转换为几分几秒的形式
durationRound函数: 将给定的日期进行取整,保留最大的单位 例如:2h10m,结果就是2h
unixEpoch函数: 返回给定时间的时间戳格式
dataModify、mustDateModify函数:
将一个给定的日志修改一定的时间并返回修改后的时间
区别:
如果修改格式错误,前者会返回日期未定义,后者返回错误
toDate、mustToDate函数:
将指定的字符串转换成日期,第一个参数需要指明要转成的日期格式,第二个参数需要传递转换的字符串
区别:
如果字符串无法转换,前缀返回0值,后者抛出错误
helm3的字典函数
dict字典函数、get、set、unset函数
含义:
dict: 用于存储key/value键值对,key必须是字符串类型,value可以是任意类型
示例:
$myDict=dict "name1" "value1" "name2" "value2"
get: 获取定义字典的值
示例:
get $myDict "name1"
set: 向已有的字典中添加新的键值对,也可以修改原来键值对的值
示例:
set $myDict "name3" "value3"
set $myDict "name2" "newvalue2"
unset: 删除字典中的key
示例:
unset $myDict "name3"
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-dict
data:
{{- $myDict := dict "name1" "value1" "name2" "value2" }}
data1: {{ $myDict }} #map[name1:value1 name2:value2]
data2: {{ get $myDict "name1" }} #value1
data3: {{ set $myDict "name2" "newvalue3" }} #map[name1:value1 name2:newvalue3]
data4: {{ unset $myDict "name1" }} #map[name2:newvalue3]
keys函数
用于获取一个或多个字典中所有的key并返回一个列表.字典是无序的,列表中如果包含多个相同的key,可以使用sortAlha函数对列表进行排序,在使用uniq函数去重
在指定多个字典且字典存在相同key时,这些key都会保存到列表中
helm3的列表函数
1、常用的列表函数及含义
(1)、list函数、first函数、rest函数、last函数、initial函数
含义:
list函数: 用于生成一个列表,传入的参数将会作为列表的值.$myList:=list 1 2 3 "one"
first函数: 用于获取列表的第一项 first $myList
rest函数: 用于获取列表中除第一项以外的所有内容 rest $myList
last函数: 用于获取列表的最后一项 last $myList
initial函数: 用于获取列表中除最后一项以外的内容 与rest恰好相反 initial $myList
(2)、append函数、prepend函数、concat函数、reverse函数、uniq函数
含义:
append函数: 在已有的列表中追加一项,并返回一个新的列表。原列表内容保持不变。$newList=append $列表变量 要追加的内容
prepend函数: 在列表中最前面加入一个新值,并返回一个新的列表,原列表内容不变. $newList=append $列表变量 最前面加的值
concat函数: 用于将任意数量的列表合并成一个新的列表,原列表内容不变。 concat $myList (list 100 101 102) (list a b c)
reverse函数: 用于反转一个列表,并返回一个新的列表 $reverse $myList
uniq函数: 用于去除一个列表中的重复项 并返回一个新的列表。 list 1 1 2 3 2 | uniq
(3)、without函数、has函数、compact函数
含义:
without函数: 用于过滤掉列表中的指定值,并返回包含剩下值的列表。 without (list 1 2 3) 3(过滤掉3)
has函数: 用于判断一个值是否包含在列表中,包含返回true 反之为false has "hello" (list 1 2 3) |quote (判断hello是否在列表中)
compact函数: 用于删除一个列表中的空值,并返回一个新的列表 compact (list 1 2 3 "") |quote (注意:空值包括: 整型 0、字符串 ""、列表 []、字典 {}、布尔 false、以及所有的nil或null)
(4)、slice函数、until函数、utilStep函数、seq函数
含义:
slice函数: 用于对列表进行切片 slice list [n][m] 相当于从索引为n开始切片至索引m(左闭右开区间)
until函数: 用于构建一个指定整数范围内的列表 until 5
untilStep函数: 与until类似,不过可以定义整数的开始和步长 untilStep 3 9 2 输出3-9之间的数字,且步长值为2
seq函数: 用于生成指定范围内的整数。最多可以传递三个参数:
单个参数(结束位置)-会生成所有从1到包含end的整数
多个参数(开始、结束)-会生成所有包含start和end的整数,递增或递减
多个参数(开始、步长、结束)-会生成所有包含start和end 按step递增或递减的整数
示例:
seq 5 --> 1 2 3 4 5
seq -3 -->1 0 -1 -2 -3
seq 0 2 10 --> 0 2 4 6 10
helm3的网络函数、文件路径函数、类型检查函数
网络函数:
getHostByName
含义:
用于接收一个域名并返回该域名解析后的IP地址
示例:
getHostByname "www.baidu.com" |quote
文件路径函数:
base函数
含义:
用于返回指定路径的最后一级目录
示例:
base "/tmp/a/a.txt" #a.txt
dir函数
含义:
用于返回指定路径的上一级路径
示例:
dir "/tmp/a/a.txt" #/tmp/a
ext函数
含义:
用于返回文件的拓展名
示例:
ext "a.txt" #.txt
isAbs函数
含义:
用于判断文件路径是否是绝对路径,绝对路径返回true,否则返回false
示例:
isAbs "/tmp/a" #true
类型检查函数和对比函数:
kindOf函数
含义:
用于返回对象的类型
示例:
kindOf (list 1 2 3)
kindIs函数
含义:
用于检测某个对象是否是指定的类型,返回布尔值,第一个参数需要指定类型,第二个参数需要指定检查的数据对象
示例:
kindIs "string" "hello"
deepEqual函数
含义:
用于判断两个对象的值是否完全一致,返回布尔值
示例:
deepEqual (list 1 2 3) (list 2 3 4)
流程控制结构语句
流程控制语句if/else
if/else语句中的条件在模板中称为管道,基本结构如下:
{{- if PIPELINE }}
#do something
{{- else if OTHER }}
#do something
{{- else }}
#default case
{{- end }}
如果管道中存在空值时,管道的返回值会设置为false
示例:
设置values.yaml文件
Person:
name: test
work: IT
age: 16
sex: man
ingress:
enabled: true
创建模板
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-test
namespace: {{ .Release.Namespace }}
data:
name: {{ .Values.Person.name | default "test_name" |quote }}
sex: {{ .Values.Person.sex | upper |quote }}
{{- if .Values.ingress.enabled }}
ingress: "配置ingress"
{{- else }}
ingress: "未配置ingress"
{{- end }}
{{- if eq .Values.Person.work "IT" }}
WORK: {{ .Values.Person.work | quote }}
{{- else }}
WORK: "other work"
{{- end }}
with语句
with语句主要用来控制变量的范围,也就是修改查找变量的作用域
示例:
data:
#正常调用values.yaml文件,引用好多变量对象时,会重复写很多相同的引用
Name: {{ .Values.people.info.name }}
Age: {{ .Values.people.info.age }}
#通过with语句。效果和上面一样,引用很多重复的变量对象时,可以with语句将重复的路径作用域设置过来
{{- with .Values.people }}
Name: {{ .info.name }}
Age: {{ .info.age }}
{{- end }}
range语句
语法格式:
{{- range 要遍历的对象 }}
#do something
{{- end }}
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-test
namespace: {{ .Release.Namespace }}
data:
address: |-
{{- range .Values.addess }}
- {{ . | title }} #用.点作为输出并将首字母大写
{{- end }}
{{- range tuple "bj" "sh" "guang" }}
- {{ . | title }}
{{- end }}
helm3中变量详解
helm3中变量在作用域、列表、元组、字典中的使用
变量通常是搭配with语句和range语句使用,能有效的简化代码
变量的定义格式如下:
$name:=value
(1) 使用变量解决对象作用域问题
因为with语句里不能调用夫级别的变量,所以如果需要调用父级别的变量,需要声明一个变量名,将父级别的变量值赋值给声明的变量。
在前面关于helm流控制结构的文中提过使用with更改当前作用域的用法,当时存在一个问题是在with语句中,无法使用父作用域中的对象,需要使用$符号或者将语句移到{{- end }}的外面才可以
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-test
namespace: {{ .Release.Namespace }}
data:
{{- $releaseName:=.Release.Name }} #定义一个变量
{{- with .Values.people.info }}
name: {{ .name }}
age: {{ .age }}
#release1: {{ .Release.Name }} 在with语句内,因为变量作用域,不能调用父级别的变量,且会报错
release2: {{ $releaseName }} #通过变量解决调用父级别的变量
{{- end }}
release3: {{ .Release.Nmae }} #在with语句外,可以调用父级别的变量
(2) 变量在列表或元组中的使用
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-test
namespace: {{ .Release.Namespace }}
data:
address: |-
{{- range $index,$add:=.Values.address }}
{{ $index }}: {{ $add }}
{{- end }}
结果:
address: |-
0: xx
1: xx
(3) 变量在字典中的使用
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-test
namespace: {{ .Release.Namespace }}
data:
address: |-
{{- range $key,$value:=.Values.address }}
{{ $key }}: {{ $value }}
{{- end }}
helm3中子模块的定义和使用
helm3中define定义子模版、template和include调用
1、定义子模板的两个位置
(1)、主模板中
(2)、_helpers.tpl文件内
定义子模版,可以在主模板中定义,也可以在其他文件中定义(_helpers.tpl文件内,是专门提供的定义子模版的文件),实际使用中,这些子模版的内容应当放在单独的文件中,通常是_helpers.tpl文件内
2、子模版的定义和调用
定义子模版: 通过define定义
调用子模版: 通过template或include调用(推荐include)
区别:
template不能被其他函数修饰,include是可以的
示例: 使用define在柱模版中定义子模版,使用template调用子模版
vim /root/mychart/templates/configmap.yaml
{{- define "mychart.labels" }} #定义子模版
labels:
author: test
data: {{ now | htmlDate }}
{{- end }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-test
{{- template "mychart.labels" }} #调用上面的子模版
data:
data1: "hello1"
示例: 使用define在_helpers.tpl文件中定义子模版,使用template调用子模版
#定义子模版
vim /root/mychart/templates/_helpers.tpl
{{- define "mychart.labels" }}
labels:
author: test
data: {{ now | htmlDate }}
{{- end }}
#调用上面的子模版
vim /root/mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-test
{{- template "mychart.labels" }}
data:
data1: "hello1"
示例: 向子模版中传入对象,使用template调用子模版
注意事项:
在子模版中,如果引用了对象,那么渲染的时候子模版中是无法获取到对象信息的,所以如果直接调用子模版会报错
解决这个问题需要在引用子模版的同时将对象的位置传递进去即可
主模板引用子模版时候需要指定对象的位置信息,这个点"."表示在顶层作用域中寻找子模版中指定对象
#定义变量赋值
vim /root/mychart/values.yaml
Person:
info:
name: test
work: IT
age: 16
sex: man
ingress:
enabled: true
#定义子模版vim /root/mychart/templates/_helpers.tpl
{{- define "mychart.labels" }}
labels:
author: {{ .Values.Person.info.name }} #
work: {{ .Values.Person.info.work }}
{{- end }}
#调用上面的子模版vim /root/mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-test
{{- template "mychart.labels" . }} #注意此处的点"."
data:
data1: "hello1"
示例: 向子模版中传入对象,使用include进行调用子模版
#定义变量赋值
vim /root/mychart/values.yaml
Person:
info:
name: test
work: IT
age: 16
sex: man
ingress:
enabled: true
#定义子模版vim /root/mychart/templates/_helpers.tpl
{{- define "mychart.labels" }}
labels:
author: {{ .Values.Person.info.name }}
work: {{ .Values.Person.info.work }}
{{- end }}
#调用上面的子模版vim /root/mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-test
labels:
{{- template "mychart.labels" . |toString |ident 4 }} #注意此处的点"."
data:
{{- template "mychart.labels" . |toString |ident 2 }} #注意此处的点"."
helm3中获取其他文件的内容或文件名
helm中获取其他文件的内容或文件名
1、使用Get方法获取其他文件的内容
2、使用Glob方法获取文件名和内容
3、使用lines方法循环遍历并逐行读取文件中的内容
示例方法一、
使用Get方法获取其他文件的内容
helm提供了.Files对象用于访问文件,其中包含了一些方法用于处理文件中的内容
vim /root/mychart/config/test.txt #自定义一个目录,该目录下自定义一个其他文件
test message
vim /root/mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
data:
token1:
{{.Files.Get "config/test.txt" |b64enc| indent 4 }} #获取文件内容并使用b64enc进行编码缩进
token2: {{.Files.Get "config/test.txt" |quote }}
示例方法二、
使用Glob方法获取文件名和内容
1、创建自定义目录并在目录中创建文件
2、vim /root/mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
data:
{{- range $path,$_:= .Files.Glob "**.conf" }} # **代表匹配任意字符 $_是一个占位符,必须要存在,获取一个空
path: {{ $path }}
{{- end }}
{{(.Files.Glob "config1/*").AsConfig | indent 2 }} #使用AsConfig方法显示文件内容(configmap形式)
{{(.Files.Glob "config2/*").AsSecrets | indent 2 }} #使用AsSecrets方法显示文件内容(secret形式显示)
示例方法三、
使用lines方法循环遍历并逐行读取文件中的内容
1、创建自定义目录并在目录中创建文件
2、vim /root/mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
data:
{{- range $index,$line:= .Files.Lines "config/test.txt" }} #使用.Files对象中的Lindes方法循环遍历后面文件中的每行内容并赋值给line变量,将每行索引赋值给index变量 Lines方法通常和range一起使用,可以变量文件中的每一行并输出
{{- if $line }} #Lines方法遍历行时,最后会输出一个空行,此处使用if语句来判断当前行的内容是否为空,如果不为空,则输出
{{ $index}}: {{ $line | quote }}
{{- end }}
{{- end }}
原文链接:https://blog.csdn.net/weixin_50902636/article/details/144419925