Helm
Overview
Helm is a package manager for Kubernetes, providing a simple and efficient way to manage Kubernetes applications. It allows users to define, install, and upgrade even the most complex Kubernetes applications. Helm uses a packaging format called charts, which are collections of files that describe a related set of Kubernetes resources.
Prerequisites
Before installing Helm, ensure you have the following:
- Kubernetes cluster (v1.16+)
kubectlinstalled and configured- Helm client (v3+)
Installation
Install Helm on Windows
Download Helm:
choco install kubernetes-helmVerify the Installation:
helm version
Install Helm on macOS
Download Helm using Homebrew:
brew install helmVerify the Installation:
helm version
Install Helm on Linux
Download the Helm binary through the distro’s package manager
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null sudo apt-get install apt-transport-https --yes echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list sudo apt-get update sudo apt-get install helm
Note
Alternatively download it from GitHub https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
Verify the Installation:
helm version
Using Helm
Adding a Repository
Add the Stable Helm Repository:
helm repo add stable https://charts.helm.sh/stableUpdate Your Repository:
helm repo update
Searching for Charts
Search for a Chart:
helm search repo <chart-name>
Installing a Chart
Install a Chart:
helm install <release-name> <chart-name>Example:
helm install my-release stable/mysql
Upgrading a Release
Upgrade a Release:
helm upgrade <release-name> <chart-name>Example:
helm upgrade my-release stable/mysql
Rolling back a Release
Rolling back a Release:
helm rollback <release-name> <revision>Example:
helm rollback my-release 2
Uninstalling a Release
Uninstall a Release:
helm uninstall <release-name>Example:
helm uninstall my-release
Listing Releases
List All Releases:
helm list
Interacting with Helm
Helm Commands
Install a Chart:
helm install <release-name> <chart-name> --values <values.yaml>Get Release Information:
helm status <release-name>Rollback a Release:
helm rollback <release-name> <revision>Show the Values File for a Chart:
helm show values <chart-name>
Helm Configuration
Override Default Values: You can create a
values.yamlfile to override default values:replicaCount: 2 image: repository: myrepo/myimage tag: latestInstall with Custom Values:
helm install <release-name> <chart-name> -f <path-to-values-file>
Working with Helm Hooks
Helm hooks allow you to intervene at certain points in a release lifecycle, such as before installing or after upgrading. For more details, refer to the Helm Hooks documentation.
Troubleshooting
Common Issues
Failed to install chart: Ensure the chart name and repository are correct and updated:
helm repo update helm search repo <chart-name>Release is in a failed state: Check the release status and logs for more information:
helm status <release-name> kubectl logs <pod-name>
Debugging Tips
Verbose Output: Use the
--debugflag with Helm commands to get detailed output:helm install <release-name> <chart-name> --debug
Writing Helm charts
Writing Helm charts involves creating a directory structure with the necessary files to define the Kubernetes resources. For more information on how the directory structure should look like, refer to the Helm Chart documentation.
We recommend initializing a new charts using the helm create command:
helm create my-awesome-chartThis command creates a new directory called my-awesome-chart with the following structure:
my-awesome-chart/
├── Chart.yaml
├── charts/
├── templates/
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ └── <resources>.yaml
├── values.yaml
├── .helmignore
├── .gitignore
├── README.md
└── LICENSEThe best practice for writing Helm charts is to follow the Helm Best Practices. Kubernetes resources should be in separate .yaml files, but logical bundling of resources is welcome: Eg: All services in one file, all deployments in another file ,etc. Resources must be split by the --- delimiter.
.
Handling CustomResourceDefinitions (CRDs)
For handling CustomResourceDefinitions (CRDs), there are two common approaches.
We recommend the first approach:
The first one is using a separate chart to manage them from the Helm Best Practices documentation. This approach has more overhead (installing 2 charts instead of 1), but gives more clarity and control over the CRDs installation and upgrade cycle.
The second one is to package the CRDs with the main chart. This approach is simpler and more straightforward, but it can lead to issues when upgrading the CRDs. For more information, refer to the Let Helm do it for you section (caveats explained).
Chart.yaml file
The Chart.yaml file contains metadata about the chart, such as the name, version, and description. A full example can be found here.
Many fields of the Chart.yaml file are optional, but our recommendation is to fill in at least the following optional fields:
kubeVersion: The Kubernetes version the chart is compatible with. Having this field helps users understand which Kubernetes versions the chart supports.description: A short description of the chart. This field helps users understand what the chart does.type: See Chart Types for more information.homeandsources: URLs to the project home and source code, respectively. These fields help users find more information about the chart.dependencies: A list of charts this chart depends on. This field helps users understand what other charts are required to use this chart.appVersion: The version of the app that this chart installs. This field tells us which version of the application the chart installs by default, if not specified in thevalues.yamlfile.
Naming of Resources
Our recommendation for naming of resources in Helm charts is the following:
metadata.name: The name of the resource should be the same as the release name. This ensures that the resource name is unique and easy to identify.
In case of multiple of the same resource, a postfix should be added to the resource name. Eg: if you have multiple services, the name should be {{ .Release.Name }}-{{ .Values.serviceName }}. Eg: my-awesome-chart-api, my-awesome-chart-frontend.
Additional Labels & Annotations
Adding labels should be done through the values.yaml file. This allows users to add more labels as needed. For example:
additionalLabels:
company: my-awesome-company
additionalLabel: additionalValueIncluding these labels in the resources is done by using the {{ .Values.labels }} template. For example:
metadata:
labels:
{{- include "my-awesome-chart.labels" . | nindent 4 }} # Include labels from helpers.tpl
{{- toYaml .Values.additionalLabels | nindent 4 }} # Include additional labels from values.yamlThe same approach can be used for annotations.
Giving Options
Helm charts should be written in an environment agnostic way (To allow deployment on different cloud providers, on-prem, etc.). It is recommended to provide options in the values.yaml file and using Flow Control in the resources themselves. For example, exposing your application through a LoadBalancer service in a cloud provider, but using a NodePort service in an on-prem environment.
service:
type: LoadBalancer # NodePort, LoadBalancer...
port: 80
targetPort: 80
nodePort: nullapiVersion: v1
kind: Service
metadata:
name: {{ include "my-awesome-chart.fullname" . }}
...
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: {{ .Values.service.targetPort }}
{{- if and (eq .Values.service.type "NodePort") (ne .Values.service.nodePort null) }}
nodePort: {{ .Values.service.nodePort }}
{{- end }}
protocol: TCP
...Using helpers.tpl
helpers.tpl is a file that contains defined templates that are globally accessible in your chart. Our general recommendation is to not put too much logic in the helpers.tpl file, as it can make the chart harder to understand. Instead, the already generated templates in the helpers.tpl file should be used as much as possible.
Using NOTES.txt
We reccomend using the NOTES.txt file to provide information to the user after the chart is installed. This file should contain information about how to access the application, how to configure it, etc. A good example is auto-generated when using helm create.
NOTES.txt file is optional, but it is a good practice to include it in your chart.
Conclusion
Helm simplifies managing Kubernetes applications by providing powerful commands and an easy-to-use interface. By following this guide, you should be able to install, use, create Helm charts and interact with Helm efficiently. For more information and advanced usage, refer to the official Helm documentation.