Konfiguration
Ziel
In diesem Projekt geht es um die Konfiguration von Pods. Sie werden:
- Umgebungsvariablen zu einem Pod-Template hinzufügen
 - Secrets erstellen und einer Umgebungsvariable hinzufügen
 - ConfigMaps erstellen und einer Umgebungsvariable hinzufügen
 
Hilfsmittel
- Versuchen Sie, die unten stehenden Aufgaben mit Hilfe der Folien und des Cheatsheets eigenständig zu lösen.
 - Sollten Sie dabei Probleme haben, finden Sie bei jeder Aufgabe einen ausklappbaren Block, in dem der Lösungsweg beschrieben wird.
 
Aufgabe 1: Umgebungsvariablen
- Erstellen Sie eine Datei 
deployment.yaml, die eine Beschreibung für eine Deployment mit dem Namenwebenthält, das das Imagenginxverwendet. Die Beschreibung des Deployments sollte die UmgebungsvariableFOO=barenthalten. 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Das YAML-File deployment.yaml sollte so oder so ähnlich aussehen:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx
        env:
        - name: FOO
          value: bar
- Wenden Sie das Deployment an.
 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f deployment.yaml
- Führen Sie ein 
describeauf den erstellten Pod aus und schauen Sie sich an wie sich die Umgebungsvariable auswirkt. 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl describe pods
(...)
Containers:
  nginx:
    Container ID:   containerd://08ac0ded36e91e1c28f324203bde9db0af1b952272d91038b97889cb5d0ba218
    Image:          nginx
(...)
    Environment:
      FOO:  bar
(...)
- Führen Sie eine Shell innerhalb des Pods aus und lassen Sie sich alle Umgebungsvariablen mit 
printenvanzeigen.FOOsollte aufbargesetzt sein. 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Vermeiden Sie die direkte Verwendung des Pod-Namens und verwenden Sie stattdessen den Namen des Deployments. Auf diese Weise kann sich der Pod-Name ändern, ohne dass der Befehl unterbrochen wird:
kubectl exec -it deployment/web -- sh
printenv
(...)
FOO=bar
(...)
exit
Oder einzeilig:
kubectl exec -it deployment/web -- printenv | grep "FOO"
# Ausgabe
FOO=bar
- Ändern Sie den Wert der Umgebungsvariablen 
FOOinbaz. Beobachten Sie, was passiert, wenn Sie die Änderungen mitwatch kubectlanwenden. 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Bearbeiten Sie die Datei 
deployment.yamlund ersetzen Sie die Zeilevalue: bardurchvalue: baz. - Öffnen Sie ein weiteres Terminal und führen Sie 
watch kubectl get allaus. - Wenden Sie das neue Deployment an:
 
kubectl apply -f deployment.yaml
- Beobachten Sie, wie die Änderungen auf Deployments, ReplicaSets und Pods angewendet werden:
 
watch kubectl get all
NAME                       READY   STATUS        RESTARTS   AGE
pod/web-68d745b7bb-5r572   1/1     Running       0          4s
pod/web-cd649748b-f2d72    1/1     Terminating   0          47m
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/web   1/1     1            1           47m
NAME                             DESIRED   CURRENT   READY   AGE
replicaset.apps/web-68d745b7bb   1         1         1       5s
replicaset.apps/web-cd649748b    0         0         0       47m
- Geben Sie den Wert der Variablen FOO aus:
 
kubectl exec -it deployment/web -- printenv | grep "FOO"
FOO=baz
Aufgabe 2: Secrets
Aufgabe 2.1: Secrets erstellen
- Erstellen Sie eine Datei 
secret.yaml, die die Beschreibung für ein Secret mit dem Namenmy-secretenthält. Die geheimen Daten sollten eineSECRET_PHRASEmit dem Wertabracadabraenthalten. 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Kodieren Sie "abracadabra" in base64:
 
echo -n "abracadabra" | base64
- Erstellen Sie eine YAML Datei 
secret.yamlmit folgendem Inhalt: 
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
  labels:
    exercise: secrets
type: Opaque
data:
  SECRET_PHRASE: YWJyYWNhZGFicmE=
Der Wert eines Secrets muss Base64-kodiert sein. Je nach den Befehlen, die Sie für die Kodierung der Zeichenfolge verwenden, endet der Wert mit = oder K. Letzteres steht für die Zeichenkette einschließlich eines nachgestellten Zeilenumbruchs "n".
- Wenden Sie das Secret mit 
kubectl applyan. 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f secret.yaml
- Schauen Sie sich die Liste der Secrets an und überprüfen Sie den Inhalt des Secrets auf mindestens zwei verschiedene Arten. Verwenden Sie Unterbefehle, die Sie in früheren Übungen gelernt haben.
 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Secrets auflisten:
 
kubectl get secrets
NAME        TYPE     DATA   AGE
my-secret   Opaque   1      106s
- Beschreibung von "my-secret" anzeigen:
 
kubectl describe secret my-secret
Name:         my-secret
Namespace:    testnamespace
Labels:       <none>
Annotations:  <none>
Type:  Opaque
Data
====
SECRET_PHRASE:  11 bytes
- YAML von "my-secret" anzeigen:
 
kubectl get secrets my-secret -o yaml
apiVersion: v1
data:
  SECRET_PHRASE: YWJyYWNhZGFicmE=
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"SECRET_PHRASE":"YWJyYWNhZGFicmE="},"kind":"Secret","metadata":{"annotations":{},"name":"my-secret","namespace":"testnamespace"},"type":"Opaque"}
  creationTimestamp: "2024-02-22T10:19:41Z"
  name: my-secret
  namespace: testnamespace
  resourceVersion: "31789210"
  uid: eb4615ea-616d-47c7-a686-68592d633efc
type: Opaque
- Verwenden Sie 
kubectl, um eine JSON-Darstellung des Secrets auszugeben, und verwenden Siejq, um den Wert des Secrets zu extrahieren. Verwenden Sie dannbase64, um den Wert zu dekodieren. 
jq und Bindestriche in JSON-Objektschlüsseln
Wenn der Schlüssel eines JSON-Objekts Bindestriche oder Leerzeichen enthält, müssen Sie Anführungszeichen um diesen Schlüssel in jq-Selektoren verwenden:
echo '{ "data": { "mein-spezieller-schlüssel": "bingo" }}' | jq -r '.data. "mein-besonderer-schluessel"'
Beachten Sie die doppelten Anführungszeichen in .data. "mein-spezial-schlüssel"
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Geben Sie das Geheimnis im JSON-Format aus, leiten Sie es an jq weiter, extrahieren Sie den Wert von SECRET_PHRASE und Base64-dekodieren Sie ihn:
kubectl get secrets my-secret -o json | jq -r '.data.SECRET_PHRASE' | base64 -d
abracadabra
Aufgabe 2.2: Secrets in einem Deployment verwenden
- Erstellen Sie ein Deployment namens 
webindeployment2.yamlunter Verwendung des Imagesnginx, wie Sie es in der vorherigen Übung getan haben. - Erweitern Sie das Deployment und ordnen Sie das Secret einer Umgebungsvariablen 
ENV_SECRET_PHRASEzu und wenden Sie es mitkubectl applyan. Überprüfen Sie anschließend die Umgebungsvariablen des Pods. 
Referenzen für Secrets im Deployment
- Das Feld 
valueFromwird verwendet, um auf das Kubernetes Secret Objekt zu verweisen. - Das Feld 
SecretKeyRefwird verwendet, um auf den Schlüssel innerhalb der Daten des Secret-Objekts zu verweisen. 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Das YAML file 
deployment.yamlsollte so oder so ähnlich aussehen: 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: web
        image: nginx
        env:
        - name: ENV_SECRET_PHRASE
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: SECRET_PHRASE
- Wenden Sie das Deployment an:
 
kubectl apply -f deployment2.yaml
- Stellen Sie sicher, dass der Pod erstellt wurde:
 
kubectl get pods
NAME                   READY   STATUS    RESTARTS   AGE
web-57cd799b47-7wvbs   1/1     Running   0          16s
- Untersuchen Sie die Umgebung des Containers im Pod:
 
kubectl describe pod web
Name:             web-57cd799b47-7wvbs
(...)
Containers:
  web:
(...)
    Environment:
      ENV_SECRET_PHRASE:  <set to the key 'SECRET_PHRASE' in secret 'my-secret'>  Optional: false
(...)
- Gibt die Umgebungsvariable aus, die das Secret enthält:
 
kubectl exec -it deployments/web -- printenv | grep ENV_SECRET_PHRASE
ENV_SECRET_PHRASE=abracadabra
- Aktualisieren Sie das Secret mit einem neuen Wert und prüfen Sie die Auswirkungen auf den Pod.
 
Hinweis
Aktualisieren Sie entweder die Beschreibung und wenden Sie sie erneut an oder verwenden Sie kubectl edit secret, um den Wert des Geheimnisses auf/in dem Pod zu ändern.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Verändern Sie den Wert von 
SECRET_PHRASEzurotated_secret: 
echo -n 'rotated_secret' | base64
- Bearbeiten Sie die Datei secret.yaml und wenden diese an oder bearbeiten Sie das Manifest direkt:
 
# secret.yaml aktualisieren, dann:
kubectl apply -f secret.yaml
# Oder
kubectl edit secret my-secret
- Überprüfen Sie ob die zugehörige Umgebungsvariable geändert wurde:
 
kubectl exec -it deployments/web -- printenv | grep ENV_SECRET_PHRASE
ENV_SECRET_PHRASE=abracadabra
- Die Änderung wird erst bei der Neuerstellung des Pods berücksichtigt.
 - Löschen Sie den Pod, der dann automatisch vom Deployment neu erstellt wird:
 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl delete pods --selector app=web
- Prüfen Sie, ob die Umgebungsvariable geändert wurde.
 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl exec -it deployments/web -- printenv | grep ENV_SECRET_PHRASE
Aufgabe 2.3: Secrets über stringData definieren
- Informieren Sie sich in der offizielle Dokumentation für Secrets über 
stringData - Erstellen Sie ein Secret unter Verwendung von 
stringData. Hinweis: hierbei entfällt das explizite Encodieren. 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Erstellen Sie ein neues YAML file 
secret-2.yamlmit folgendem Inhalt:apiVersion: v1 kind: Secret metadata: name: my-secret-2 labels: exercise: secrets type: Opaque stringData: SECRET_PHRASE: "abracadabra" - Wenden Sie das neue Secret an:
kubectl apply -f secret-2.yaml - Inspizieren Sie das neue Secret:
Obwohl wir
kubectl get secrets my-secret-2 -o yaml apiVersion: v1 data: SECRET_PHRASE: YWJyYWNhZGFicmE= kind: Secret (...)stringDataund einen Klartextwert bei der Beschreibung des Geheimnisses insecret-2.yamlverwendet haben, wird bei der Anzeige des Secret-Objekts mitkubectlder Wert als Base64-kodierte Zeichenkette angezeigt. 
Cleanup
- Löschen Sie alle Objekte, die Sie erstellt haben
 - Beobachten Sie, mit 
watch kubectl get allwie alle verschwinden