Cloud Native 9 min read

Mastering Multi‑Environment Helm Deployments: One Build, Multiple Environments

This guide explains how to design Helm charts for environment‑agnostic deployment, manage multiple values files, use Helmfile or GitOps, secure secrets, version charts, integrate CI/CD, and apply best‑practice hooks and observability for robust multi‑environment Kubernetes releases.

Ray's Galactic Tech
Ray's Galactic Tech
Ray's Galactic Tech
Mastering Multi‑Environment Helm Deployments: One Build, Multiple Environments

Core Philosophy: One Build, Multiple Deployments

Helm’s key idea is that a chart should be environment‑agnostic while values.yaml files capture environment‑specific differences. By maintaining a single chart and swapping values files you can deploy the same application to dev, staging, and prod.

1. Designing Configurable Helm Charts

Use values.yaml to drive environment differences such as image tags, replica counts, resource limits, service type, ingress domain, ConfigMap and Secret data.

Template references in manifests, e.g.:

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

2. Multi‑Environment Configuration Strategies

Strategy A – Multiple values files (most common)

Directory layout:

my-app-chart/
├── values.yaml          # default (dev)
├── values-staging.yaml  # staging
└── values-prod.yaml     # production

Deploy with:

helm upgrade --install my-app ./my-app-chart -f values-staging.yaml
helm upgrade --install my-app ./my-app-chart -f values-prod.yaml -n production

Strategy B – Helmfile (advanced)

Helmfile centralises releases and environments:

environments:
  staging:
    values:
      - environments/staging.yaml
  prod:
    values:
      - environments/prod.yaml

releases:
  - name: my-app
    namespace: "{{ .Environment.Name }}"
    chart: ./my-app-chart
    values:
      - "{{ .Environment.Values | get \"values-file\" }}"
    secrets:
      - "env/{{ .Environment.Name }}/secrets.yaml.gpg"

Strategy C – GitOps (ArgoCD / FluxCD)

Typical repo layout:

apps/my-app/
├── base/values.yaml
├── staging/values.yaml
└── prod/values.yaml

ArgoCD applications point to the appropriate values file and sync automatically.

3. Sensitive Information Management

Never store passwords or API keys in plain text in Git.

Recommended approaches:

Helm Secrets with sops or vals External Secrets Operator (pulls from Vault, AWS Secrets Manager, etc.)

Inject secrets via CI/CD using --set flags.

helm upgrade --install my-app ./my-app-chart \
  -f values-prod.yaml \
  --set database.password=$PROD_DB_PASSWORD

4. Version Control and Release Process

Use semantic versioning in Chart.yaml.

Store charts in a repository (ChartMuseum, Harbor, OCI Registry).

Pin image tags (prefer :git-commit-hash over :latest).

helm package my-app-chart
helm push my-app-chart-1.2.3.tgz my-chart-repo
helm upgrade --install my-app my-chart-repo/my-app-chart \
  --version 1.2.3 -f values-prod.yaml

5. Helm Hooks for Lifecycle Management

Useful for database migrations, backups, etc.

apiVersion: batch/v1
kind: Job
metadata:
  name: "{{ .Release.Name }}-db-migrate"
  annotations:
    "helm.sh/hook": pre-upgrade,pre-install
spec:
  template:
    spec:
      containers:
      - name: migrate
        image: my-migration-image

6. Namespace Isolation

Separate namespace per environment (e.g., myapp-dev, myapp-staging, myapp-prod).

RBAC to restrict access (dev read‑only, prod full control).

Use ResourceQuota and LimitRange to control resource consumption.

7. Values File Organization Tips

Layered values: values-common.yaml for shared config plus values-{env}.yaml for overrides.

helm upgrade --install my-app ./my-app-chart \
  -f values-prod.yaml \
  --set database.password=$PROD_DB_PASSWORD

Dynamic injection via CI/CD --set for image tags, etc.

Reuse YAML snippets with the tpl function.

8. CI/CD Integration Best Practices

Lint: helm lint ./my-app-chart Dry‑run: helm install --dry-run … Diff checks: helm diff or helmfile diff Rollback: helm rollback my-app <REVISION> and

helm history my-app

9. Combining Helm with Kustomize

Helm renders base YAML.

Kustomize applies overlays (e.g., domain changes, ingress tweaks).

Ideal for GitOps where ArgoCD natively supports both.

10. Observability and Operations Integration

Optional ServiceMonitor (Prometheus CRD).

Auto‑mount GrafanaDashboard.

Enable/disable tracing or logging sidecars per environment.

11. Multi‑Tenant Chart Repository Layout

company-charts/
├── base/      # common middleware
├── apps/      # business applications
└── infra/     # infrastructure (ingress, logging, cert‑manager)

12. Common Pitfalls and Safeguards

Misspelled values silently ignored – use values.schema.json for validation.

Avoid :latest tags – they break rollbacks.

ConfigMap/Secret updates may not trigger pod restarts – add checksum annotations:

annotations:
  checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}

13. End‑to‑End Workflow Example (Helmfile + CI/CD)

Developer pushes code → CI builds image my-app:abc123.

Update values-staging.yaml and open a PR.

CI deploys to staging:

helmfile -e staging diff
helmfile -e staging sync

After tests pass, trigger production pipeline:

helmfile -e prod diff
helmfile -e prod sync

Conclusion

Keep charts environment‑agnostic; manage differences with values files.

Helmfile or GitOps improves maintainability and traceability.

Secure secret handling is mandatory.

Versioned charts and repository storage guarantee consistency.

Integrate CI/CD and observability for a complete end‑to‑end workflow.

By following these practices you can build a secure, robust, and scalable multi‑environment Helm deployment system.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

GitOps
Ray's Galactic Tech
Written by

Ray's Galactic Tech

Practice together, never alone. We cover programming languages, development tools, learning methods, and pitfall notes. We simplify complex topics, guiding you from beginner to advanced. Weekly practical content—let's grow together!

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.