Skip to content

helm3

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 版本区别

alt text

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