Table of Contents
- Introduction to Kubernetes Configuration Management
- Core Kubernetes Configuration Resources
- Configuration Injection Patterns
- Advanced Configuration Management Tools
- Best Practices for Kubernetes Configuration Management
- Security Considerations
- Troubleshooting Common Configuration Issues
- Future Trends
- Conclusion
- References
Introduction to Kubernetes Configuration Management
What is Configuration Management in Kubernetes?
Configuration management in Kubernetes refers to the process of defining, storing, versioning, and distributing the non-code settings required for applications and infrastructure to run. This includes environment variables (e.g., LOG_LEVEL=info), database URIs, API keys, TLS certificates, and feature flags.
Why It Matters: Key Drivers
- Consistency: Ensure applications behave uniformly across development, staging, and production.
- Scalability: Manage configurations for hundreds of microservices without manual intervention.
- Compliance: Track and audit configuration changes to meet regulatory requirements (e.g., GDPR, HIPAA).
- Resilience: Avoid outages caused by misconfigurations or missing secrets.
Core Kubernetes Configuration Resources
Kubernetes provides native resources to manage configuration. Let’s explore the two foundational ones: ConfigMaps and Secrets.
ConfigMaps: Non-Secret Configuration
ConfigMaps store non-sensitive key-value data (e.g., app settings, feature flags) that can be injected into pods. They decouple configuration from application code, enabling dynamic updates without rebuilding containers.
Types of ConfigMaps
ConfigMaps can be created imperatively (via kubectl) or declaratively (via YAML/JSON). They support:
- Literals: Key-value pairs defined directly in the command or YAML.
- Files: Entire files (e.g.,
app.properties,nginx.conf) stored as keys. - Directories: Multiple files aggregated into a single ConfigMap.
Example: Declarative ConfigMap from a File
Create a app.properties file:
# app.properties
environment=production
log_level=info
max_connections=100
Define a ConfigMap to store this file:
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: default
data:
app.properties: |
environment=production
log_level=info
max_connections=100
Apply with:
kubectl apply -f configmap.yaml
Secrets: Sensitive Data Management
Secrets store sensitive data (e.g., passwords, API keys, TLS certificates) securely. Unlike ConfigMaps, Secrets are base64-encoded (not encrypted by default) and have stricter access controls.
Types of Secrets
Kubernetes supports several Secret types for common use cases:
- Opaque: Arbitrary key-value pairs (default).
- TLS: For TLS certificates and private keys (used with Ingress, Services).
- docker-registry: Credentials for pulling images from private registries.
- service-account-token: Automatically created for service accounts (used for API access).
Example: TLS Secret for Ingress
Create a TLS Secret from a certificate (tls.crt) and private key (tls.key):
kubectl create secret tls my-tls-secret \
--cert=tls.crt \
--key=tls.key \
--namespace=default
Use it in an Ingress resource:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
tls:
- hosts:
- example.com
secretName: my-tls-secret # Reference the TLS Secret
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
ConfigMaps vs. Secrets: When to Use Which
| ConfigMaps | Secrets |
|---|---|
For non-sensitive data (e.g., LOG_LEVEL). | For sensitive data (e.g., API keys, passwords). |
| Stored in plaintext in etcd. | Stored as base64-encoded (not encrypted by default). |
| No built-in access restrictions. | Restricted by default (only accessible to authorized pods). |
| Use when data can be publicly exposed. | Use when data must be kept confidential. |
Configuration Injection Patterns
Once ConfigMaps/Secrets are created, Kubernetes provides multiple ways to inject their data into pods.
Environment Variables
Inject ConfigMap/Secret data as environment variables for direct access by application code.
Example: Inject ConfigMap as Env Vars
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app-container
image: my-app:latest
env:
- name: ENVIRONMENT # Env var name in the pod
valueFrom:
configMapKeyRef:
name: app-config # Name of the ConfigMap
key: environment # Key in the ConfigMap
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: log_level
Mounted Volumes
Mount ConfigMaps/Secrets as files in a pod’s filesystem. Ideal for large config files (e.g., nginx.conf) or dynamic updates (changes to the ConfigMap/Secret propagate to the pod).
Example: Mount ConfigMap as a Volume
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app-container
image: my-app:latest
volumeMounts:
- name: config-volume # Name of the volume to mount
mountPath: /etc/config # Path in the container
readOnly: true # Prevent accidental modification
volumes:
- name: config-volume # Define the volume
configMap:
name: app-config # Reference the ConfigMap
Inside the pod, /etc/config/app.properties will contain the ConfigMap data.
Command-Line Arguments
Pass ConfigMap/Secret values as command-line arguments using args in the pod spec.
spec:
containers:
- name: app-container
image: my-app:latest
args: ["--env=$(ENVIRONMENT)", "--log-level=$(LOG_LEVEL)"] # Reference env vars
env:
- name: ENVIRONMENT
valueFrom:
configMapKeyRef:
name: app-config
key: environment
SubPath for Partial Configs
Use subPath to mount a specific key from a ConfigMap/Secret instead of the entire resource, avoiding overwriting existing files in the mount path.
volumeMounts:
- name: config-volume
mountPath: /etc/config/app.properties # Mount only this file
subPath: app.properties # Key in the ConfigMap
readOnly: true
Advanced Configuration Management Tools
For complex environments (e.g., multi-environment deployments, hundreds of microservices), native Kubernetes resources alone may not suffice. Below are tools to streamline configuration at scale.
Kustomize: Native Configuration Customization
Kustomize is a built-in (since Kubernetes 1.14) tool for customizing Kubernetes configurations without templating. It uses bases (shared configs) and overlays (environment-specific changes) to manage variants (e.g., dev, staging, prod).
Key Concepts:
- Base: A directory with common configurations (e.g.,
base/deployment.yaml). - Overlay: A directory with patches to modify the base for a specific environment (e.g.,
overlays/prod/increase-replicas.yaml). - Patches: JSON6902 or strategic merge patches to update resources.
Example Workflow:
-
Define a Base:
kustomize/ ├── base/ │ ├── deployment.yaml │ ├── service.yaml │ └── kustomization.yaml # Lists resources in the base -
Create Overlays for Dev/Prod:
kustomize/ └── overlays/ ├── dev/ │ ├── patch-replicas.yaml # Set replicas: 1 │ └── kustomization.yaml # References base + patch └── prod/ ├── patch-replicas.yaml # Set replicas: 3 └── kustomization.yaml -
Build and Apply:
kubectl apply -k kustomize/overlays/prod # Applies prod overlay
Helm: The Package Manager for Kubernetes
Helm simplifies deploying and managing Kubernetes applications using Charts (packages of pre-configured resources) and values files (environment-specific configurations).
Key Concepts:
- Chart: A directory with templates (Go-based), values files, and metadata (e.g.,
myapp-chart/). - Values File:
values.yamldefines default configurations; override with--setor--values. - Release: An instance of a chart deployed to a cluster.
Example: Deploy a Helm Chart
-
Create a Chart:
helm create myapp-chart -
Customize
values.yaml:# values.yaml replicaCount: 2 image: repository: my-app tag: "1.0.0" config: environment: production -
Deploy with Overrides:
helm install myapp ./myapp-chart --set replicaCount=3 # Override replica count
Pros: Simplifies packaging; large community charts. Cons: Templating can become complex; stateful releases may drift.
GitOps: Declarative Configuration with Git
GitOps treats Git as the single source of truth for Kubernetes configurations. Tools like ArgoCD and Flux sync cluster state with Git, ensuring configurations are always declarative, versioned, and auditable.
How It Works:
- Store all configurations (deployments, ConfigMaps, Secrets) in a Git repo.
- ArgoCD/Flux watches the repo and syncs changes to the cluster automatically.
- Drift is detected and corrected (e.g., if someone manually modifies a resource, ArgoCD reverts it to match Git).
Example with ArgoCD:
- Git Repo Structure:
my-gitops-repo/ ├── dev/ │ ├── deployment.yaml │ └── configmap.yaml └── prod/ ├── deployment.yaml └── secret.yaml (encrypted with Sealed Secrets) - ArgoCD Application: Defines which Git path to sync and target cluster namespace.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app-prod
spec:
project: default
source:
repoURL: https://github.com/your-org/my-gitops-repo.git
targetRevision: HEAD
path: prod
destination:
server: https://kubernetes.default.svc
namespace: prod
syncPolicy:
automated:
prune: true # Delete resources not in Git
selfHeal: true # Revert manual changes
Best Practices for Kubernetes Configuration Management
- Separate Configs from Code: Store configurations in Git, not in application images.
- Version Control All Configs: Track changes with Git for auditability and rollbacks.
- Use Environment-Specific Overlays: With Kustomize or Helm, avoid duplicating base configurations.
- Validate Configs Before Deployment: Use tools like
kubeval(schema validation) orkube-linter(best practices checks).kubeval my-config.yaml # Validate against Kubernetes schemas - Automate Updates: Use GitOps tools (ArgoCD/Flux) to sync configs from Git to clusters.
- Manage Secrets Externally: Avoid storing Secrets in Git. Use tools like HashiCorp Vault, AWS Secrets Manager, or External Secrets Operator to inject secrets dynamically.
Security Considerations in Configuration Management
- Encrypt Secrets at Rest: Enable etcd encryption (Kubernetes 1.13+) to encrypt Secrets stored in etcd.
kube-apiserver --encryption-provider-config=encryption-config.yaml # Enable in API server - Avoid Hardcoded Secrets: Never commit Secrets to Git. Use
sealed-secrets(encrypts Secrets for Git storage) or external managers. - Least Privilege Access: Restrict ConfigMap/Secret access with RBAC:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default rules: - apiGroups: [""] resources: ["configmaps"] verbs: ["get", "list"] # Allow read-only access - Scan for Vulnerabilities: Use tools like
kube-hunterorTrivyto scan configs for misconfigurations (e.g., overly permissive volume mounts).
Troubleshooting Common Configuration Issues
-
ConfigMap/Secret Not Found:
- Verify the resource exists in the pod’s namespace:
kubectl get configmap app-config -n default. - Ensure the pod’s
configMapKeyRef/secretKeyRefmatches the resource name.
- Verify the resource exists in the pod’s namespace:
-
Mounted Volume Permissions:
- ConfigMaps/Secrets are mounted with
0644permissions by default. UsedefaultModeto override:volumes: - name: secret-volume secret: secretName: my-secret defaultMode: 0400 # Read-only for owner
- ConfigMaps/Secrets are mounted with
-
Configuration Drift:
- Use ArgoCD’s “Sync Status” to detect drift. Run
argocd app get my-appto see discrepancies.
- Use ArgoCD’s “Sync Status” to detect drift. Run
-
Environment Variable Injection Failures:
- Check pod events:
kubectl describe pod <pod-name>for errors likeInvalid environment variable name.
- Check pod events:
Future Trends in Kubernetes Configuration Management
- Declarative Everything: Kubernetes is moving toward fully declarative APIs (e.g., Kustomize as the standard for customization).
- AI/ML for Optimization: Tools like Datadog or Dynatrace are using ML to predict optimal configurations (e.g., resource limits) based on historical data.
- Enhanced Secret Management: SPIFFE/SPIRE (secure identity for workloads) will reduce reliance on static secrets by enabling mTLS-based authentication.
Conclusion
Kubernetes configuration management is the backbone of reliable, scalable, and secure deployments. From foundational resources like ConfigMaps and Secrets to advanced tools like Kustomize, Helm, and GitOps, the ecosystem offers solutions for every complexity level. By following best practices—separating configs from code, versioning in Git, and prioritizing security—teams can tame configuration chaos and focus on delivering value.
As Kubernetes evolves, the future will bring even more declarative, automated, and secure ways to manage configurations. Start small (adopt Kustomize for overlays, use GitOps for sync), iterate, and scale—your DevOps workflow will thank you.