以下操作,均原取自HELM官网,由个人进行实操。
Helm | 子chart和全局值与子chart和全局值进行交互https://helm.sh/zh/docs/chart_template_guide/subcharts_and_globals/
操作前准备:
1. 有一台云服务器(已配置成为master结点),确保集群所有pod正常运行。
2. 已安装下载HELM。
3. 已创建了一个chart(本文命名同官网,名mychart), 并且删除templates文件夹下的所有。
# 本文把chart安装在根目录下的testchart目录下
[root@k8s-master ~]# cd /testchart
[root@k8s-master testchart]# ls
mychart
[root@k8s-master testchart]# cd mychart
[root@k8s-master mychart]# ls
charts Chart.yaml templates values.yaml
4. 已在values.yaml文件中插入:
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
本节介绍操作的是子chart:
① 独立;② 无法访问父chart值;③父chart可覆盖子chart;④helm有一全局值使所有chart均可访问。
一 创建子chart(独立性)
到mychart下面的charts目录下创建。
[root@k8s-master mychart]# cd charts
[root@k8s-master charts]# helm create mysubchart # 创建子chart
Creating mysubchart
[root@k8s-master charts]# ls
mysubchart
[root@k8s-master charts]# cd mysubchart
[root@k8s-master mysubchart]# ls
charts Chart.yaml templates values.yaml
[root@k8s-master mysubchart]# rm -rf templates/* # 强制删除templates目录下所有文件
把该subchart的values.yaml文件加上:
dessert: cake
其templates/configmap.yaml创建并加入:
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-cfgmap2
data:
dessert: {
{ .Values.dessert }}
命令:
[root@k8s-master mysubchart]# vim values.yaml
[root@k8s-master mysubchart]# vim templates/configmap.yaml
[root@k8s-master testchart]# helm install --generate-name --dry-run --debug mychart/charts/mysubchart
# 可以把--generate-name代替成自命名,--dry-run --debug是测试启动helm的参数,并不真正启动
结果
独立性体现在可以只依靠自己单独运行。
二 父chart覆盖
Actually,mychart is the father of mysubchart, so mychart can push the configuration to mysubchart.
helm install --dry-run -debug mychart --generate-name
After insert mychart/values.yaml:
mysubchart:
dessert: ice cream
The result is:
重要细节:不会改变mychart/charts/mysubchart/templates/configmap.yaml
模板到 .Values.mysubchart.dessert
的指向。也就是说模板渲染的过程中,模板指向是不变的,只是在模板引擎传递值的过程中,发送了变化。
三 全局Chart值
Values.global
,可以用来设置全局值,参考官网,我们可以在mychart/values.yaml加:
global:
salad: caesar
那么这时候这个global内的部分将能被所有的chart访问到。
mychart/templates/configmap.yaml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
data:
{
{- $files := .Files }}
{
{- range tuple "config1.toml" "config2.toml" "config3.toml" }}
{
{ . }}: |-
{
{ $files.Get . }}
{
{- end }}
salad: {
{ .Values.global.salad }}
mychart/charts/
mysubchart/templates/configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-cfgmap2
data:
dessert: {
{ .Values.dessert }}
salad: {
{ .Values.global.salad }}
The result:
四 共享模板
这里将能体会到为什么_helper.tql的define命名建议把chart名写在命名前,这为共享提供了区分。(此部分官网是没有给具体的yaml事例的,但根据helm模板介绍,小做一下即可)
创建模板,mychart/templates/_helper.tql
{
{- define "mychart.app" -}}
app_name: {
{ .Chart.Name }}
app_version: "{
{ .Chart.Version }}"
{
{- end -}}
mychart/values.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-configmap
labels:
{
{- include "mychart.labels" . | indent 4 }}
data:
salad: {
{ .Values.global.salad }}
mychart/charts/mysubchart/values.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {
{ .Release.Name }}-cfgmap2
labels:
{
{- include "mychart.labels" . | indent 4 }}
data:
dessert: {
{ .Values.dessert }}
salad: {
{ .Values.global.salad }}
The result is: