helm3调试和基础函数if/with/range(3)

在开发一个chart的时候就需要对整个模板进行了解,从使用角度来说,是简单的。但是去开发的时候就需要一定的认识才能够完成一个模板的开发。

而在其中用的较多的就是内置的一些函数,或者说是对象,通常,在helm的模板变量中,以大写开头的都是系统提供的,这由Go的函数约定。

内置对象

release

release:release是作为顶级对象的,与下面的其他不同的是她是内置函数。字面上release是发布的意思,这个对象描述了也是关于发布的一些信息,如下:

  • Release.Name: 顾名思义,release名称
  • Release.Namespace: release名称空间
  • Release.IsUpgrade: release当在升级或者回滚的时候,值为true
  • Release.IsInstall: 如果当前是安装则为true
  • Release.Revision: release版本号,第一次安装是1,升级和回滚都会增加
  • Release.Service: 渲染helm的服务

values.yaml

除此之外,还有values.yaml,这个文件的提供信息是传递到values的,而默认情况下是空的, 所以我们可以进去定制。values.yaml也是用的最多的文件

Chart.yaml

而chart.yaml的内容的值最终是被渲染到helm中的,这些使用helm ls的时候就可以看到,比如name和version等,这些信息可以进行定制值

name: linuea
Version: 1.1.1

渲染后就变成了linuxea-1.1.1

Files

Files可以访问chart的非特殊文件,无法访问模板,提供以下参数

  • Files.Get 或许文件,如: .Files.Get confuig.ini
  • Files.GetBytes 以bytes数组获取文件内函数
  • Files.Glob 用于返回名称给到shell glob模式匹配的文件列表
  • Files.Lines 逐行读取文件的函数,遍历每行内容
  • Files.Assecrets 以Base64编码字符串返回
  • Files.AsConfig 以yaml字典返回

Capabilities

Capabilities用于获取与kubernetes集群支持功能信息的对象

  • Capabilities.APIVersion: 支持的版本
  • Capabilities.APIVersion.Has.version 判断版本或者资源是否可用
  • Capabilities.Kube.Version k8s版本,同时也是Capabilities.Kube 的缩写
  • Capabilities.Kube.Major k8s主版本
  • Capabilities.Kube.Minor k8s次版本

Template

Template包含当前正在执行的模板信息

  • Name: 当前模板文件路径
  • BasePath: 当前chart模板目录的路径

创建chart

使用create就可以进行创建,helm create --help可以看到帮助信息中有想要的参数,直接创建的将会是一个nginx的Deployment的yaml的清单,尝试创建即可

helm create linuxea
[root@linuxea.com /data/helm/mysql]# helm create linuxea
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config
Creating linuxea

目录结构如下

[root@linuxea.com /data/helm/mysql]# tree linuxea/
linuxea/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

3 directories, 10 files

values.yaml

实际上我们不需要创建的这些文件,只需要一个目录结构即可,最重要的是values.yaml

这个文件可以使用-f传递给helm install或helm upgrade

helm install -f values.yaml linuxea

再者,使用--set传递各个参数

helm install --set image=123 linuxea

values.yaml的是被用来渲染模板,而--set的值是优先于values.yaml的,因此--set可以覆盖values.yaml的值

既然默认创建的chart并不是期望的,可以删除模板文件和vlaues.yaml的内容,或者手动创建目录结构即可

手动创建目录

mkdir -p  liunuxea/{templates,charts}
touch values.yaml liunuxea/
touch configmap.yaml liunuxea/templates/configmap.yaml
cat > liunuxea/Chart.yaml << EOF
apiVersion: v2
name: linuxea
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"
EOF

结构如下

[root@linuxea.com /data/helm/mysql]# tree liunuxea/
liunuxea/
├── charts
├── Chart.yaml
├── templates
│   └── configmap.yaml
└── values.yaml

2 directories, 3 files

示例1

此时渲染一个参数的值,比如,有一个configmap

apiVersion: v1
kind: ConfigMap
metadata:
  name: linuxea-cmp
  labels:
    app: linuxea-cmp
data:
  test: 

这里的test是空的,在values.yaml中定义一行

mydata: hi mark, my www.linuxea.com

而现在要想在configmap中使用values.yaml的mydata,就需要使用{{ .Vaules }}来使用

apiVersion: v1
kind: ConfigMap
metadata:
  name: linuxea-cmp
  labels:
    app: linuxea-cmp
data:
  test: {{ .Values.mydata }}

{{ .Values.mydata }}这种方式是go的模板方式

helm使用template可以进行渲染,直接在windows就可以渲染模板以共查看

PS H:\k8s-1.20.2\helm> helm.exe template test .\liunuxea\
---
1. Source: linuxea/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: linuxea-cmp
  labels:
    app: linuxea-cmp
data:
  test: hi mark, my www.linuxea.com

除此之外,当我们输入的是test的时候,我们希望test被替换城什么值的时候就可以使用Release

比如,Release.Name

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-cmp
  labels:
    app: {{ .Release.Name }}-cmp
data:
  test: {{ .Values.mydata }}

这次chart名称换 marksugar

helm.exe template marksugar .\liunuxea\
PS H:\k8s-1.20.2\helm>  helm.exe template marksugar .\liunuxea\
---
1. Source: linuxea/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: marksugar-cmp
  labels:
    app: marksugar-cmp
data:
  test: hi mark, my www.linuxea.com

这里引用{{ .Release.Name }}的地方就被替换城了marksugar

--set

除此之外,还可以使用helm的--set来覆盖 --set mydata=linuxea.com

PS H:\k8s-1.20.2\helm> helm.exe template marksugar --set mydata=linuxea.com .\liunuxea\
---
1. Source: linuxea/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: marksugar-cmp
  labels:
    app: marksugar-cmp
data:
  test: linuxea.com

--dry-run

template只是用来本地模板渲染,但是--dry-run是用来模拟安装,这两个在调试的时候有一些差别,--dry-run也可以使用--debug

helm install marksugar --dry-run   --set mydata=linuxea.com liunuxea/

如下

[root@linuxea.com /data/helm]# helm install marksugar --dry-run   --set mydata=linuxea.com liunuxea/
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config
NAME: marksugar
LAST DEPLOYED: Sat Apr 16 02:09:37 2022
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
1. Source: linuxea/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: marksugar-cmp
  labels:
    app: marksugar-cmp
data:
  test: linuxea.com

示例2

而values.yaml有多个值的时候,如

mydata:
  names: linuxea
  data: hi mark, my www.linuxea.com

引用的时候就发生了变化

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-cmp
  labels:
    app: {{ .Release.Name }}-cmp
data:
  name: {{ .Values.mydata.names }}
  test: {{ .Values.mydata.data }}

本地渲染

PS H:\k8s-1.20.2\helm>  helm.exe template marksugar  .\liunuxea\
---
1. Source: linuxea/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: marksugar-cmp
  labels:
    app: marksugar-cmp
data:
  name: linuxea
  test: hi mark, my www.linuxea.com

--set覆盖也是一样

PS H:\k8s-1.20.2\helm>  helm.exe template marksugar --set mydata.data=linuxea.com .\liunuxea\
---
1. Source: linuxea/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: marksugar-cmp
  labels:
    app: marksugar-cmp
data:
  name: linuxea
  test: linuxea.com