Skip to content

Latest commit

 

History

History
 
 

hello-helm

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

Deploy the app with Helm

If you've worked your way through the hello-k8s example, you now know everything you need to know to deploy applications to Kubernetes clusters using declarative YAML manifests. But there's a lot of repetition in these files: for example, you've repeated the name demo, the label selector app: demo, and the port 8888 several times.

Shouldn't you be able to just specify those values once, and then reference them wherever they occur through the Kubernetes manifests?

For example, it would be great to be able to define variables called something like container.name and container.port, and then use them wherever they're needed in the YAML files. Then, if you needed to change the name of the app or the port number it listens on, you'd only have to change them in one place, and all the manifests would be updated automatically.

Fortunately, there's a tool for that, and in this example we'll show you a little of what it can do.

Helm: a Kubernetes package manager

One popular package manager for Kubernetes is called Helm, and it works just the way we've described. You can use the helm command-line tool to install and configure applications (your own or anyone else's), and you can create packages called Helm charts, which completely specify the resources needed to run the application, its dependencies, and its configurable settings.

Helm is part of the Cloud Native Computing Foundation family of projects, which reflects its stability and widespread adoption.

When you install a Helm chart, Kubernetes itself will locate and download the binary container image from the place you specified. In fact, a Helm chart is really just a convenient wrapper around Kubernetes YAML manifests.

Installing Helm

Follow the installation instructions at this site for your operating system:

https://docs.helm.sh/using_helm/#installing-helm

Once you have Helm installed, you will need to create some Kubernetes resources to authorize it for access to your cluster. There's a suitable YAML file in this example repo, named helm-auth.yaml. To apply it, run the following commands:

kubectl apply -f helm-auth.yaml
serviceaccount "tiller" created
clusterrolebinding.rbac.authorization.k8s.io "tiller" created

Now that the necessary permissions are in place, you can initialize Helm for access to the cluster, using this command:

helm init --service-account tiller
$HELM_HOME has been configured at /Users/john/.helm.

It may take five minutes or so for Helm to finish initializing itself. To verify that Helm is up and working, run:

helm version
Client: &version.Version{SemVer:"v2.9.1",
GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.9.1",
GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}

Once this command succeeds, you're ready to start using Helm. If you see an Error: cannot connect to Tiller message, wait a few minutes and try again.

Installing a Helm chart

What would the Helm chart for our demo application look like? In this directory, you'll see a k8s subdirectory, which in the previous example (hello-k8s) contained just the Kubernetes manifest files to deploy the application. Now it contains a Helm chart, in the demo directory:

ls k8s/demo
Chart.yaml             prod-values.yaml staging-values.yaml    templates
values.yaml

Let's use Helm to install the demo application. First, clean up the resources from any previous deployments:

kubectl delete all --selector app=demo

Then run the following command:

helm install --name demo ./k8s/demo
NAME:   demo
LAST DEPLOYED: Wed Jun  6 10:48:50 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Service
NAME              TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)   AGE
demo-service-dev  ClusterIP  10.98.231.112  <none>       9999/TCP  0s

==> v1/Deployment
NAME      DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
demo-dev  1        1        1           0          0s

==> v1/Pod(related)
NAME                       READY  STATUS             RESTARTS  AGE
demo-dev-6c96484c48-69vss  0/1    ContainerCreating  0         0s

You can see that Helm has created a Deployment resource (which starts a Pod) and a Service, just as in the previous example. The helm install does this by creating a Kubernetes object called a Helm release.

Now you can go on to the next section: Manage the app with Helmfile.

What's this?

This is a code example from the book 'Cloud Native DevOps with Kubernetes'. See the index for more examples.