Wednesday, April 14, 2021

Understanding of helm and its use case with demo.

Helm can be define as the Kubernetes package manager. It can be compared with yum ,apt, homebrew or npm for node. Having said this we mean that we can package all the yml files that is needed for make your environment or application ready for K8 in to one package and upload the same on the Helm hub as a private or public repository and then using the helm command we can deploy/install/update/delete etc on any machine. In addition to this helm also support templating using template engine means we can have one common values.yml files in which we can define values and this tag is used in all other yml files where it is referred. This way we achieve the centralization of configuration data. More over it also maintain the versioning of the files for easy rollback and updates. We will discuss it later on.

So as helm is K8 package manager it can be used to deploy/install/update/delete packages (collection of yml files) from helm repository. Lets take a use case. We have K8 cluster where in our application running in Docker container inside Pod of K8 cluster. Now a new requirement come where in we need to deploy another application lets say elastic search/stack database that will collect the logs of our application this can be done easily using helm.

without the helm for having persistent db application in k8 we will need stateful set, config files for configuration, secrets for storing the credentials, service to access the db, K8 user permission etc. We can do this by writing our own yml files individual, but that will be not a good option as it involve to execute them in sequence and then testing etc.

So the best option is someone take all the yml files and package them and store them in the hub so that next time whenever any user what to install or update the yml files it will be taken directly from the repository and that is call helm repository.

This bundle of yml files for elastic stake i.e. stateful set yml, config files yml , secrets yml, k8 user permission yml is called helm chart. We can create our own helm chart and push them to helm repository as private or public repo so that in near future developer can use it as as required.

hub URL :-
https://artifacthub.io/

So in short we can use helm chart i.e. collection of yml files to do some routine work like db or persistent in stallion or update in K8 for elastic stake, mysql, mongodb, monitoring application like prometheus, graphana etc using helm repo.

As stated above helm also support tempate engine. let’s say in your K8 cluster you have many microservices that have same yml file except its docker image name different and its version different. Without helm, you would need to create a seperate yml file for all the microservice. But in our case using helm we can have one common value.yml files that contain configuration values and this values can be used in individual microservice yml files as a template i.e. we will use now template microservice yml files as shown below.

Microservice.yml files:-

apiVersion: apps/v1
kind: Pod
metadata:
name: {{ values.fullname }}
spec:
replicas: {{ .Values.replicaCount }}
spec:
containers:
– name: {{ .Values.containers.Name }}
image: {{ .Values.containers.image }}
port: {{ .Values.containers.port }}

Values.yaml :-

name: my-siddhu-app
container:
name: my-siddhu-tomcat-container
image: tomcat
port: 8080

Please note we also use the helm command line option –set flag to set the runtime template value to our application yaml files.

So now instead of having many application specific yaml files we can have one templating files which can take runtime value from the template values.yaml files, and we are good for install/deploy/delete or CI/CD pipeline. Additional we can use the same package to do this deployment in different K8 cluster environment at one go. i.e. lets say we have dev, stage and prod env. We can create a chart for all i.e collection of yaml files including values.yaml and then package them in dev, stage and prod chart and upload them on repo and when required we can use the helm command to install/update them on the respective K8 cluster environment by downloading the chart from the repo.

Now lets look at the helm chart structure

When ever you download the helm char from the repo you will get structure somewhat similar to given belwo

myChartName/
Chart.yaml
values.yaml
charts/
template/

In above we have myChartName, charts/template as an folder and we have files like Chart.yaml and values.yaml.

Lets try to understand the use of all these

myChartName/ :- this the folder which contains the name of chart. This name is used for installation/update/download etc from helm hub. This is the unique name for your chart.
Chart.yaml :- this file contains some information like chart version, name , its dependencies i.e. in short it contains meta data for the chart.
Values.yaml :- this files contains configuration template values that can be used in the template application specific yaml files. This is default values and we can override it later.
charts/ :- this folder contains dependencies that myChartName has. i.e. if we create a chart that is used to deploy elastic stake but in depth it depends on some XYZ chart used to install addition package such as transection,persistant etc.
template/ :- this is the folder that contains all the template files that used to install/update the application in K8 cluster using yaml. It will contain the values that is configured in values/yaml files.

So for installation we use command like

helm install myChartName

Now also try to understand that we can change the default values from the values.yaml files using below command

1- We can use the whole new values.yaml files at runtime from command line. We can also add new values if required. This new values will be merged to the application specific yaml files.

helm install –values=myNewValues.yaml myChartName

2- we can use the –set flag at run time to override the values from values.yaml.

helm install –set=port:8081 myChartName

Other most important aspect of Helm is release management.

If we see the architecture of helm before version 3 we have two component.
1- helm client :- reside on the client side
2- tiller :- reside on the server i.e. on the k8 cluster environment

Lets try to understand what is helm client. It is CLI or we can say binary for window and packages i.e. *.sh for other O/S with help of which we can run command on the client machine i.e. command like fetch, search, install package and then send the yaml file to the tiller to do all the things that are necessary i.e. creating the components. Its helm client responsibilities to create yml files using template and give the final yaml files to tiller for execution. In addition, tiller also maintain the sequence of the things you are doing on the server so if one goes wrong you can immediately rollback to the old version without any issues.

But this has some issues like tiller has given the max power on the K8 env. It can install, delete and update the pod its self and for this security reason in helm 3 we will not get tiller part when we deploy it on the environment. We only get helm binary. Agreed that this will lower the use case of helm for release management but still for security it has to be implemented and tiller part is removed from the helm.

Now lets try to install helm in windows
url to install helm on windows.

https://helm.sh/docs/intro/install/

using chocolatey

https://chocolatey.org/packages/kubernetes-helm

https://chocolatey.org/

or you can download the helm for directly from here.

https://github.com/helm/helm/releases/tag/v3.5.3

Once downloaded the package keep the helm in path so that we can use it directly on cmd prompt. confirm helm is installed in windows using below commands.

C:\Users\Siddhartha>helm version
version.BuildInfo{Version:”v3.5.3″, GitCommit:”041ce5a2c17a58be0fcd5f5e16fb3e7e95fea622″, GitTreeState:”dirty”, GoVersion:”go1.15.8″}

‘- Helm command that used maximum in development and its uses. for that first we need to Install helm.
1- Install package/charts
2- update package/charts
3- delete package/charts
4- Search package/charts :- helm search
4- Create our own repository and create a new package and update on the helm repository

No comments: