DEV Community

Cover image for Environment Variables in Kubernetes: A Simplified Guide
Avesh
Avesh

Posted on

Environment Variables in Kubernetes: A Simplified Guide

Introduction

Environment variables play a critical role in configuring and managing applications, especially in containerized environments like Kubernetes. They provide a flexible, secure, and centralized way to configure application behavior without hardcoding values. In this article, we'll explore the basics of environment variables, how to use them in Kubernetes, and dive into hands-on examples to get you started.


Section 1: Understanding Environment Variables

What Are Environment Variables?

Environment variables are key-value pairs used by applications to access configuration settings during runtime. Instead of embedding sensitive or dynamic configurations in the application code, developers use environment variables to decouple configuration from the application logic.

Advantages of Using Environment Variables:

  • Dynamic Configuration: Change behavior without altering the codebase.
  • Enhanced Security: Store sensitive data securely.
  • Portability: Use the same application image across environments with different configurations.

Kubernetes and Environment Variables

In Kubernetes, environment variables are used to configure Pods, enabling applications to inherit settings dynamically during deployment.


Section 2: Ways to Define Environment Variables in Kubernetes

1. Static Environment Variables in Pod Specs

Static variables are directly defined in a Pod or Deployment YAML file.

Example YAML:

apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 2 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app-container image: my-app-image:latest env: - name: MY_ENV_VAR value: "my-static-value" 
Enter fullscreen mode Exit fullscreen mode

2. Using ConfigMaps for Non-Sensitive Data

ConfigMaps store configuration data and can be referenced in your deployment.

ConfigMap Example:

apiVersion: v1 kind: ConfigMap metadata: name: my-config data: MY_ENV_VAR: "my-value" 
Enter fullscreen mode Exit fullscreen mode

Deployment Example:

apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: template: spec: containers: - name: my-app-container image: my-app-image:latest env: - name: MY_ENV_VAR valueFrom: configMapKeyRef: name: my-config key: MY_ENV_VAR 
Enter fullscreen mode Exit fullscreen mode

3. Using Secrets for Sensitive Data

Secrets securely store sensitive information, like API keys and passwords.

Secret Example:

apiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque data: MY_SECRET_VAR: bXktc2VjcmV0LXZhbHVl # Base64 encoded  
Enter fullscreen mode Exit fullscreen mode

Deployment Example:

apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: template: spec: containers: - name: my-app-container image: my-app-image:latest env: - name: MY_SECRET_VAR valueFrom: secretKeyRef: name: my-secret key: MY_SECRET_VAR 
Enter fullscreen mode Exit fullscreen mode

Section 3: Accessing Environment Variables in Your Application

Applications access environment variables via system APIs. Here are examples in popular programming languages:

Node.js Example:

const envVar = process.env.MY_ENV_VAR; console.log(`Environment Variable: ${envVar}`); 
Enter fullscreen mode Exit fullscreen mode

Python Example:

import os env_var = os.getenv('MY_ENV_VAR') print(f"Environment Variable: {env_var}") 
Enter fullscreen mode Exit fullscreen mode

Java Example:

String envVar = System.getenv("MY_ENV_VAR"); System.out.println("Environment Variable: " + envVar); 
Enter fullscreen mode Exit fullscreen mode

Section 4: Best Practices for Using Environment Variables

  1. Use Secrets for sensitive data.
  2. Store non-sensitive configurations in ConfigMaps.
  3. Avoid hardcoding values into your application code.
  4. Use meaningful and descriptive variable names.
  5. Document all required environment variables for your project.

Section 5: Hands-On Example

Step 1: Create a Simple Node.js Application

// app.js  const express = require('express'); const app = express(); const port = 3000; app.get('/', (req, res) => { res.send(`Environment Variable: ${process.env.MY_ENV_VAR}`); }); app.listen(port, () => console.log(`App running on port ${port}`)); 
Enter fullscreen mode Exit fullscreen mode

Step 2: Build a Docker Image

docker build -t my-app-image . 
Enter fullscreen mode Exit fullscreen mode

Step 3: Deploy to Kubernetes

  • Create a ConfigMap and Deployment YAML files.
  • Apply them using:
kubectl apply -f configmap.yaml kubectl apply -f deployment.yaml 
Enter fullscreen mode Exit fullscreen mode

Step 4: Verify

  • Forward the port:
kubectl port-forward <pod-name> 3000:3000 
Enter fullscreen mode Exit fullscreen mode
  • Access the app:
curl http://localhost:3000 
Enter fullscreen mode Exit fullscreen mode

Section 6: Troubleshooting Common Issues

  1. Check Variable Availability:
kubectl exec -it <pod-name> -- printenv 
Enter fullscreen mode Exit fullscreen mode
  1. Debug Misconfigurations: Ensure the ConfigMap or Secret references in your YAML are correct.

Conclusion

Environment variables are a powerful way to manage application configurations in Kubernetes. By following best practices and leveraging tools like ConfigMaps and Secrets, you can ensure your applications are secure, flexible, and maintainable.

For more details, explore the Kubernetes documentation or experiment with advanced tools like Helm and Kustomize to streamline your deployments further.

Top comments (0)