Helm包管理器

第一章:Helm介绍,组件,安装和目录结构

一、Helm概念

Helm是kubernetes的包管理器,可以将一个服务相关的所有资源信息整合到一个chart包中,并且可以使用一套资源发布到多个环境中,可以将应用程序的所有资源和部署信息组合刀单个部署包中

二、Helm组件

1、chart:Helm的一个整合后的chart包,包含一个应用所有的kubernetes声明模板。

2、Helm客户端:Helm的客户端组件,负责和k8s api server通讯

3、Repository:用户发布和存储chart包的仓库。

4、Release:用chart包部署的一个实例,通过chart在k8s中部署的用用都会产生一个唯一的release,同一个chart部署多次就会产生多个release

三、二进制安装Helm

1、下载Helm安装包 https://github.com/helm/helm/releases

2、解压

3、拷贝helm文件到 PATH

cp /opt/helm/helm /usr/local/bin/

4、检查是否安装成功

# helm version
version.BuildInfo{Version:"v3.9.2", GitCommit:"1addefbfe665c350f4daf868a9adc5600cc064fd", GitTreeState:"clean", GoVersion:"go1.17.12"}

四、chart目录结构

1、目录结构

#helm create nginx						#创建一个chart
nginx/									#chart包名称
├── charts								#存放子chart的目录,目录里存放这个chart依赖的所有子chart
├── Chart.yaml							#保存chat的基本信息,包括名字、描述信息及版本等,这个变量文件都可以被templates目录下文件所引用
├── templates							#模板文件目录,目录里面存放所有yaml模板文件,包含了所有部署应用的yaml文件
│   ├── deployment.yaml					#创建deplovment对象的模板文件
│   ├── _helpers.tpl					#子模板模板文件
│   ├── hpa.yaml						#自动伸缩模板文件
│   ├── ingress.yaml					#ingress模板文件
│   ├── NOTES.txt						#存放提示信息的文件,介绍chat帮助信息,helm instal部署后展示给用户,如何使用chat等,是部署chat后给用户的提示信息
│   ├── serviceaccount.yaml
│   ├── service.yaml					#service模板文件
│   └── tests							#用于测试的文件,测试完部署完chart后,如web,做一个链接,看看你是否部署正常
│       └── test-connection.yaml
└── values.yaml							#用于渲染模板的文件(变量文件,定义变量的值) 定义templates目录下的yaml文件可能引用到的变量
										#values.yaml用于存储templates 目录中模板文件中用到变量的值,这些变量定义都是为了让templates目录下yaml引用

2、chart.yaml文件字段说明

#cat Chart.yaml | egrep -v "\#|^$"
apiVersion: chart API 版本 (必需)
name: chart名称 (必需)
version: 语义化2 版本(必需)
kubeVersion: 兼容Kubernetes版本的语义化版本(可选)
description: 一句话对这个项目的描述(可选)
type: chart类型 (可选)
keywords:
  - 关于项目的一组关键字(可选)
home: 项目home页面的URL (可选)
sources:
  - 项目源码的URL列表(可选)
dependencies: # chart 必要条件列表 (可选)
  - name: chart名称 (nginx)
    version: chart版本 ("1.2.3")
    repository: (可选)仓库URL ("https://example.com/charts") 或别名 ("@repo-name")
    condition: (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )
    tags: # (可选)
      - 用于一次启用/禁用 一组chart的tag
    import-values: # (可选)
      - ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项
    alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用
maintainers: # (可选)
  - name: 维护者名字 (每个维护者都需要)
    email: 维护者邮箱 (每个维护者可选)
    url: 维护者URL (每个维护者可选)
icon: 用做icon的SVG或PNG图片URL (可选)
appVersion: 包含的应用版本(可选)。不需要是语义化,建议使用引号
deprecated: 不被推荐的chart (可选,布尔值)
annotations:
  example: 按名称输入的批注列表 (可选).

第二章、编写一个chart和Helm内置对象详解

一、自定义chart

1、创建Chart

#helm create mychart      #创建一个chart包,chart包名为:mychart

2、自定义模板文件

# rm -rf mychart/template/*
# vim configmap.yaml
apiVersion: V1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "hello world"

3、创建一个release实例

helm install myconfigmap ./mychart   #release名称:myconfigmap  chart包目录路径
helm get manifest myconfigmap   #调用钩子查看发布到k8s中的release信息

4、删除release实例

helm uninstall myconfigmap     #uninstall:卸载  myconfigmap:release名称

二、Helm内置对象

vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}   #最前面的"."从作用域最顶层命名空间开始,即: 在项层命名空间中开始查找Release对象,再查找Name对象
  namespace: {{ .Release.Namespace }}
data:
  myvalue: "{{ .Values.MY_VALUE }}"
1、release对象:描述了版本发布自身的一些信息

.Release.Name #最前面的"."从作用域最顶层命名空间开始,即: 在项层命名空间中开始查找Release对象,再查找Name对象
.Release.Namespace #获取release所在的命名空间
.Release.IsUpgrade #如果当前操作是升级或回滚的话,该值为 true
.Release.IsInstall #如果当前操作是安装的话,该值为 true
.Release.Revision #获取此次修订的版本号。初次安装时为 1,每次升级或回滚都会递增
.ReleaseService #获取渲染当前模板的服务名称。一般都是 Helm

2、Values对象:描述的是 value.yaml 文件中的内容,默认为空,使用Value对象可以获取到value.yaml文件中已定义的任何变量数值
3、chart对象:用于获取Chart.yaml文件中的内容

.Chart.Name #获取Chart的名称

.Chart.Version #获取Chart版本

4、Capabilities对象:提供了关于kubernetes集群相关的信息

.CapabilitiesAPIVersions #返回kubernetes集群 API 版本信息集合
.Capabilities.APIVersions.Has version #用于检测指定的版本或资源在k8s集群中是否可用,例如: apps/v1/Deployment
.CapabilitiesKubeVersion和Capabilities.KubeVersion.Version #都用于获取kubernetes 的版本号
.Capabilities.KubeVersion.Major #获取kubernetes 的主版本号
.Capabilities.KubeVersionMinor #获取kubernetes 的小版本号

5、Template对象:获取当前模板的信息

.Template.Name #用于获取当前模板的名称和路径(例如: mychart/templates/mytemplate.yaml)

.Template.BasePath #用于获取当前模板的路径(例如: mychart/templates)

第三章:Helm常用命令

1、Helm常用命令

version: #查看helm客户端版本
repo: #添加、列出、移除、更新和索引chart仓库,可用子命令:add、index、list、remove、update
search: #根据关键字搜索chart包
show: #查看chart包的基本信息和详细信息,可用子命令: all、chart、readme、values
pull: #从远程仓库中下载拉取chart包并解压到本地,如: # helm pull testrepo/tomcat -version 0.4.3 -untar ,untar是解压,不加就是压缩包
create #创建个chart包并指定chart包名字
install: #通过chart包安装一个release实例
list: #列出release实例名
upgrade: #更新一个release实例
rollback: #从之前版本回滚release实例,也可指定要回滚的版本号
uninstall: #卸载一个release实例
history: #获取release历史,用法: helm history release实例名
package: #将chart目录打包成chart存档文件中,例如: 假如我们修改 chart 后,需要将其进打包
#helm package /opt/helm/work/tomcat (chart的目录路径)
get: #下载一个release,可用子命令: all、hooks、manifest、notes、values
status: #显示release实例名的状态,显示已命名版本的状态

2、Helm中添加chart仓库和查看仓库
1)、添加仓库:
可以添加多个仓库,添加仓库时候,记得起个仓库名,如: stable,aliyun,或其他,一般起个稳定版的stable会优先使用。
helm repo add stable http://mirror.azure.cn/kubernetes/charts
#添加微软的,强烈推荐
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts 
#添加阿里云的
helm repo add test-repo http://mirror.kaiyuanshe.cn/kubernetes/charts/
#添加开源社区的
2)、列出仓库
helm repo list
NAME   	URL                                                   
bitnami	https://charts.bitnami.com/bitnami                    
stable 	http://mirror.azure.cn/kubernetes/charts              
aliyun 	https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
3)、更新仓库
helm repo update
#更新添加的所有仓库
4)、删除仓库
helm repo remove test-repo 
#test-repo:仓库名称
3、chart包相关命令
helm create mychart   #创建一个chart包,名称为:mychart
helm search repo tomcat   #在chart仓库搜索名称为tomcat的chart包
helm show chart stable/tomcat  #查看chart包基础信息
helm show values stalbe/tomcat   #查看chart包详细信息
helm pull stalbe/tomcat --version 0.4.3 --untar		##从远程仓库拉取指定版本的chat包到本地并解压,-untar是解压,不加就是压缩包
helm pull 远程仓库chart包名 --untar		#从远程仓库拉取最新版本的chart包到本地并解压,-untar是解压,不加就是压缩包
4、release实例相关命令
1)、安装release实例

helm install tomcat1 stable/tomcat #从加入到本地的chart社区仓库(从官方仓库在线安装)安装release实例,tomcat1为release实例名
helm install tomcat2 tomcat-0.4.3.tgz #从chat仓库拉下来的压缩包进行安装release实例(从本地存档文件离线安装)
helm install tomcat3 tomcat ##从chat仓库拉下来的压缩包解压后,从解压目录安装release实例(从解压目录离线安装)
helm install db http:/ur…/mysa-1.6.9.taz #从一个网络地址仓库压缩包直接安装release实例(从下载服务器安装), db为release实例名
helm install db mysql --debug --dry-run #试运行,不会真正创建release实例
helm install test-release ./mychart #指定release实例名和chart包目录路径进行安装release实例

2)、卸载release实例

helm uninstall release实例名

3)、升级release实例
helm upgrade release实例名 chart名 --set imageTag=1.19		#指定release名和chart名进行相关set设置的升级
helm upgrade release实例名 chart名 -f /.../mychart/values.yaml		#指定release示例名和chart名和values.yaml文件升级
4)、回滚release实例
helm rollback release实例名		#指定release实例名,回滚到上一个版本
helm rollback release实例名版本号	  #指定release实例名,回滚到指定版本,注意版本号是release的版本号,不是镜像版本号
5)、查看release历史版本
helm history release实例名

第四章:Helm内置函数

一、函数使用格式

格式1: 函数名 arg1 arg2 …,
格式2: arg1|函数名
然而在实际的使用中,我们更偏向于使用管道符|来将参数传递给函数这样使用可以使结构看起来更加直观,并且可以方便使用多个函数对数据进行链式处理。

二、常用的内置函数

1、quote 和 squote:通过向quote或squote函数中传递一个参数,即可为这个参数(调用的变量值)添加一个双引号 (quote)或单引号(squote)
# cat value.yaml
favorite:
  drink: coffee
  food: PIZZA
# vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink1: {{ quote .Values.favorite.drink }}      # 获取变量drink的值并添加双引号
  food1: {{ quote .Values.favorite.food }}
  drink2: {{ .Values.favorite.drink | quote }} 		# 获取变量drink的值并添加单引号
  food2: {{ .Values.favorite.food | quote }}
2、upper 和 lower 函数可以分别将字符串转换为大写 (upper) 和小写字母 (lower) 的样式
vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink2: {{ .Values.favorite.drink | upper | quote }} 		# 获取变量drink的值并转换成大写且添加双引号
  food2: {{ .Values.favorite.food | lower | quote }}		# 获取变量food的值并转换成小写且添加单引号
3、repeat函数,将指定的字符串重复输出指定的次数
value1: {{ .Values.name1 | repeat 3 | quote }}
4、lookup函数,用于在当前的k8s集群中获取一些资源的信息,类似于kubectl get
kubectl get pod mypod -n mynamespace		lookup "v1" "Pod" "mynamespace" "mypod"
kubectl get pods -n mynamespace				lookup "v1" "Pod" "mynamespace" ""
kubectl get pods --all-namespaces			lookup "v1" "Pod" "" ""
kubectl get namespace mynamespace			lookup "v1" "Namespace" "" "mynamespace"
kubectl get namespaces						lookup "v1" "Namespace" "" ""

三、逻辑和流控制函数

eq: #用于判断两个参数是否相等,如果等于则为 true,不等于则为 false。
ne: #用于判断两个参数是否不相等,如果不等于则为 true,等于则为 false。
lt: #lt 函数用于判断第一个参数是否小于第二个参数,如果小于则为 true,如果大于则为 false
le: #判断第一个参数是否小于等于第二个参数,如果成立则为 true,如果不成立则为 false。
gt: #gt 函数用于判断第一个参数是否大于第二个参数,如果大于则为 true,如果小于则为 false。
ge: #判断第一个参数是否大于等于第二个参数,如果成立则为 true,如果不成立则为 false。
and: #返回两个参数的逻辑与结果(布尔值),也就是说如果两个参数为真,则结果为 true。否认哪怕一个为假,则返回alse
or: #判断两个参数的逻辑或的关系,两个参数中有一个为真,则为真。返回第一个不为空的参数或者是返回后一个参数
not: #用于对参数的布尔值取反,如果参数是正常参数(非空),正常为true,取反后就为false,参数是空的,正常是flse,取反后是tTrue
default: #用来设置一个默认值,在参数的值为空的情况下,则会使用默认值
#在实际的chart中,所有的静态默认值应该设置在 values.yaml 文件中,且不应该重复使用 default 命令 (否则会出现冗余)。然而这个default 命令很适合计算值,其不能声明在values.yaml文件中
empty: #用于判断给定值是否为空,如果为空则返回true
coalesce: #用于扫措一个给定的列表,并返回第一个非空的值。
ternary: #接受两个参数和一个 test 值,如果test 的布尔值为 true 则返回第一个参数的值,如果test 的布尔值为false,则返回第二个参数的值

  shell1: {{ eq .Values.fun.fun_name .Values.fun.fun_passwd }}
  shell2: {{ or 1 2 "" }}
  shell3: {{ .Values.fun.fun_url | empty }}
  shell4: {{ .Values.fun.fun_name | empty }}
  shell5: {{ false | empty }}
  shell6: {{ coalesce  0 1 2 }}
  shell7: {{ ternary "First" "Second" true }}
  drink: {{ .Values.favorite.drink | default "tea" | quote }}

四、字符串函数

1、print 和 println函数 #打印信息的函数,print不会再字符串之间添加空格,println会在字符串之间添加空格,并会在最后添加一个换行符
2、printf函数 #用户格式化输出字符串的内容,并且支持占位符。
3、trim函数、trimAll 函数、trimPrefix函数 和 trimSufix函数
trim函数用来去除字符串两边的空格 trimall函数用于移除字符串中指定的字符 trimPrefix 和 trimSuffix 函数: 分别用于移除字符串中指定的前缀和后缀
4、lower函数、upper函数、title函数 和 untitle函数
lowwer用于将所有字母转换成小写,upper用于将所有字母转换成大写,title用于将首字母转换成大写 untitle用于将大写的首字母转换成小写
5、snakecase函数、camelcase函数 和 kebabcase函数
snakecase函数用于将驼峰写法转换为下划线命名写法,camelcase函数,用于将下划线命名写法转换为驼峰写法,kebabcase函数,用于将驼峰写法转换为中横线写法
6、swapcase函数
作用是基于内置的算法来切换字符串的大小写
7、substr函数
用于切割字符串 (指定切割起、始位置) ,并且返回切割后的字串
8、trunc函数
用于截断字符串。trunc 可以使用正整数或负整数来分别表示从左向右截取的个数和从右向左截取的个数
9、abbrev函数
作用是使用省略号(…)切割字符串,保留指定的长度,注意省略号的长度是3个。其中省略号也是计算在长度之内的。
10、randAlphaNum函数、randAlpha函数、randNumeric函数 和 randAscii 函数
randAlphaNum函数: 使用 0-9a-ZA-Z生成随机字符串,randAlpha函数:使用 a-zA-Z生成随机字符串,randNumeric函数:使用 0-9生成随机字符串,randAscii函数:使用所有的可使用的 ASCII 字符生成随机字符串
11、contains函数
用于测试一个字符串是否包含在另一个字符串里面,返回布尔值,true或false,结果:true
12、hasPrefix函数 和 hasSufix函数
hasPrefix函数测试一个字符串是否是指定字符串的前缀,返回布尔值,true或false,hasSufix函数测试一个字符串是否是指定字符串的后缀,返回布尔值,true或false
13、repeat函数、nospace函数 initials 函数
repeat函数将字符串重复输出指定的次数,nospace函数用于去掉字符串中所有的空格,initials函数用于截取指定字符串的每个单词的首字母,并拼接在一起
14、wrapWith函数
作用是在文档中在指定的列数添加内容,例如添加内容:“t“
15、replace函数
用于执行简单的字符串替换。该函数需要传递三个参数:待替换的字符串、将要替换的字符串、源字符串
第1个参数:待替换的字符串
第2个参数:将要替换的字符串
第3个参数:源字符串
示例:“I Am Test”| replace " " “-”
返回结果: I-Am-Test
16、shuffle函数
用于对字符串中的字符进行重新排序,是基于他内部的一个算法
17、indent函数和 nindent函数
实例: type10: {{ nindent 4 “this is ngndent” }}
type11: {{ indent 4 “this is indent” }}
indent函数 和 nindent函数,用法一样,都是用于以指定的长度缩进来缩进指定字符串的所在行。
区别是: nindent函数可以在缩进时在字符串开头添加新行,也就是在该行字符串上方会添加一行新的空行。
注意:上面两各都有两部分缩进,“{{”前面已经手动缩进了4个字符,后面又指定了4个字符的缩进,结果:应该有8个字符缩进),indet是8个字符
但是由于ninden会在缩进时在字符串开头添加新行,也就是在该行字符串上方会添加一行新的空行,然后另起一行,所有另起的结果还是缩进4个字符
一般为了防止麻烦,一般indent和nindent所在行都顶格写最好。
18、plural 函数
判断字符串的长度,并且根据长度返回不同的值,如:字符串的长度为1会返回plural 函数的第一个参数,若不是1则返回第二个参数(包括0)

五、类型转换函数与正则函数

类型转换

1、atoi函数 将字符串转换为整型
2、float64函数,转换成float64类型
3、int函数,转换成int型
4、int64函数,转换成 int64 类型
5、toString函数,转换成字符串
6、toDecimal函数,将 unix 八进制转换成 int64
7、toJson函数(mustTo]son),将列表、切片、数组、字典或对象转换成JSON
8、toPrettyJson函数(mustToPrettyJson),将列表、切片、数组、字典或对象转换成格式化JSON
9、toRawJson函数(mustToRawJson),将列表、切片、数组、字典或对象转换成JSON (HTML字符不转义)
10、kindOf函数,返回对象类型
data01: {{ 16 kindOf }}     #字符串类型
data02: {{ "16" kindOf }}   #int整数类型
data03: {{ atoi "16" | kindof }}
data04: {{ foat64 "16.0" | kindOf }}

正则表达

1、regexFind函数 和 mustRegexFind函数

返回输入字符串的第一个 (最左边的) 正则匹配,mustRegexFind 有问题时会向模板引擎返回错误。

{{ regexFind "[a-zA-Z][1-9]" "abcd1234" }}
上述结果为: d1
2、regexFindAll函数 和 mustRegexFindAll函数

返回输入字符串匹配正则表达式的所有切片。最后一个参数表示要返回的子字符串的数量,-1表示返回所有。mustRegexReplaceAll 有问题时会向模板引擎返回错误

regexFindAll "[2,4,6,8]" "123456789" -1
上述结果为: [2 4 6 8]
3、regexMatch函数 和 mustRegexMatch函数

用于根据指定的正则来匹配字符串,如果匹配成功则返回true,如果表达式有问题,regexMatch会直接抛出错误,mustRegexMatch会向模板引擎返回错误。

{{ regexMatch "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$" "test@acme.com" }}
上述结果为: true
4、regexReplaceAll函数 和 mustRegexReplaceAll函数

返回输入字符串的拷贝,用替换字符串替换Regexp的匹配项。在替换字符串里面, $ 标志被解释为扩展,因此对于实例来说 $1 表示第一个子匹配的文本

{{ regexReplaceAll "a(x*)b" "-ab-axxb-" "${1}W" }}
上述结果为: -W-xxW-
5、regexReplaceAllLiteral函数 和 mustRegexReplaceAllLiteral函数

返回输入字符串的拷贝,用替换字符串替换Regexp的匹配项。匹配字符串直接替换而不是扩展。

{{ regexReplaceAllLiteral "a(x*)b" "-ab-axxb-" "${1}" }}
上述结果为: -${1}-${1}-
6、regexSplit函数 和 mustRegexSplit函数

将输入字符串切成有表达式分隔的子字符串,并返回表达式匹配项之间的切片。最后一个参数n确定要返回的子字符串数量,-1表示返回所有匹配。

{{ regexSplit "z+" "pizza" -1 }}
上述结果为: [pi a]

六、日期函数

1、now函数: 用于返回当前日期和时间,通常与其他日期函数共同使用
2、date函数:用于将日期信息进行格式化。date 函数后面需要指明日期的格式,这个格式内容必须使用"2006-01-02"或"02/01/2006" 来标明
now | date "2006-01-02"
3、datelnZone函数:用法与date函数基本一致,只不过datanone函数可以指定时区返回时间,如:指定UTC时区返回
dateInZone "2006-01-02" (now) "UTC"
4、duration函数:该函数可以将给定的秒数转换为colang 中的tme.Duration类型,例如指定 95秒可以返回1m35s,秒数必须需要使用双引号,否则会返回0s
duration "95"
5、durationRound函数: durationRound函数用于将给定的日期进行取整,保留最大的单位
durationRound "2h10m5s"

七、字典函数

1、dict函数

Helm提供了一种称为dict(在Python中是“字典”的缩写)的key/value存储类型。字典是一种无序类型

字典的键必须是一个字符串。但是,该值可以是任何类型,甚至是另一个字典或列表。

与list不同,dict是可变的。set和unset函数将修改字典的内容。

2、get函数

用来获取定义字典myDict的值

3、set函数

用于向已有的字典中添加新的键值对,亦可以修改原来键值对的值

4、unset

用于删除字典中指定的key

  {{- $myDict := dict "name1" "value1" "name2" "value2" "name3" "value3" }}
  {{- $mydict2 := dict "food1" "noodle" "food2" "tea" "food3" "rice" }}
  {{- $mydict3 := dict "games1" "俄罗斯方块" "games2" "贪吃蛇" "games3" "马里奥" }}
  print1: {{ $myDict }}
  print2: {{ get $myDict "name1" }}
  print3: {{ set $myDict "name4" "value4" }}
  print4: {{ get $myDict "name4" }}
  print5: {{ unset $myDict "name3" }}

上述结果为

print1: map[name1:value1 name2:value2 name3:value3]
print2: value1
print3: map[name1:value1 name2:value2 name3:value3 name4:value4]
print4: value4
print5: map[name1:value1 name2:value2 name4:value4]

八、列表函数

1、list函数,用于生成一个列表,传入的参数将会作为列表中的值
2、first函数,用于获取列表的第一项
3、rest函数,用于获取列表中除第一项以外的所有内容
4、last函数,获取列表中最后一项
5、initial函数,获取里表中除最后一项以外的所有内容

示例:

  {{- $myList := list 1 2 3 "one" "two" "three" "a" "b" "c" }}
  keys1: {{ $myList | quote }}
  keys2: {{ first $myList | quote }}
  keys3: {{ rest $myList | quote }}
  keys4: {{ last $myList | quote }}
  keys5: {{ initial $myList | quote }}

结果:

  keys1: "[1 2 3 one two three a b c]"
  keys2: "1"
  keys3: "[2 3 one two three a b c]"
  keys4: "c"
  keys5: "[1 2 3 one two three a b]"

第五章:流控制结构语句

首先,模板声明的大括号语法可以通过特殊的字符修改,并通知模板引擎取消空白。{{- (包括添加的横杠和空格)表示向左删除空白, 而 -}}表示右边的空格应该被去掉。 并且会删除换行,一般慎用(因为删除换行的时候,打印的内容就换了,还有可能会语法报错)一定注意空格就是换行

要确保-和其他命令之间有一个空格。 {{- 3 }} 表示“删除左边空格并打印3”,而{{-3 }}表示“打印-3”。

一、if/else 语句

1、作用

主要用于条件判断,不同的条件做不同的事情

2、基本结构
{{ if PIPELINE }}
  # Do something
{{ else if OTHER PIPELINE }}
  # Do something else
{{ else }}
  # Default case
{{ end }}
3、示例
# vim value.yaml
xiaoming:
  name: 
    new_name: xiaoming
    old_name: xiaohong
  age: 15
  sex: man
  work: IT
ingress:
  enabled: false
person:
  info:
    name: chichu
    sex: boy
    address: beijing
    age: 18
city:
  - beijing
  - tianjing
  - shanghai
# vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}
  namespace: {{ .Release.Namespace }}
data:
  name: {{ .Values.xiaoming.aihao | default "篮球" | quote }}
  sex: {{ .Values.xiaoming.sex | upper | quote }}
  {{- if .Values.ingress.enabled }}
  ingress: "配置ingress..."
  {{- else }}
  ingress: "不配置ingress..."
  {{- end }}
  {{- if eq .Values.xiaoming.work "IT" }}
  work: {{ .Values.xiaoming.work | quote }}
  {{- else }}
  work: "other work"
  {{- end }}

结果

apiVersion: v1
kind: ConfigMap
metadata:
  name: test
  namespace: default
data:
  name: "篮球"
  sex: "MAN"
  ingress: "不配置ingress..."
  work: "IT"

二、with 语句

1、作用

用来控制变量的范围,也就是修改查找变量的作用域,修改后,不能调用父级别的变量,且会报错

2、基本结构
{{ with PIPELINE }}
  # restricted scope
{{ end }}
3、示例
# vim configmap.yaml
  ...
  name1: {{ .Values.xiaoming.name.old_name | quote }}
  name2: {{ .Values.xiaoming.name.new_name | quote }}
  {{- with .Values.xiaoming }}
  name3: {{ .name.old_name }}
  name4: {{ .name.new_name }}
  {{- end }}
  name1: "xiaohong"
  name2: "xiaoming"
  name3: xiaohong
  name4: xiaoming

三、range 语句

1、作用

用来提供循环遍历集合输出的功能

range指定遍历指定对象,每次循环的时候,都会将作用域设置为当前的对象。直接使用,来代表当前作用域并对当前的对象进行输出除了Values 对象中的集合,range 也可以对 tuple、dict、list 等进行遍历

2、基本结构
{{- range 要遍历的对象 }}
  # do something
{{- end }}
3、示例
# vim configmap.yaml
   ...
  address: |-
    {{- range .Values.xiaoming }}
    - {{ . }}         #输出所有遍历的内容
    {{- end }}
    {{- range tuple "bj" "sh" "sx" }}
    - {{ . | title }}   # title 首字母大写
    {{- end }}
  address: |-
    {{- range $index, $city := .Values.city }}    #index 添加索引  $city定义变量
    {{ $index }} : {{ $city }}
    {{- end }}
  info1: |-
    {{- range $key, $value := .Values.person.info }}    # $key 获取value.yaml中的key , $value 获取value.yaml 中的 value
    {{ $key }}: {{ $value }}
    {{- end }}

  address: |-
    - 15
    - map[new_name:xiaoming old_name:xiaohong]
    - man
    - IT
    - Bj
    - Sh
    - Sx
  address: |-
  0 : beijing
  1 : tianjing
  2 : shanghai
  info1: |-
    address: beijing
    age: 18
    name: chichu
    sex: boy

第六章:Helm变量

一、变量的定义

变量的定义格式:$name := value ( := 称为赋值运算符,将值 value 赋值给前面的变量 name

第七章、子模板的定义和使用

一、定义子模板的位置

1、在主模板中定义

2、在_helpers.tpl 文件内

二、子模板的定义、调用、注释

定义子模板: 通过define定义

# cat _helpers.tpl 
{{- define "mychart.labels" }}  #mychart.labels 子模板的名称
  labels:
    author: {{ .Values.person.info.name }}
    address: {{ .Values.person.info.address }}
{{- end }}               #子模板mychart.labels的结束
{{- define "temp2" }}
  labels:
    sex: {{ .sex }}   
{{- end }}
{{/* 定义子模板,观察template函数与include函数的区别 */}}
{{- define "temp3" }}
Author: {{ .Values.person.info.name }}
dizhi: {{ .Values.person.info.address }}
{{- end }}

调用子模板: 通过template或include调用(推荐)

# cat temp.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}
  {{- template "mychart.labels" . }}    # "." 表示在顶层作用域中寻找子模板中制定的对象
  {{- template "temp2" .Values.person.info }}    # “.Values.person.info” 修改作用域。template调用不可以用其它函数再次进行修饰
{{- include "temp3" . | toString | indent 4 }}   # include 调用可以用其他函数再次进行修饰
data:
  data1: "hello"
{{- include "temp3" . | toString | indent 2 }}

结果:

apiVersion: v1
kind: ConfigMap
metadata:
  name: test
  labels:
    author: chichu
    address: beijing
  labels:
    sex: boy    
    Author: chichu
    dizhi: beijing
data:
  data1: "hello"  
  Author: chichu
  dizhi: beijing

注释模板:

{{- /*
This is a comment.
*/}}
type: frobnitz
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐