目录结构
文档地址:https://helm.sh/zh/docs/topics/charts/
通过下面命令创建一个chart,指定chart名:mychart
[root@Kubernetes charts]# helm create mychart
Creating mychart
[root@Kubernetes charts]# tree mychart
mychart
├── 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
目录 | 介绍 |
---|---|
charts | 存放子chart的目录,目录里存放这个chart依赖的所有子chart |
Chart.yaml | 保存chart的基本信息,包括名字、描述信息及版本等,这个变量文件都可以被template目录下文件所引用 |
templates | 模板文件目录,目录里面存放所有yaml模板文件,包含了所有部署应用的yaml文件 |
templates/deployment.yaml | 创建deployment对象的模板文件 |
templates/_helpers.tpl_ | 放置模板助手的文件,可以在整个chart中重复使用,是放一些templates目录下这些yaml都有可能会用的一些模板 |
templates/hpa.yaml | |
templates/ingress.yaml | |
templates/NOTES.txt | 存放提示信息的文件,介绍chart帮助信息,helm install部署后展示给用户,如何使用chart等,是部署chart后给用户的提示信息 |
templates/serviceaccount.yaml | |
templates/service.yaml | |
templates/tests | 用于测试的文件,测试完部署完chart后,如web,做一个连接,看看是否部署成功 |
templates/tests/test-connection.yaml | 用于渲染模板的文件(变量文件,定义变量的值)定义templates目录下的yaml文件可能引用到的变量 |
values.yaml | values.yaml用于存储templates目录中模板文件中用到变量的值,这些变量定义都是为了让templates目录下yaml引用 |
案例1
需求
编写一个chart,不引用内置对象的变量值(用HELM3发布创建一个ConfigMap,创建到K8s集群中,发布其他应用也一样,我们由浅入深进行学习)
创建实例
编写Chart:
[root@Kubernetes charts]# helm create myConfigMapChart
Creating myConfigMapChart
[root@Kubernetes charts]# cd myConfigMapChart/templates/
[root@Kubernetes templates]# rm -rf ./*
[root@Kubernetes templates]# vim configmap.yaml
# 文件内容如下
apiVersion: v1
kind: ConfigMap
metadata:
name: my-cm-chart
data:
myValue: "Hello,World"
创建release实例:
[root@Kubernetes charts]# ls
mychart myConfigMapChart
[root@Kubernetes charts]# helm install mycm ./myConfigMapChart/
NAME: mycm
LAST DEPLOYED: Thu May 11 00:26:16 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
查看release实例:
[root@Kubernetes charts]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mycm default 1 2023-05-11 00:26:16.392817959 +0800 CST deployed myConfigMapChart-0.1.0 1.16.0
查看release的详细信息:
[root@Kubernetes charts]# helm get manifest mycm
---
# Source: myConfigMapChart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my-cm-chart
data:
myValue: "Hello,World"
删除release实例:
[root@Kubernetes charts]# helm uninstall mycm
release "mycm" uninstalled
[root@Kubernetes charts]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
案例2
需求
案例1只是简单的创建一个configmap实际和直接apply没啥区别,案例2将引入变量进行创建chart,把configmap的名称改为变量的方式进行创建。
创建实例
修改Chart:
[root@Kubernetes charts]# vim myConfigMapChart/templates/configmap.yaml
[root@Kubernetes charts]# cat myConfigMapChart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
# name: my-cm-chart
name: {{ .Release.Name }}-configmap
data:
# myValue: "Hello,World"
myValue: {{ .Values.MY_VALUE }}
[root@Kubernetes charts]# > myConfigMapChart/values.yaml
[root@Kubernetes charts]# vim myConfigMapChart/values.yaml
[root@Kubernetes charts]# cat !$
cat myConfigMapChart/values.yaml
MY_VALUE: "Hello,World"
创建实例:
[root@Kubernetes charts]# helm install mycm2 ./myConfigMapChart/
NAME: mycm2
LAST DEPLOYED: Thu May 11 00:49:06 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
查看实例:
[root@Kubernetes charts]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mycm2 default 1 2023-05-11 00:49:06.855993522 +0800 CST deployed myConfigMapChart-0.1.0 1.16.0
[root@Kubernetes charts]# kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 77d
mycm2-configmap 1 87s
YAML解释:
apiVersion: v1
kind: ConfigMap
metadata:
# name: my-cm-chart
name: {{ .Release.Name }}-configmap
data:
# myValue: "Hello,World"
myValue: {{ .Values.MY_VALUE }}
- {{ .Release.Name }}-configmap
最前面的.从作用域最顶层命名空间开始,即:在顶层命名空间中开始寻找Release对象,再查找Name对象。这个就是通过内置对象获取内置对象的变量值(Release的名称)作为拼接成ConfigMap的名字。 - {{ .Values.MY_VALUE }}
这个是其他变量会去values.yaml文件中寻找对应的变量
引用内置对象或其他变量的好处:
如果metadata.name中色湖之的值就是一个固定值,这样的模板是无法在k8s中多次部署的,所以我们可以试着在每次安装chart时,都自动metadata.name的设置为release的名称,因为每次部署release的时候实例名称是不一样的,这样部署的时候里面的资源名也就可以作为一个分区,而可以进行重复部署。
测试渲染
HELM提供了一个用来渲染模板的命令,该命令可以将模板内容渲染出来,但是不会进行任何安装的操作。可以用该命令来测试模板渲染的内容是否正确。语法如下:
helm install [release实例名] chart目录 --debug --dry-run
例:
[root@Kubernetes charts]# helm install mycm3 ./myConfigMapChart/ --debug --dry-run
install.go:200: [debug] Original chart version: ""
install.go:217: [debug] CHART PATH: /root/charts/myConfigMapChart
NAME: mycm3
LAST DEPLOYED: Thu May 11 01:03:15 2023
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
MY_VALUE: Hello,World
HOOKS:
MANIFEST:
---
# Source: myConfigMapChart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
# name: my-cm-chart
name: mycm3-configmap
data:
# myValue: "Hello,World"
myValue: Hello,World
[root@Kubernetes charts]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION