Anwendungen mit ConfigMaps konfigurieren

KubernetesBeginner
Jetzt üben

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.