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.
A 3 master nodes and 5 worker nodes cluster as explained at ../cluster-install#multi-master-multi-node-multi-az-gossip-based-cluster is used for this chapter.
All configuration files for this chapter are in the helm
directory.
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.