Kubernetes ConfigMaps and Secrets

Learn about Kubernetes ConfigMaps and Secrets. Our guide offers insights, examples, and managing configuration and sensitive data in Kubernetes
E
Edtoks14:25 min read

ConfigMaps

What is a ConfigMap?

A ConfigMap is an API object used to store non-confidential data in key-value pairs. ConfigMaps are designed to decouple configuration artifacts from image content to keep containerized applications portable.

Why Do We Need ConfigMaps?

  • Separation of Concerns: ConfigMaps separate configuration settings from application code, making it easier to manage and maintain.

  • Dynamic Configuration: Configurations can be updated without redeploying the application, allowing for dynamic changes.

  • Reuse and Share Configuration: ConfigMaps can be reused across multiple Pods, providing a central place for configuration management.

ConfigMap Object

A ConfigMap object in Kubernetes can be created in several ways, including from literal key-value pairs, from files, or from directories.

Example: ConfigMap from Literal Values

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  app.properties: |
    key1=value1
    key2=value2
  log_level: DEBUG

Example: ConfigMap from Files

kubectl create configmap my-config --from-file=app.properties --from-literal=log_level=DEBUG

ConfigMaps and Pods

ConfigMaps can be consumed by Pods in two main ways: as environment variables or as volumes.

Using ConfigMaps as Environment Variables

You can inject ConfigMap data into Pod environment variables.

Example: Using ConfigMap as Environment Variables

apiVersion: v1
kind: Pod
metadata:
  name: configmap-env-pod
spec:
  containers:
  - name: myapp
    image: myapp:latest
    env:
    - name: LOG_LEVEL
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: log_level

Using ConfigMaps as Volumes

You can also mount ConfigMaps as volumes to provide configuration files to your applications.

Example: Using ConfigMap as Volume

apiVersion: v1
kind: Pod
metadata:
  name: configmap-volume-pod
spec:
  containers:
  - name: myapp
    image: myapp:latest
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: my-config

Secrets

What is a Secret?

A Secret is an object that contains a small amount of sensitive data such as a password, a token, or a key. Secrets can be used to securely store and manage sensitive information in your cluster.

Why Do We Need Secrets?

  • Security: Secrets help to avoid including sensitive data in application code or container images.

  • Centralized Management: Secrets provide a central place to manage sensitive data, ensuring consistent and secure handling.

  • Encryption: Secrets can be encrypted at rest and in transit to protect sensitive data.

Secret Object

Secrets can be created from literals, files, or can be defined directly in a YAML file.

Example: Secret from Literal Values

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: YWRtaW4=  # base64 encoded value of "admin"
  password: cGFzc3dvcmQ=  # base64 encoded value of "password"

You can create a Secret from literal values using kubectl:

kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=password

Copy code

Types of Secrets

Kubernetes supports several types of Secrets, including:

  • Opaque: Default type, used for arbitrary user-defined data.

  • kubernetes.io/service-account-token: Automatically created for each service account to grant access to the API.

  • kubernetes.io/dockerconfigjson: Used to store credentials for Docker registries.

  • kubernetes.io/tls: Used to store TLS certificates and keys.

Secrets and Pods

Secrets can be consumed by Pods in two main ways: as environment variables or as volumes.

Using Secrets as Environment Variables

You can inject Secret data into Pod environment variables.

Example: Using Secret as Environment Variables

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: myapp
    image: myapp:latest
    env:
    - name: USERNAME
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: username
    - name: PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: password

Using Secrets as Volumes

You can also mount Secrets as volumes to provide sensitive data to your applications.

Example: Using Secret as Volume

apiVersion: v1
kind: Pod
metadata:
  name: secret-volume-pod
spec:
  containers:
  - name: myapp
    image: myapp:latest
    volumeMounts:
    - name: secret-volume
      mountPath: /etc/secret
      readOnly: true
  volumes:
  - name: secret-volume
    secret:
      secretName: my-secret

Best Practices for ConfigMaps and Secrets

  1. Separate Configuration and Secrets: Use ConfigMaps for non-sensitive configuration data and Secrets for sensitive data.

  2. Encrypt Secrets: Ensure that Secrets are encrypted at rest and in transit.

  3. Use Role-Based Access Control (RBAC): Restrict access to ConfigMaps and Secrets using RBAC to minimize the risk of unauthorized access.

  4. Avoid Hardcoding: Do not hardcode sensitive information in application code or container images. Use ConfigMaps and Secrets to manage configuration and sensitive data.

  5. Rotate Secrets Regularly: Regularly rotate secrets to minimize the impact of a potential leak.

  6. Audit Access: Enable auditing to track access to ConfigMaps and Secrets for security monitoring and compliance.

  7. Use Meaningful Names: Use meaningful and descriptive names for ConfigMaps and Secrets to improve manageability.

  8. Limit Data in Secrets: Keep the data in Secrets as small as possible to reduce the risk and impact of exposure.

Kubectl ConfigMap Commands

Creating ConfigMaps

From Literal Values

kubectl create configmap <configmap-name> --from-literal=<key1>=<value1> --from-literal=<key2>=<value2>

Example:

kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2

From a File

kubectl create configmap <configmap-name> --from-file=<path-to-file>

Example:

kubectl create configmap my-config --from-file=app.properties

From a Directory

kubectl create configmap <configmap-name> --from-file=<path-to-directory>

Example:

kubectl create configmap my-config --from-file=/etc/config

Viewing ConfigMaps

List All ConfigMaps

kubectl get configmaps

Get Detailed Information About a Specific ConfigMap

kubectl describe configmap <configmap-name>

Example:

kubectl describe configmap my-config

Get the YAML or JSON Representation of a ConfigMap

kubectl get configmap <configmap-name> -o yaml kubectl get configmap <configmap-name> -o json

Example:

kubectl get configmap my-config -o yaml

Updating ConfigMaps

Edit an Existing ConfigMap

kubectl edit configmap <configmap-name>

This command opens the ConfigMap in the default editor, where you can make changes and save.

Example:

kubectl edit configmap my-config

Replace an Existing ConfigMap

kubectl replace -f <path-to-configmap-yaml>

Example:

kubectl replace -f my-config.yaml

Add Data to an Existing ConfigMap

kubectl create configmap <configmap-name> --from-literal=<key>=<value> --dry-run=client -o yaml | kubectl apply -f -

Example:

kubectl create configmap my-config --from-literal=key3=value3 --dry-run=client -o yaml | kubectl apply -f -

Deleting ConfigMaps

Delete a Specific ConfigMap

kubectl delete configmap <configmap-name>

Example:

kubectl delete configmap my-config

Delete Multiple ConfigMaps

kubectl delete configmap <configmap-name1> <configmap-name2>

Example:

kubectl delete configmap my-config my-other-config

Exporting ConfigMaps

Save a ConfigMap to a YAML File

kubectl get configmap <configmap-name> -o yaml > <filename>.yaml

Example:

kubectl get configmap my-config -o yaml > my-config.yaml

Copy code

Creating ConfigMaps from YAML Files

To create a ConfigMap from a YAML file:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  key1: value1
  key2: value2

Apply the file with:

kubectl apply -f <path-to-yaml-file>

Example:

kubectl apply -f my-config.yaml

These commands will help you manage ConfigMaps effectively in your Kubernetes environment, allowing you to create, view, update, and delete ConfigMaps as needed.

Kubectl Secrets Commands

Creating Secrets

From Literal Values

kubectl create secret generic <secret-name> --from-literal=<key1>=<alue1> --from-literal=<key2>=<value2>

Example:

kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=secret123

From a File

kubectl create secret generic <secret-name> --from-file=<path-to-file>

Example:

kubectl create secret generic my-secret --from-file=./username.txt --from-file=./password.txt

From a Directory

kubectl create secret generic <secret-name> --from-file=<path-to-directory>

Example:

kubectl create secret generic my-secret --from-file=./secrets-dir

Viewing Secrets

List All Secrets

kubectl get secrets

Get Detailed Information About a Specific Secret

kubectl describe secret <secret-name>

Example:

kubectl describe secret my-secret

Get the YAML or JSON Representation of a Secret

Note: The output will include the base64 encoded data.

kubectl get secret <secret-name> -o yaml kubectl get secret <secret-name> -o json

Example:

kubectl get secret my-secret -o yaml

Decoding Secret Values

To decode the base64 encoded values:

echo '<base64-encoded-value>' | base64 --decode

Example:

echo 'YWRtaW4=' | base64 --decode

Updating Secrets

Edit an Existing Secret

kubectl edit secret <secret-name>

Example:

kubectl edit secret my-secret

Replace an Existing Secret

kubectl replace -f <path-to-secret-yaml>

Example:

kubectl replace -f my-secret.yaml

Add Data to an Existing Secret

kubectl create secret generic <secret-name> --from-literal=<key>=<value> --dry-run=client -o yaml | kubectl apply -f -

Example:

kubectl create secret generic my-secret --from-literal=new-key=new-value --dry-run=client -o yaml | kubectl apply -f -

Deleting Secrets

Delete a Specific Secret

kubectl delete secret <secret-name>

Example:

kubectl delete secret my-secret

Delete Multiple Secrets

kubectl delete secret <secret-name1> <secret-name2>

Example:

kubectl delete secret my-secret another-secret

Exporting Secrets

Save a Secret to a YAML File

kubectl get secret <secret-name> -o yaml > <filename>.yaml

Example:

kubectl get secret my-secret -o yaml > my-secret.yaml

Creating Secrets from YAML Files

To create a Secret from a YAML file:

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: YWRtaW4=  # base64 encoded value of "admin"
  password: c2VjcmV0MTIz  # base64 encoded value of "secret123"

Apply the file with:

kubectl apply -f <path-to-yaml-file>

Example:

kubectl apply -f my-secret.yaml

Using Secrets with Pods

Injecting Secrets as Environment Variables

Example:

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: myapp
    image: myapp:latest
    env:
    - name: USERNAME
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: username
    - name: PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: password

Using Secrets as Volumes

Example:

apiVersion: v1
kind: Pod
metadata:
  name: secret-volume-pod
spec:
  containers:
  - name: myapp
    image: myapp:latest
    volumeMounts:
    - name: secret-volume
      mountPath: /etc/secret
      readOnly: true
  volumes:
  - name: secret-volume
    secret:
      secretName: my-secret

Best Practices

  • Use Encrypted Storage: Ensure that Secrets are encrypted at rest using a provider that supports this (e.g., Kubernetes secrets encryption feature).

  • Limit Secret Access: Use Role-Based Access Control (RBAC) to restrict access to Secrets.

  • Use Least Privilege: Only provide applications with the minimum Secrets necessary.

  • Avoid Secret Exposure: Do not log or expose Secrets in application logs or monitoring tools.

  • Regularly Rotate Secrets: Periodically rotate Secrets to mitigate the risk of compromise.

  • Use Network Policies: Combine Secrets with network policies to restrict access to applications that need them.

These kubectl commands and best practices will help you manage Secrets effectively in your Kubernetes environment, ensuring secure and efficient handling of sensitive data.

Conclusion

Kubernetes ConfigMaps and Secrets provide powerful mechanisms for managing configuration and sensitive data within your cluster. By leveraging these resources effectively, you can decouple configuration from application code, enhance security, and improve the manageability of your applications.

Understanding how to use ConfigMaps and Secrets as environment variables or mounted volumes, and following best practices for their management, will help you build secure, scalable, and maintainable applications on Kubernetes.

Let's keep in touch!

Subscribe to keep up with latest updates. We promise not to spam you.