DEV Community

Aisalkyn Aidarova
Aisalkyn Aidarova

Posted on

Multi-Environment Microservice Platform using Helm

Hands-On Lab: Helm from Zero to Production

Image

Image

Image

Image


🎯 Lab Objectives

By the end of this lab, you will:

  • Create a Helm chart from scratch
  • Understand every Helm component
  • Deploy an app using Helm
  • Override values per environment
  • Perform upgrade and rollback
  • Troubleshoot Helm like a DevOps engineer

🧰 Prerequisites

You need:

  • Kubernetes cluster (Minikube / KIND / EKS)
  • kubectl
  • Helm v3+

Verify:

kubectl get nodes
helm version
Enter fullscreen mode Exit fullscreen mode

🧠 Lab Architecture (What We Build)

We will deploy a Python Flask app using Helm.

Components:

  • Deployment
  • Service
  • Configurable replicas
  • Configurable image
  • Helm release management

1️⃣ Install Helm (if not installed)

brew install helm
Enter fullscreen mode Exit fullscreen mode

Verify:

helm version
Enter fullscreen mode Exit fullscreen mode

2️⃣ Create a New Helm Chart

helm create flask-app
Enter fullscreen mode Exit fullscreen mode

This generates:

flask-app/
β”œβ”€β”€ Chart.yaml
β”œβ”€β”€ values.yaml
β”œβ”€β”€ templates/
β”‚   β”œβ”€β”€ deployment.yaml
β”‚   β”œβ”€β”€ service.yaml
β”‚   β”œβ”€β”€ ingress.yaml
β”‚   β”œβ”€β”€ hpa.yaml
β”‚   β”œβ”€β”€ serviceaccount.yaml
β”‚   └── _helpers.tpl
Enter fullscreen mode Exit fullscreen mode

3️⃣ Clean the Chart (DevOps Best Practice)

Delete what we don’t need for this lab:

rm -rf flask-app/templates/ingress.yaml
rm -rf flask-app/templates/hpa.yaml
rm -rf flask-app/templates/serviceaccount.yaml
rm -rf flask-app/templates/tests
Enter fullscreen mode Exit fullscreen mode

4️⃣ Understand Chart.yaml

Open:

flask-app/Chart.yaml
Enter fullscreen mode Exit fullscreen mode

Example:

apiVersion: v2
name: flask-app
description: Helm chart for Flask application
type: application
version: 0.1.0
appVersion: "1.0"
Enter fullscreen mode Exit fullscreen mode

πŸ”‘ DevOps knowledge

  • version β†’ chart version
  • appVersion β†’ app version

5️⃣ Configure values.yaml

Edit:

replicaCount: 2

image:
  repository: aisalkyn85/python-todo
  tag: v1
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 5000
Enter fullscreen mode Exit fullscreen mode

This is where DevOps config lives, not YAML templates.


6️⃣ Understand Helm Templates (Critical)

Open:

templates/deployment.yaml
Enter fullscreen mode Exit fullscreen mode

Key lines:

replicas: {{ .Values.replicaCount }}

image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ Helm renders this before applying to Kubernetes.


7️⃣ Dry Run (MOST IMPORTANT STEP)

helm install flask ./flask-app --dry-run --debug
Enter fullscreen mode Exit fullscreen mode

You should see:

  • Fully rendered Kubernetes YAML
  • No resources created

πŸ”₯ This is how DevOps prevents outages


8️⃣ Install the Application

helm install flask ./flask-app
Enter fullscreen mode Exit fullscreen mode

Verify:

helm list
kubectl get pods
kubectl get svc
Enter fullscreen mode Exit fullscreen mode

9️⃣ Access the Application

Port-forward:

kubectl port-forward svc/flask-app 5000:5000
Enter fullscreen mode Exit fullscreen mode

Open browser:

http://localhost:5000
Enter fullscreen mode Exit fullscreen mode

πŸ”Ÿ Override Values (Production Pattern)

Create:

values-prod.yaml
Enter fullscreen mode Exit fullscreen mode
replicaCount: 4
image:
  tag: v2
Enter fullscreen mode Exit fullscreen mode

Upgrade:

helm upgrade flask ./flask-app -f values-prod.yaml
Enter fullscreen mode Exit fullscreen mode

Verify:

kubectl get pods
Enter fullscreen mode Exit fullscreen mode

Pods increase β†’ zero downtime


1️⃣1️⃣ Helm Release Management

View release status:

helm status flask
Enter fullscreen mode Exit fullscreen mode

View history:

helm history flask
Enter fullscreen mode Exit fullscreen mode

1️⃣2️⃣ Break It on Purpose (Rollback Lab)

Simulate bad image:

image:
  tag: does-not-exist
Enter fullscreen mode Exit fullscreen mode

Upgrade:

helm upgrade flask ./flask-app -f values-prod.yaml
Enter fullscreen mode Exit fullscreen mode

Pods fail.


1️⃣3️⃣ Rollback (WHY HELM EXISTS)

helm rollback flask 1
Enter fullscreen mode Exit fullscreen mode

Pods recover instantly.

πŸ’‘ This is the #1 reason Helm is used in production


1️⃣4️⃣ Troubleshooting Like a DevOps Engineer

Helm-level debugging

helm get values flask
helm get manifest flask
helm lint ./flask-app
Enter fullscreen mode Exit fullscreen mode

Kubernetes-level debugging

kubectl describe pod
kubectl logs pod
kubectl get events
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ Helm installs β€” Kubernetes runs.


1️⃣5️⃣ Uninstall Cleanly

helm uninstall flask
Enter fullscreen mode Exit fullscreen mode

Everything removed:

  • Deployments
  • Services
  • Release metadata

🧠 What You Just Learned (Critical)

You learned:

  • Helm chart structure
  • values.yaml vs templates
  • Install / upgrade / rollback
  • Dry-run debugging
  • Real DevOps workflow

πŸ§‘β€πŸ’» WHO uses this in real life?

  • DevOps Engineers
  • Platform Teams
  • SREs

Used for:

  • Applications
  • Monitoring stacks
  • Databases
  • GitOps pipelines

Production-Grade Microservice Platform with Helm

Image

Image

Image

Image

This project demonstrates that you understand:

  • Helm beyond helm install
  • Environment separation (dev / stage / prod)
  • ConfigMaps & Secrets via Helm
  • Ingress + Services
  • Rolling upgrades & rollback
  • Helm troubleshooting
  • How DevOps actually deploy apps

This is exactly what companies expect.


πŸ—οΈ Architecture Overview

Application Stack

                    🌐 Ingress
                        |
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              |                   |
         frontend (React)     backend (Flask API)
                                      |
                                  PostgreSQL
Enter fullscreen mode Exit fullscreen mode

All components are deployed using Helm.


πŸ“ Repository Structure (VERY IMPORTANT)

This structure alone is interview-level.

helm-microservice-platform/
β”œβ”€β”€ charts/
β”‚   β”œβ”€β”€ frontend/
β”‚   β”‚   β”œβ”€β”€ Chart.yaml
β”‚   β”‚   β”œβ”€β”€ values.yaml
β”‚   β”‚   └── templates/
β”‚   β”‚       β”œβ”€β”€ deployment.yaml
β”‚   β”‚       β”œβ”€β”€ service.yaml
β”‚   β”‚       └── ingress.yaml
β”‚   β”œβ”€β”€ backend/
β”‚   β”‚   β”œβ”€β”€ Chart.yaml
β”‚   β”‚   β”œβ”€β”€ values.yaml
β”‚   β”‚   └── templates/
β”‚   β”‚       β”œβ”€β”€ deployment.yaml
β”‚   β”‚       β”œβ”€β”€ service.yaml
β”‚   β”‚       β”œβ”€β”€ configmap.yaml
β”‚   β”‚       └── secret.yaml
β”‚   └── database/
β”‚       β”œβ”€β”€ Chart.yaml
β”‚       β”œβ”€β”€ values.yaml
β”‚       └── templates/
β”‚           β”œβ”€β”€ statefulset.yaml
β”‚           β”œβ”€β”€ service.yaml
β”‚           └── pvc.yaml
β”œβ”€β”€ environments/
β”‚   β”œβ”€β”€ dev/
β”‚   β”‚   β”œβ”€β”€ frontend-values.yaml
β”‚   β”‚   β”œβ”€β”€ backend-values.yaml
β”‚   β”‚   └── db-values.yaml
β”‚   β”œβ”€β”€ prod/
β”‚   β”‚   β”œβ”€β”€ frontend-values.yaml
β”‚   β”‚   β”œβ”€β”€ backend-values.yaml
β”‚   β”‚   └── db-values.yaml
└── README.md
Enter fullscreen mode Exit fullscreen mode

πŸ”‘ Core DevOps Concepts Demonstrated

1️⃣ Helm as an Application Manager

  • Each service = separate chart
  • Independent upgrades
  • Independent rollbacks

2️⃣ Environment Separation (CRITICAL)

Example:

helm upgrade --install backend charts/backend \
  -f environments/prod/backend-values.yaml
Enter fullscreen mode Exit fullscreen mode

Same chart β†’ different behavior β†’ no duplication


3️⃣ ConfigMaps via Helm (Backend)

apiVersion: v1
kind: ConfigMap
metadata:
  name: backend-config
data:
  DB_HOST: {{ .Values.database.host }}
  DB_PORT: "{{ .Values.database.port }}"
Enter fullscreen mode Exit fullscreen mode

Injected into pods:

envFrom:
- configMapRef:
    name: backend-config
Enter fullscreen mode Exit fullscreen mode

4️⃣ Secrets via Helm (Safe Handling)

apiVersion: v1
kind: Secret
metadata:
  name: backend-secret
type: Opaque
stringData:
  DB_PASSWORD: {{ .Values.database.password }}
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ Explain in interviews:

Helm renders secrets but Kubernetes encrypts them at rest.


5️⃣ Stateful Database via Helm

Database chart uses:

  • StatefulSet
  • PVC
  • Headless Service

This proves you understand:

  • Stateful workloads
  • Storage
  • Helm + databases

6️⃣ Ingress Controlled by Helm

hosts:
  - host: app.prod.example.com
    paths:
      - /
Enter fullscreen mode Exit fullscreen mode

Ingress is:

  • Environment-specific
  • Configurable
  • Versioned

πŸ”„ Deployment Workflow (REAL LIFE)

Initial install (dev)

helm install frontend charts/frontend -f environments/dev/frontend-values.yaml
helm install backend charts/backend -f environments/dev/backend-values.yaml
helm install db charts/database -f environments/dev/db-values.yaml
Enter fullscreen mode Exit fullscreen mode

Upgrade backend only

helm upgrade backend charts/backend -f environments/prod/backend-values.yaml
Enter fullscreen mode Exit fullscreen mode

Rollback broken release

helm rollback backend 2
Enter fullscreen mode Exit fullscreen mode

πŸ”₯ This is production-grade behavior


πŸ§ͺ Failure & Troubleshooting Scenarios (INTERVIEW GOLD)

Scenario 1: Bad image pushed

  • Pods CrashLoopBackOff
  • Helm upgrade fails
  • Rollback restores service instantly

Explain:

Helm protects Kubernetes deployments from bad releases.


Scenario 2: Wrong env variable

helm get manifest backend
kubectl describe pod
Enter fullscreen mode Exit fullscreen mode

Explain:

Always inspect rendered YAML, not templates.


Scenario 3: DB not reachable

  • Check ConfigMap
  • Check Service DNS
  • Check StatefulSet ordering

🧠 What Interviewers LOVE About This Project

You can confidently say:

β€œI built a multi-service Helm platform with environment separation, database state management, Ingress routing, configuration via values files, and rollback-safe deployments.”

That sentence alone is senior-level.


🧩 Optional Advanced Add-Ons (Next Level)

You can extend this project with:

  • Helm + Argo CD
  • Helm hooks (pre-install DB migration)
  • Helm tests
  • External Secrets (AWS Secrets Manager)
  • CI/CD pipeline deploying Helm
  • Helm chart versioning strategy

πŸ“š Why This Project Is β€œBetter”

Toy Helm Lab This Project
Single chart Multi-chart platform
No envs Dev / Prod separation
No secrets Secure config
No DB Stateful workloads
No rollback Real failure handling
Demo-only Resume-ready

Top comments (0)