Helm Chart Named Templates
In this tutorial, we are going to discuss helm chart named templates. As we discussed earlier, we used to keep the templates as a part of the templates folder, and most of the files within the templates folder are treated as Kubernetes manifest. And that is one exception where I can have notes.txt, and I can have other files as well, which will start with an underscore (_).
If you remember earlier, when we are creating the charts, by default, it was making some sample files; it had underscore (_).
E.g: _helpers.tpl
ashok@waytoeasylearn:~/mychart/templates$ ls
NOTES.txt _helpers.tpl deployment.yaml hpa.yaml ingress.yaml service.yaml serviceaccount.yaml tests
I can have multiple templates in the same file, and I can give a name to it and use it elsewhere; that’s what we will learn in this particular tutorial.
So I can define a template and give a name to it, and include this particular template in other locations as well. This will help us to leverage the reusability. Let us understand by doing some examples.
Example
Let me open the template file. Here, I’m going to delete all the labels and include that as a predefined template, and I can have the templates as a separate file with an underscore as a prefix, or I can include it in the same file.
In this tutorial, we will discuss on templates include them in the same file.
So to start with, I’m going to include it in the same file. Here I’m going to have a template where I’m going to define the name of the template as mychart.systemlabels, and it supports the syntax of using the namespaces.
This works very similar to the include or import that we use in the other programming languages.
ashok@waytoeasylearn:~$ cat mychart/templates/configmap.yaml
{{- define "mychart.systemlables" }}
labels:
name: Ashok Kumar
place: Hyderabad
website: www.waytoeasylearn.com
{{- end }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
{{- template "mychart.systemlables" }}
data:
myvalue: "Sample Config Map"
message: {{ .Values.message }}
website: {{ upper .Values.website }}
ownerName: {{ quote .Values.owner.name }}
ownerPlace: {{ quote .Values.owner.place }}
Now, let me do the dry run.
ashok@waytoeasylearn:~$ helm install --debug --dry-run mytemplate ./mychart/
install.go:173: [debug] Original chart version: ""
install.go:190: [debug] CHART PATH: /home/ashok/mychart
NAME: mytemplate
LAST DEPLOYED: Sat May 22 12:56:22 2021
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
- LangUsed:
- Python
- Ruby
- Java
- Scala
message: Welcome to waytoeasylearn
owner:
name: Ashok Kumar
place: Hyderabad
qualification: mca
tags:
bigdata: hadoop
deployment: helm
devops: kubernetes
programming: java
website: www.waytoeasylearn.com
HOOKS:
MANIFEST:
Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: looping-configmap
labels:
name: Ashok Kumar
place: Hyderabad
website: www.waytoeasylearn.com
data:
myvalue: "Sample Config Map"
message: Welcome to waytoeasylearn
website: WWW.WAYTOEASYLEARN.COM
ownerName: "Ashok Kumar"
ownerPlace: "Hyderabad"
So what happened? It automatically included the labels, and it’s not listing the actual template that we had defined within the manifest file.
Suppose you observe one thing very carefully. Let me get into the configuration file. This is having proper alignment. And wherever I’m going to include this particular alignment will not be considered when I’m using the keyword template.
There is another option using include that we will be seeing later.
importance of indentation
And this particular include is not going to consider this particular space. I can go ahead and delete them as well. Let me delete them (spaces in front of {{- template “mychart.systemlables” }} ).
ashok@waytoeasylearn:~$ cat mychart/templates/configmap.yaml
{{- define "mychart.systemlables" }}
labels:
name: AshokKumar
place: Hyderabad
website: www.waytoeasylearn.com
{{- end }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
{{- template "mychart.systemlables" }}
data:
myvalue: "Sample Config Map"
message: {{ .Values.message }}
website: {{ upper .Values.website }}
ownerName: {{ quote .Values.owner.name }}
ownerPlace: {{ quote .Values.owner.place }}
Now, let me do the dry run.
ashok@waytoeasylearn:~$ helm install --debug --dry-run mytemplate ./mychart/
install.go:173: [debug] Original chart version: ""
install.go:190: [debug] CHART PATH: /home/ashok/mychart
NAME: mytemplate
LAST DEPLOYED: Sat May 22 12:56:22 2021
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
- LangUsed:
- Python
- Ruby
- Java
- Scala
message: Welcome to waytoeasylearn
owner:
name: Ashok Kumar
place: Hyderabad
qualification: mca
tags:
bigdata: hadoop
deployment: helm
devops: kubernetes
programming: java
website: www.waytoeasylearn.com
HOOKS:
MANIFEST:
Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: looping-configmap
labels:
name: AshokKumar
place: Hyderabad
website: www.waytoeasylearn.com
data:
myvalue: "Sample Config Map"
message: Welcome to waytoeasylearn
website: WWW.WAYTOEASYLEARN.COM
ownerName: "Ashok Kumar"
ownerPlace: "Hyderabad"
This is also producing the same result. So within the template, the important thing to remember is the space or indentation. Within the inner template and not in the place where we will include the template using that template keyword.
I am concentrating on the indentation; while doing the template programming for the YAML file, the indentation is where most of the mistakes used to happen.
Summary
So in a quick summary, we have seen how to create a template and include that within another template.
In the next section, we will discuss how to have this particular template in a separate file and include it within another template file.