前面的文章介绍了 Helm Chart 的一些基本概念和使用,接下来我们重点介绍下 Chart 模板的编写。模板会渲染成 Kubernetes 的资源清单文件,接下来我们将来学习下模板的结构和如何使用它们,以及如何调试。
对象从模板引擎传递到模板中,在代码中可以传递对象,也有一种方法可以在模板宏创建新的对象,比如 tuple
函数。对象可以很简单,也可以包含其他对象或函数,例如,Release 对象就包含几个对象(比如 Release.Name),Files 对象就包含几个函数。
以下就介绍下变量的几种使用方法:
一、内置对象
通过前面的文章已经说过,当helm install一个资源类型时,就叫做一个release。Release 是我们可以在模板中访问的几个顶级对象之一,以下为release常用的几个内置变量
Release
:该对象描述了 release 本身的相关信息,它内部有几个对象:Release.Name
:release 名称Release.Namespace
:release 安装到的命名空间Release.IsUpgrade
:如果当前操作是升级或回滚,则该值为 trueRelease.IsInstall
:如果当前操作是安装,则将其设置为 trueRelease.Revision
:release 的 revision 版本号,在安装的时候,值为1,每次升级或回滚都会增加Release.Service
:渲染当前模板的服务,在 Helm 上,实际上该值始终为 Helm
举例说明如下:
1:编辑模板文件,如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }} ###名字使用release的name
namespace: {{ .Release.namespace }}
labels:
app: helm-nginx
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: helm-nginx
template:
metadata:
labels:
app: helm-nginx
spec:
containers:
- name: nginx
image: {{ .Values.nginx.image.repository}}:{{ .Values.nginx.image.tag}}
imagePullPolicy: {{ .Values.nginx.image.pullPolicy }}
ports:
- name: http
containerPort: 80
protocol: TCP
2: helm instal 部署nginx app,如下:
[root@node1 mychart]# helm install nginx -n nginx .
NAME: nginx
LAST DEPLOYED: Mon Jul 31 16:21:16 2023
NAMESPACE: nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing mychart.
Your release is named nginx.
To learn more about the release, try:
$ helm status nginx
$ helm get nginx
[root@node1 mychart]#
3:查看已经部署好的应用
[root@node1 mychart]# helm list -nnginx
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
nginx nginx 1 2023-07-31 16:21:16.289675827 +0800 CST deployed mychart-0.1.0 1.16.0
[root@node1 mychart]# kubectl get deploy -nnginx
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 83s ###可以看到deploy的名字为nginx,ns也是nginx
[root@node1 mychart]#
-
chart
Chart.Version
:Chart版本号Chart.Name
:Chart名称
获取Chart.yaml
文件的内容,该文件中的任何数据都可以访问,如下:
1:模板文件如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Chart.Name }} ###调用的chart的name
labels:
app: {{ .Chart.type }}-{{ .Chart.Version}} ###使用chart的版本打标签
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: helm-nginx
template:
metadata:
labels:
app: helm-nginx
spec:
containers:
- name: nginx
image: {{ .Values.nginx.image.repository}}:{{ .Values.nginx.image.tag}}
imagePullPolicy: {{ .Values.nginx.image.pullPolicy }}
ports:
- name: http
containerPort: 80
protocol: TCP
2:helm install 安装release
[root@node1 mychart]# helm install nginx -n nginx .
NAME: nginx
LAST DEPLOYED: Mon Jul 31 16:59:26 2023
NAMESPACE: nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing mychart.
Your release is named nginx.
To learn more about the release, try:
$ helm status nginx
$ helm get nginx
3:查看安装好的应用
[root@node1 mychart]# helm list -n nginx
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
nginx nginx 1 2023-07-31 16:59:26.812573513 +0800 CST deployed mychart-0.1.0 1.16.0
查看部署好的资源
[root@node1 mychart]# kubectl get all -n nginx
NAME READY STATUS RESTARTS AGE
pod/mychart-75ff7797cc-v8hns 1/1 Running 0 21s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-helm ClusterIP 10.233.47.51 <none> 80/TCP 21s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mychart 1/1 1 1 21s ###可以看到deploy的name为chart的name
NAME DESIRED CURRENT READY AGE
replicaset.apps/mychart-75ff7797cc 1 1 1 21s
查看deployment的label
[root@node1 mychart]# kubectl describe deploy mychart -n nginx
Name: mychart
Namespace: nginx
CreationTimestamp: Mon, 31 Jul 2023 16:59:27 +0800
Labels: app=application-0.1.0 ####label标签为chart的type和version
app.kubernetes.io/managed-by=Helm
Annotations: deployment.kubernetes.io/revision: 1
meta.helm.sh/release-name: nginx
meta.helm.sh/release-namespace: nginx
- template
包含当前正在执行的模板的相关信息
Name:当前模板的命名空间文件路径(比如 mychart/templates/mytemplate.yaml)
BaePath:当前 chart 的模板目录的命名空间路径(比如 mychart/templates)
- files
可以访问 chart 中的所有非特殊文件,虽然无法使用它来访问模板文件,但是可以来访问 chart 中的其他文件。
Files.Get:用于根据名称获取文件(比如 .Files.Get config.ini)
Files.GetBytes:用于以 bytes 数组而不是字符串的形式来获取文件内容的函数,这对于类似于图片之类的东西很有用
Files.Glob:用于返回名称于给定的 shell glob 模式匹配的文件列表
Files.Lines:可以逐行读取文件的函数,对于遍历文件中的每行内容很有用
Files.AsSecrets:将文件内容以 Base64 编码的字符串返回的函数
Files.AsConfig:将文件正文作为 YAML 字典返回的函数
- Capabilities
提供了获取有关 Kubernetes 集群支持功能的信息的对象
Capabilities.APIVersions:支持的版本集合
Capabilities.APIVersions.Has $version:判断一个版本(比如 batch/v1)或资源(比如 apps/v1/Deployment)是否可用
Capabilities.Kube.Version:Kubernetes 的版本
Capabilities.Kube:是 Kubernetes 版本的缩写
Capabilities.Kube.Major:Kubernetes 主版本
Capabilities.Kube.Minor:Kubernetes 的次版本
二、values
前面讲了内置对象的使用,接下来主要来讲解另外一个内置对象values
的使用,该对象一般从 values.yaml
文件和用户提供的 values 文件传递到模板的 Values 值。
values的值来源主要有以下几种:
- chart 文件中的
values.yaml
文件 - 用
-f
参数传递给helm install
或helm upgrade
的 values 值文件,一般是用户自定义的文件 - 用
--set
传递的各个参数,这个优先级最高(例如helm install --set name=nginx .
) - 父 chart 的
values.yaml
文件
values.yaml
文件是默认值,可以被父 chart 的 values.yaml
文件覆盖,而后者又可以由用户提供的 values 值文件覆盖,而该文件又可以被 --set
参数覆盖。
如下我们使用默认的values.yaml文件进行测试
编辑values.yaml文件
favorite:
drink: water
food: apple
##############################
模板configmap文件
apiVersion: v1 kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | default "rice" }}
food: {{ .Values.favorite.food | upper }}
######################################
运行helm install,查看渲染结果
[root@node1 mychart]# helm install --generate-name --dry-run --debug . -n nginx
install.go:178: [debug] Original chart version: ""
install.go:195: [debug] CHART PATH: /root/mychart
NAME: chart-1691649967
LAST DEPLOYED: Thu Aug 10 14:46:08 2023
NAMESPACE: nginx
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
favorite:
drink: water
food: apple
HOOKS:
MANIFEST:
---
# Source: mychart/templates/nginx/config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: chart-1691649967-configmap
data:
myvalue: "Hello World"
drink: water ###可以看到渲染的结果是根据values.yaml中定义的值一样
food: APPLE
########################################
以下我们使用--set 参数进行覆盖
[root@node1 mychart]# helm install --generate-name --dry-run --debug --set favorite.drink=bread . -n nginx
install.go:178: [debug] Original chart version: ""
install.go:195: [debug] CHART PATH: /root/mychart
NAME: chart-1691650355
LAST DEPLOYED: Thu Aug 10 14:52:35 2023
NAMESPACE: nginx
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
favorite:
drink: bread
COMPUTED VALUES:
favorite:
drink: bread
food: apple
HOOKS:
MANIFEST:
---
# Source: mychart/templates/nginx/config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: chart-1691650355-configmap
data:
myvalue: "Hello World"
drink: bread ####可以看到此处的值被定义为bread,覆盖掉了默认的water
food: APPLE
---
如果我们在模板中不想使用定义的参数了,可以删除默认的key,设置为NULL
在configmap的template模板中,定义如下的key
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink }} ###取消drink这个key
food: {{ .Values.favorite.food }}
####################################
运行helm install命令设置key为NULL,如下:
[root@node1 mychart]# helm install --generate-name --dry-run --debug --set favorite.drink=NULL . -n nginx
install.go:178: [debug] Original chart version: ""
install.go:195: [debug] CHART PATH: /root/mychart
NAME: chart-1691650883
LAST DEPLOYED: Thu Aug 10 15:01:24 2023
NAMESPACE: nginx
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
favorite:
drink: null
COMPUTED VALUES:
favorite:
food: apple
# Source: mychart/templates/nginx/config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: chart-1691650883-configmap
data:
myvalue: "Hello World"
drink: ####此处可以看到drink的值为空
food: APPLE
---
以上内容为helm内置对象的使用,后面将继续演示其他方法的使用