2024-01-22
8 min read

How to Manage Multiple Environments in Kubernetes (Staging, QA, Production)

How to Manage Multiple Environments in Kubernetes (Staging, QA, Production)

Managing multiple environments is a common requirement for teams running applications on Kubernetes. Whether you're supporting development, QA, staging, or production, keeping these environments isolated and consistent helps you catch issues early and deploy with confidence. In this guide, you'll learn how to structure your Kubernetes setup to support multiple environments, avoid common pitfalls, and streamline your deployment process.

Prerequisites

You'll need:

  • Access to a Kubernetes cluster (or several clusters, if you separate environments physically)
  • kubectl installed and configured
  • Familiarity with basic Kubernetes concepts like namespaces, deployments, and config maps

Why Separate Environments?

Each environment serves a different purpose:

  • Development: For active coding and quick feedback
  • QA: For running automated and manual tests
  • Staging: For pre-production validation
  • Production: For live user traffic

Keeping these environments isolated prevents accidental changes from affecting production and makes troubleshooting easier.

Using Namespaces for Environment Isolation

Namespaces are a simple way to separate environments within the same cluster. Each environment gets its own namespace, so resources like services, secrets, and deployments don't overlap.

kubectl create namespace staging
kubectl create namespace qa
kubectl create namespace production

You can then deploy your application to each namespace:

kubectl apply -f app-deployment.yaml -n staging
kubectl apply -f app-deployment.yaml -n qa
kubectl apply -f app-deployment.yaml -n production

Managing Configuration per Environment

Configuration often varies between environments. Use ConfigMaps and Secrets to store environment-specific values. You can create separate YAML files or use tools like Kustomize or Helm to template your configs.

Example: Environment-specific ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: staging
  labels:
    environment: staging
data:
  DATABASE_URL: postgres://staging-db:5432/app

Repeat for each environment, changing the namespace and values as needed.

Deployment Workflows

Automate your deployments to each environment using CI/CD pipelines. For example, you might:

  • Deploy to development on every commit
  • Deploy to qa after tests pass
  • Deploy to staging for release candidate validation
  • Deploy to production after approval

This workflow helps catch issues early and keeps environments in sync.

When to Use Separate Clusters

For strict isolation, especially in regulated industries, you might use a separate Kubernetes cluster for each environment. This approach increases security and reduces the risk of cross-environment impact, but comes with higher operational overhead.

Tips for Managing Multiple Environments

  • Use clear naming conventions for namespaces and resources
  • Keep configuration DRY by using templating tools
  • Automate deployments to reduce manual errors
  • Regularly clean up unused resources in non-production environments

Next Steps

Explore tools like Kustomize, Helm, or ArgoCD to further streamline environment management. As your team grows, consider policies and access controls to keep your environments secure and maintainable.

Published: 2024-01-22|Last updated: 2024-01-22T09:00:00Z

Found an issue?