ConfigMap

A ConfigMap in Kubernetes is an API object used to store non-confidential configuration data in key-value pairs, so you can separate configuration from application code.

It allows you to dynamically configure your applications without rebuilding container images.


⚙️ Definition

A ConfigMap provides a way to inject configuration data into Pods — such as environment variables, command-line arguments, or configuration files.

ConfigMaps are ideal for settings, not secrets. (Sensitive data → use a Secret instead.)


🧩 Why Use a ConfigMap

  • Keeps your app code independent of environment-specific settings.
  • Allows configuration changes without modifying or redeploying container images.
  • Makes your system portable across environments (dev, test, prod).

🧾 Example 1: Simple Key-Value ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_MODE: "production"
  APP_PORT: "8080"
  LOG_LEVEL: "info"

You can create this from a file or literal values using kubectl:

kubectl create configmap app-config --from-literal=APP_MODE=production --from-literal=APP_PORT=8080

🧾 Example 2: File-Based ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config-files
data:
  config.json: |
    {
      "debug": false,
      "maxConnections": 100
    }
  app.properties: |
    message=Welcome to Kubernetes

This allows you to mount configuration files directly inside your Pods.


🧰 Using a ConfigMap in a Pod

1. As Environment Variables

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
    - name: myapp
      image: nginx
      envFrom:
        - configMapRef:
            name: app-config

Result:
Inside the container:

$ echo $APP_MODE
production

2. As Individual Environment Variables

env:
  - name: LOG_LEVEL
    valueFrom:
      configMapKeyRef:
        name: app-config
        key: LOG_LEVEL

3. As Mounted Files

apiVersion: v1
kind: Pod
metadata:
  name: configmap-volume-pod
spec:
  containers:
    - name: myapp
      image: busybox
      command: ["cat", "/etc/config/app.properties"]
      volumeMounts:
        - name: config-volume
          mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: app-config-files

Result:
Files from the ConfigMap (config.json, app.properties) appear under /etc/config.


🔄 Updating a ConfigMap

  • If you update a ConfigMap, Pods won’t automatically reload the new values.
  • You need to restart the Pods (or use a sidecar/reloader pattern) to apply the new config.

🧠 Best Practices

PracticeDescription
Keep secrets outDon’t store passwords or tokens — use Secrets.
Use labelsHelps organize ConfigMaps for different apps/environments.
Small ConfigMapsAvoid large files or binary data.
Version your ConfigMapsUse naming conventions (e.g., app-config-v2).
Automate reloadUse tools like Reloader, Stakater, or custom scripts.

📊 ConfigMap vs Secret

FeatureConfigMapSecret
PurposeNon-sensitive config dataSensitive data (passwords, tokens)
StoragePlain textBase64-encoded
EncryptionNone by defaultSupported via encryption at rest
Typical UseApp settings, URLs, portsAPI keys, credentials

🚀 Common Use Cases

  • Environment-specific app settings (MODE=dev, API_URL=https://api.example.com)
  • Configuration files (application.properties, .env, JSON, YAML)
  • Command-line arguments or script parameters

Leave a Reply