Einführung
Eine ConfigMap speichert nicht-sensible Konfigurationsdaten getrennt vom Container-Image. Dies ermöglicht es Ihnen, dasselbe Anwendungs-Image mit unterschiedlichen Einstellungen zu verwenden, wie zum Beispiel für den Entwicklungsmodus, die Protokollierungsebene (Logging Level), Feature-Flags oder Endpunkt-Namen.
In diesem Lab erstellen Sie eine ConfigMap, untersuchen deren Daten, verwenden sie zur Konfiguration eines Pods, aktualisieren die ConfigMap und erstellen den Pod neu, um die neuen Werte zu übernehmen. Spätere Labs werden tiefer auf die spezifische Einbindung von Umgebungsvariablen und gemounteten Konfigurationsdateien eingehen; dieses Lab konzentriert sich auf das ConfigMap-Objekt und den grundlegenden Workflow der Anwendungskonfiguration.
Einen Namespace für ConfigMaps vorbereiten
In diesem Schritt bereiten Sie einen sauberen Namespace für die Arbeit mit ConfigMaps vor.
Beginnen Sie im Verzeichnis /home/labex/project. Sie werden in diesem Verzeichnis ein Pod-Manifest erstellen.
mkdir -p /home/labex/project
cd /home/labex/project
Überprüfen Sie, ob der Kubernetes API-Server erreichbar ist. Falls die VM gerade erst gestartet wurde und der Node noch nicht bereit ist, warten Sie einige Sekunden und führen Sie den Befehl erneut aus.
kubectl get nodes --request-timeout=5s
Die erwartete Ausgabe sieht in etwa so aus:
NAME STATUS ROLES AGE VERSION
labex-v135 Ready control-plane ... v1.35...
Warten Sie, bis der Cluster-Networking-Pod bereit (Ready) ist, bevor Sie Anwendungsobjekte erstellen.
kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s
Erwartete Ausgabe:
pod/calico-node-... condition met
Erstellen Sie einen Namespace namens ckad-prep-configmaps:
kubectl create namespace ckad-prep-configmaps
Setzen Sie diesen Namespace als aktuellen Kontext-Namespace:
kubectl config set-context --current --namespace=ckad-prep-configmaps
Bestätigen Sie den aktuellen Namespace:
kubectl config view --minify --output 'jsonpath={..namespace}'; echo
Erwartete Ausgabe:
ckad-prep-configmaps
Eine ConfigMap erstellen und untersuchen
In diesem Schritt erstellen Sie eine ConfigMap, die einfache Anwendungseinstellungen enthält.
Der Befehl kubectl create configmap kann eine ConfigMap direkt aus literalen Schlüssel-Wert-Paaren erstellen. Jedes --from-literal-Flag fügt einen Eintrag unter dem data-Feld der ConfigMap hinzu.
kubectl create configmap app-settings \
--from-literal=APP_MODE=dev \
--from-literal=LOG_LEVEL=debug \
--from-literal=FEATURE_BANNER=enabled
Erwartete Ausgabe:
configmap/app-settings created
Überprüfen Sie die Zusammenfassung der ConfigMap:
kubectl get configmap app-settings
Erwartete Ausgabe:
NAME DATA AGE
app-settings 3 ...
Lesen Sie die gespeicherten Werte aus. jsonpath gibt die ausgewählten Felder aus, ohne das gesamte Objekt anzuzeigen.
kubectl get configmap app-settings -o 'jsonpath={.data.APP_MODE}{" "}{.data.LOG_LEVEL}{" "}{.data.FEATURE_BANNER}{"\n"}'
Erwartete Ausgabe:
dev debug enabled
Sie können die ConfigMap auch als YAML anzeigen, um zu sehen, wo die Schlüssel im Objekt gespeichert sind.
kubectl get configmap app-settings -o yaml
Die erwartete Ausgabe enthält:
data:
APP_MODE: dev
FEATURE_BANNER: enabled
LOG_LEVEL: debug
Einen Pod über die ConfigMap konfigurieren
In diesem Schritt starten Sie einen Pod, der die ConfigMap-Werte als Umgebungsvariablen einliest.
Das Feld envFrom.configMapRef importiert alle Schlüssel aus einer ConfigMap in die Umgebung des Containers. Dies ist eine kompakte Methode, um eine kleine Menge nicht-sensibler Einstellungen mit einer Anwendung zu verknüpfen.
Erstellen Sie config-reader-pod.yaml:
cat > config-reader-pod.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
name: config-reader
labels:
app: config-reader
spec:
terminationGracePeriodSeconds: 0
containers:
- name: reader
image: busybox:1.36
command:
- /bin/sh
- -c
- 'echo mode=${APP_MODE}; echo level=${LOG_LEVEL}; echo banner=${FEATURE_BANNER}; sleep 3600'
envFrom:
- configMapRef:
name: app-settings
EOF
Wenden Sie das Pod-Manifest an:
kubectl apply -f config-reader-pod.yaml
Erwartete Ausgabe:
pod/config-reader created
Warten Sie, bis der Pod bereit (Ready) ist:
kubectl wait --for=condition=Ready pod/config-reader --timeout=120s
Erwartete Ausgabe:
pod/config-reader condition met
Lesen Sie die Pod-Logs aus. Die Anwendung gibt die Werte aus, die aus der ConfigMap stammen.
kubectl logs config-reader -c reader
Erwartete Ausgabe:
mode=dev
level=debug
banner=enabled
Die ConfigMap aktualisieren und den Pod neu erstellen
In diesem Schritt aktualisieren Sie die ConfigMap und erstellen den Pod neu, damit der Container die neuen Werte erhält.
Wenn eine ConfigMap als Umgebungsvariablen verwendet wird, ändert der laufende Container seine Umgebung nicht automatisch. Ein neuer Container muss gestartet werden, um die aktualisierten Werte einzulesen. Dies ist ein wichtiges Detail für die CKAD-Prüfung, da Sie möglicherweise Konfigurationen aktualisieren und anschließend die Workload neu starten oder neu erstellen müssen.
Patchen Sie die ConfigMap:
kubectl patch configmap app-settings --type merge --patch '{"data":{"APP_MODE":"prod","LOG_LEVEL":"warn","FEATURE_BANNER":"disabled"}}'
Erwartete Ausgabe:
configmap/app-settings patched
Bestätigen Sie die neuen ConfigMap-Werte:
kubectl get configmap app-settings -o 'jsonpath={.data.APP_MODE}{" "}{.data.LOG_LEVEL}{" "}{.data.FEATURE_BANNER}{"\n"}'
Erwartete Ausgabe:
prod warn disabled
Löschen Sie den alten Pod:
kubectl delete pod config-reader
Die erwartete Ausgabe enthält:
pod "config-reader" deleted
Erstellen Sie den Pod aus demselben Manifest neu und warten Sie, bis er bereit (Ready) ist:
kubectl apply -f config-reader-pod.yaml
kubectl wait --for=condition=Ready pod/config-reader --timeout=120s
Erwartete Ausgabe:
pod/config-reader created
pod/config-reader condition met
Lesen Sie die Logs erneut aus. Der neue Pod sieht nun die aktualisierten ConfigMap-Werte.
kubectl logs config-reader -c reader
Erwartete Ausgabe:
mode=prod
level=warn
banner=disabled
Zusammenfassung
Sie haben eine ConfigMap erstellt, deren Daten überprüft, sie mit einem Anwendungs-Pod verknüpft, die ConfigMap aktualisiert und den Pod neu erstellt, damit der Container die neuen Werte übernimmt. Damit beherrschen Sie den grundlegenden ConfigMap-Workflow, bevor Sie sich in späteren Labs mit detaillierteren Mustern für Umgebungsvariablen und Datei-Mounts befassen.


