Streamlining Kubernetes Deployment with Helm

Scenario: A developer, named Alex, is working on a complex microservices application using Kubernetes. Alex has been manually deploying each microservice using kubectl and configuring various Kubernetes resources. However, as the number of microservices grows, the deployment process becomes increasingly time-consuming and error-prone. To simplify the deployment process, Alex decides to learn about Helm, a popular package manager for Kubernetes.

Helm is an open-source tool that allows you to easily install, upgrade, and manage Kubernetes applications. Helm packages, called charts, contain all the necessary Kubernetes resource files, dependencies, and configuration options for a specific application.

In this example, we will walk through the process of using Helm to deploy a simple microservice application called “example-microservice.” We will create a Helm chart for this application and use it to deploy and manage the application on a local Kubernetes cluster.

  1. Prerequisites:
  • Familiarity with Kubernetes and its concepts
  • A running Kubernetes cluster
  • Helm installed on your local machine
  1. Creating the Helm Chart:

a. Initialize a new Helm chart:

helm init --repo-url https://charts.helm.sh/stable/
cd example-microservice
helm create .

b. Create a values.yaml file to store configuration options:

replicaCount: 3
image:
repository: example-microservice
tag: v1.0.0
service:
type: ClusterIP
port: 80

c. Create a Dockerfile to build the microservice Docker image:

FROM golang:1.16 AS build
WORKDIR /go/src/github.com/example/example-microservice
COPY . .
RUN go build -o example-microservice
FROM alpine:latest
WORKDIR /app
COPY --from=build /go/src/github.com/example/example-microservice/example-microservice /app/
CMD ["/app/example-microservice"]

d. Create a Chart.yaml file to describe the chart:

apiVersion: v2
name: example-microservice
description: A Helm chart for deploying the example-microservice application
version: 0.1.0

e. Create a templates directory and add the necessary Kubernetes resource files:

mkdir templates
touch templates/deployment.yaml templates/service.yaml
  1. Configuring the Helm Chart:

a. Configure the deployment.yaml file:

apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Values.image.repository }}
template:
metadata:
labels:
app: {{ .Values.image.repository }}
spec:
containers:
- name: {{ .Values.image.repository }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: {{ .Values.service.port }}
---

b. Configure the service.yaml file:

apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}
spec:
selector:
app: {{ .Values.image.repository }}
ports:
- port: {{ .Values.service.port }}
targetPort: {{ .Values.service.port }}
type: {{ .Values.service.type }}
---
  1. Building and Installing the Helm Chart:

a. Build the Docker image:

docker build -t example-microservice .

b. Push the Docker image to a registry:

docker push example-microservice:v1.0.0

c. Build the Helm chart:

helm package .

d. Install the Helm chart:

helm install example-microservice ./example-microservice-0.1.0.tgz
  1. Verifying the Deployment:

a. Check the status of the deployment:

helm status example-microservice

b. Check the logs of the deployed microservice:

kubectl logs example-microservice-<REPLICA_NAME>

Tests:

To verify the deployment, you can write tests using various testing frameworks like Go’s testing package, Ginkgo, or Gomock. These tests can cover various aspects of the Helm chart, such as:

  • Testing the correctness of the generated Kubernetes resources
  • Testing the behavior of the application when deployed using the Helm chart
  • Testing the upgrade and rollback functionality of Helm
  • Testing the Helm chart’s compatibility with different Kubernetes versions and configurations

These tests can be run locally using your preferred testing framework and can be integrated into your continuous integration/continuous delivery pipeline to ensure the stability and reliability of your Helm chart.