Helm is a tool for managing Kubernetes charts. A chart is a collection of files that describe a related set of Kubernetes resources. Read more details in Charts introduction.
This chapter uses a cluster with 3 master nodes and 5 worker nodes as described here: multi-master, multi-node gossip based cluster.
All configuration files for this chapter are in the helm
directory. Make sure you change to that directory before giving any commands in this chapter.
There are two parts to Helm: The Helm client (helm
) and the Helm server (tiller
).
Tiller runs inside of your Kubernetes cluster, and manages releases (installations) of your charts. Helm runs on your laptop, CI/CD, or wherever you want it to run.
This section shows how to install both the client and the server.
Install on Mac OSX:
brew install kubernetes-helm
Installing Helm provides complete set of options to install the client.
Helm server is also known as tiller
. By default, tiller is installed in the current kubectl
context. Check the current Kubernetes context:
$ kubectl config current-context cluster.kubernetes-aws.io
Install tiller
:
$ helm init
Creating /Users/argu/.helm
Creating /Users/argu/.helm/repository
Creating /Users/argu/.helm/repository/cache
Creating /Users/argu/.helm/repository/local
Creating /Users/argu/.helm/plugins
Creating /Users/argu/.helm/starters
Creating /Users/argu/.helm/cache/archive
Creating /Users/argu/.helm/repository/repositories.yaml
$HELM_HOME has been configured at /Users/argu/.helm.
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Happy Helming!
This will install tiller
in the kube-system
namespace. It can be installed into a specific cluster by using --kube-context
option. It can be installed into an alternative namespace by using --tiller-namespace
option.
Installing Tiller provides complete set of options to install the server.
A Helm chart can be installed using the helm install
command.
Before installing a chart, Helm allows you to find issues with your chart’s formatting or templates using the lint
command. Let’s run helm lint
on our sample application in the helm folder:
$ helm lint sample
==> Linting sample
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, no failures
It’s recommended to take a look at the generated manifests of a chart before installing it. This can be done using the --debug
and --dry-run
options.
helm install --dry-run --debug sample
It shows the output as:
[debug] Created tunnel using local port: '50827'
[debug] SERVER: "localhost:50827"
[debug] Original chart version: ""
[debug] CHART PATH: /Users/argu/workspaces/kubernetes-aws-workshop/helm/sample
NAME: eponymous-badger
REVISION: 1
RELEASED: Tue Oct 17 03:06:36 2017
CHART: sample-1.0.0
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
db:
database: employees
image: mysql:8
password: mysql
port: 3306
. . .
spec:
containers:
- name: webapp
image: arungupta/docker-javaee:dockerconeu17
ports:
- containerPort: 8080
Finally, install the chart:
helm install --name sample sample
This shows output:
NAME: sample
LAST DEPLOYED: Tue Oct 17 03:45:36 2017
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
db 100.68.180.123 <none> 3306/TCP 1s
webapp 100.70.164.191 <none> 8080/TCP 1s
==> v1beta1/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
mysql-deployment 1 1 1 0 1s
webapp-deployment 1 1 1 0 1s
Verify the deployment using kubectl
:
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
mysql-deployment 1 1 1 1 1m
webapp-deployment 1 1 1 1 1m
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
db ClusterIP 100.65.195.189 <none> 3306/TCP 1m
kubernetes ClusterIP 100.64.0.1 <none> 443/TCP 1h
webapp ClusterIP 100.71.21.2 <none> 8080/TCP 1m
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-deployment-1668503186-9h7lz 1/1 Running 0 1m
webapp-deployment-372583675-hlcbg 1/1 Running 0 1m
Start a proxy. Since the webapp service does not expose a public endpoint, proxy will allow you to access your service endpoint via the Kubernetes API:
kubectl proxy
Access the application using:
curl http://localhost:8001/api/v1/proxy/namespaces/default/services/webapp/resources/employees
This shows the output:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><collection><employee><id>1</id><name>Penny</name></employee><employee><id>2</id><name>Sheldon</name></employee><employee><id>3</id><name>Amy</name></employee><employee><id>4</id><name>Leonard</name></employee><employee><id>5</id><name>Bernadette</name></employee><employee><id>6</id><name>Raj</name></employee><employee><id>7</id><name>Howard</name></employee><employee><id>8</id><name>Priya</name></employee></collection>
A chart needs to be packaged before it can be shared with others.
It can be packaged using helm package
command. Package the chart as:
helm package sample
This creates sample-1.0.0.tgz
in your current directory.
This chart can now be shared with others using a chart repository server. The helm serve
command can be used to start a test chart repository server on your local machine that serves charts from a local directory.
For production, it’s recommended to setup a chart repository on AWS cloud.