45 Integration von ConfigMaps in einen Pod

ConfigMaps können zur Setzung von Umgebungsvariablen in Pods genutzt werden. Der folgende Prozess beschreibt das Erstellen einer ConfigMap und deren Einbindung in einen Pod.

45.1 Erstellung der ConfigMap

Zunächst wird die ConfigMap mit zwei Literalwerten erstellt:

kubectl create configmap app-config --from-literal=APP_KEY=AppValue1 --from-literal=DB_KEY=DbValue2

45.2 Anwendung der ConfigMap in einem Pod

Die zuvor erstellte ConfigMap app-config kann nun in einem Pod verwendet werden, um Umgebungsvariablen zu definieren. Hierfür wird die Konfigurationsdatei des Pods wie folgt definiert:

apiVersion: v1
kind: Pod
metadata:
  name: app-config-demo
spec:
  containers:
    - name: app-container
      image: alpine
      command: ["sleep", "3600"]
      env:
        - name: APP_ENV
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: APP_KEY
        - name: DB_ENV
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: DB_KEY

Diese Definition erstellt einen Pod namens app-config-demo mit einem Container, der auf dem alpine Image basiert. Der Container führt den Befehl sleep für 3600 Sekunden aus. Zwei Umgebungsvariablen APP_ENV und DB_ENV werden über die configMapKeyRef aus der app-config ConfigMap gesetzt.

45.3 Überprüfung der Umgebungsvariablen im Pod

Nach dem Starten des Pods können die gesetzten Umgebungsvariablen mit folgendem Befehl überprüft werden:

kubectl exec app-config-demo -- env | grep APP_ENV
kubectl exec app-config-demo -- env | grep DB_ENV

Diese Befehle führen env im Pod app-config-demo aus und filtern die Ausgabe mit grep nach den gesuchten Umgebungsvariablen, um zu bestätigen, dass sie wie erwartet aus der ConfigMap übernommen wurden.

45.4 Beispiel: Nginx-Konfiguration mit ConfigMaps für Dev und Prod

Für den Betrieb eines Nginx-Servers in einer Entwicklungsumgebung (Dev) und einer Produktionsumgebung (Prod) mit unterschiedlichen Konfigurationen, können zwei separate ConfigMaps erstellt und in den entsprechenden Pods verwendet werden.

45.4.1 ConfigMap für Dev

Erstellung der ConfigMap für die Entwicklungs-Umgebung mit einer spezifischen Nginx-Konfigurationsdatei:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config-dev
data:
  nginx.conf: |
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    events {
      worker_connections 1024;
    }
    http {
      include /etc/nginx/mime.types;
      default_type application/octet-stream;
      log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
      access_log /var/log/nginx/access.log main;
      sendfile on;
      keepalive_timeout 65;
      server {
        listen 80;
        server_name localhost;
        location / {
          root /usr/share/nginx/html;
          index index.html index.htm;
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
          root /usr/share/nginx/html;
        }
      }
    }

45.4.2 ConfigMap für Prod

Erstellung der ConfigMap für die Produktions-Umgebung mit strengeren Performance-Parametern:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config-prod
data:
  nginx.conf: |
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log warn;
    pid /run/nginx.pid;
    events {
      worker_connections 4096;
      multi_accept on;
      use epoll;
    }
    http {
      include /etc/nginx/mime.types;
      default_type application/octet-stream;
      log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
      access_log /var/log/nginx/access.log main;
      sendfile on;
      tcp_nopush on;
      tcp_nodelay on;
      keepalive_timeout 15;
      server_tokens off;
      server {
        listen 80;
        server_name _;
        location / {
          root /usr/share/nginx/html;
          index index.html index.htm;
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
          root /usr/share/nginx/html;
        }
        # Weitere Produktions-spezifische Konfigurationen
      }
    }

45.4.3 Pod Definition für Dev

Pod-Definition, die die ConfigMap nginx-config-dev für den Nginx-Server verwendet:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-dev
spec:
  containers:
  - name: nginx
    image: nginx:latest
    volumeMounts:
    - name: config-volume
      mountPath: /etc/nginx/nginx.conf
      subPath: nginx.conf
  volumes:
  - name: config-volume
    configMap:
      name: nginx-config-dev

45.4.4 Pod Definition für Prod

Pod-Definition, die die ConfigMap nginx-config-prod für den Nginx-Server verwendet:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-prod
spec:
  containers:
  - name: nginx
    image: nginx:latest
    volumeMounts:
    - name: config-volume
      mountPath: /etc/nginx/nginx.conf
      subPath: nginx.conf
  volumes:
  - name: config-volume
    configMap:
      name: nginx-config-prod

Die subPath-Eigenschaft ermöglicht es, eine spezifische Datei innerhalb des Volumes zu mounten. Die Nginx-Pods in beiden Umgebungen werden mit ihrer spezifischen Konfiguration betrieben, die durch die jeweilige ConfigMap definiert wird. Änderungen an der Konfiguration können durch Ersetzen oder Aktualisieren der entsprechenden ConfigMap vorgenommen werden, ohne die Pod-Definition selbst ändern zu müssen.