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.
Zunächst wird die ConfigMap mit zwei Literalwerten erstellt:
kubectl create configmap app-config --from-literal=APP_KEY=AppValue1 --from-literal=DB_KEY=DbValue2
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_KEYDiese 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.
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.
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.
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;
}
}
}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
}
}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-devPod-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-prodDie 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.