# Introduction to Helm


### Why Helm?

You have been writing `yaml` files for kubernetes (K8S) application deployment and it requires modification due to frequent changes in docker image, versions, configuration or environments. You also need to copy and paste to deliver your kubernetes application. It becomes difficult to manage it in source repository.

**Helm** solves the very same problem of packaging and customizing the kubernetes application deployment with templating and parameters.

### What is helm?

[Helm](https://helm.sh/) is package manager for kubernetes applications which helps to define, install and upgrade kubernetes applications and provides release lifecycle.

### Helm Concepts

Here is the helm components overview.
![HelmChart Concepts.drawio5.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1637929462077/UE2_yaTHC.png)

- `Chart` - chart is collection of  template `yaml` files with parameters to be injected with values
- `Template` - set of kubernetes yaml files using *Go* templates
- `Release` - deployed helm chart in kubernetes cluster is called helm release
- `Values` - parameter values to be applied to chart 
- `Repository` - hosted `index.yaml` containing references to chart packages (.tgz) in helm repository

### Install Helm
You can install helm with `brew`. For other environments, [refer documentation](https://helm.sh/#Homebrew) 
```
brew install helm
```
### Using Helm repository

Before you start with `helm`, you need to have kubernetes cluster access. You can verify cluster access with `kubectl get namespace` to check if it lists namespaces available

Following are the steps to install `postgresql` chart from  [bitnami helm repository](https://artifacthub.io/packages/helm/bitnami/postgresql)  to kubernetes cluster
```bash
# add helm repo 
helm repo add bitnami https://charts.bitnami.com/bitnami

# search charts in repo(s) with search string
helm search repo postgresql     

# install postgresql chart
helm install mypgsql bitnami/postgresql

# check the installed helm charts in the kubernetes cluster
helm list

# Uninstall the helm release `mypgsql`
helm uninstall mypgsql
```

### Helm chart structure

Let's understand the directory structure of sample `myapp`. Refer below GitHub source code for more details.

%[https://github.com/sachinb4u/helm-chart-demos/tree/main/charts/myapp]

```bash
# create sample helm chart
helm create myapp

# directory structure
myapp
├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml
```
- `Chart.yaml` - contains information of app version, chart version, maintainer and chart dependencies
- `charts` - contains dependent charts called *subcharts* which can have own templates and values
- `templates` - directory has template yaml files and template files starting with `_`.
- `NOTES.txt` - contains help information to be displayed to user when chart is installed  / upgraded in kubernetes cluster
- `_helpers.tpl` - contains helper templates variables which can be used in yaml files. Files starting `_` are not rendered as kubernetes manifests
- `tests` - folder contains predefined tests to be executed to validate chart works properly.
- `values.yaml` - contains default values which can be overidden by parent chart's `values.yaml` or by user supplied `values.yaml` or by `--set` parameters  

###  Summary
Helm is package manager for kubernetes applications which get packaged as `helm chart` and can be deployed to almost any kubernetes cluster. Helm chart contains the template kubernetes yaml manifests which can rendered with parameters from `values.yaml`

> **Thanks for reading the article. If you find it helpful, please like and do share your feedback, it would encourage me to write more such articles**.

In the next article, we will see how we can write a helm chart for spring boot application.

%[https://tech.sachinbhosale.com/how-to-write-helm-chart-for-an-application]





