Mehrere Container im Pod nutzen
Ziel
In diesem Projekt geht es darum mehrere Container innerhalb eines Pods zu starten. Sie werden:
- initContainer verwenden
 - Sidecars verwenden
 
Hilfsmittel
- Versuchen Sie, die unten stehenden Aufgaben mit Hilfe der Folien und der 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: Init-Container nutzen
- Erstellen Sie eine Datei 
init.yaml, die die Beschreibung für einen Pod mit dem Namenpod-with-initenthält. Verwenden Sie das nginx-Image wie zuvor. - Der Pod sollte ein persistentes Volume verwenden, sodass die Dateien in 
/usr/share/nginx/htmlgeändert werden können - Der Pod sollte einen zusätzlichen initContainer enthalten, der:
- Das gleiche persistente Volume-Setup wie der Hauptcontainer verwendet
 - die folgenden Befehle ausführt:
 echo "Overriding index.html file..."echo "Hello from $(hostname)" | tee /usr/share/nginx/html/index.html
 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-init
  labels:
    app: nginx
    exercise: initcontainer
spec:
  volumes:
  - name: data
    emptyDir: {}
  initContainers:
  - name: init
    image: nginx
    command:
    - bash
    - -c
    args:
    - |
      echo "Overriding index.html file..." && echo "Hello from $(hostname)" | tee /usr/share/nginx/html/index.html
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: data
  containers:
  - name: web
    image: nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: data
- Deployen Sie den Pod
 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f init.yaml
- Schauen Sie sich das Ergebnis mit 
kubectl get podsan - Schauen Sie sich die Logs des initContainers mit 
kubectl logsmit der Option-can 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl logs pod-with-init -c init
- Holen Sie sich Details zum Pod mit 
kubectl describe 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl describe pod pod-with-init
- Beachten Sie dabei vor allem die Abschnitte 
Init ContainerundContainerund vergleichen Sie die UnterabschnitteState - Schauen Sie sich an, welche Events ausgelöst wurden. Das geht mit 
kubectl eventsoder seinem Äquivalentkubectl get events --sort-by='.metadata.creationTimestamp' - 
Machen Sie sich mit
kubectl eventsvertraut und probieren Sie einige weitere Optionen aus, z.B.kubectl events -o yaml - 
Führen Sie den Befehl
curl localhostinnerhalb des Pods mitkubectl execaus 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl exec -it pod-with-init -- curl localhost
Aufgabe 2: Sidecar nutzen
- Erstellen Sie eine Datei 
secret.yaml, die die Beschreibung für ein Secret mit dem Namendbenthält. Die Daten sollten einen Schlüsselmysql-root-passwordmit dem Wertnot-the-secretenthalten. 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
---
apiVersion: v1
kind: Secret
metadata:
  name: db
type: Opaque
stringData:
  mysql-root-password: "not-the-secret"
- Wenden Sie das Secret mit 
kubectl applyan. 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f secret.yaml
- Erstellen Sie eine Datei 
pod.yaml, die die Beschreibung für einen Pod mit dem Namenmysqlenthält. Verwenden Sie dasmysql:5Image wie zuvor. - Der Pod sollte einen Hauptcontainer enthalten, der:
- eine Umgebungsvariable 
MYSQL_ROOT_PASSWORDenthält, die auf den Schlüsselmysql-root-passwordim Secret zeigt - einen Port für den Container auf Port 
3306öffnen 
 - eine Umgebungsvariable 
 - Der Pod sollte auch einen zusätzlichen Container (Sidecar) mit dem Namen 
metricsenthalten, der Metriken aus der mysql-Datenbank exportiert. Er sollte:- das Image 
prom/mysqld-exporter:v0.15.1verwenden - eine Umgebungsvariable 
MYSQLD_EXPORTER_PASSWORDenthalten, die auf den Schlüsselmysql-root-passwordim Secret zeigt - einen Port zum ContainerPort 
9104öffnen. - den folgenden Befehl ausführen:
  
sh -c /bin/mysqld_exporter --mysqld.address=mysql:3306 --mysqld.username=root 
 - das Image 
 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  containers:
  - name: mysql
    image: mysql:5
    env:
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
        secretKeyRef:
          name: db
          key: mysql-root-password
    ports:
    - name: mysql
      containerPort: 3306
  - name: metrics
    image: prom/mysqld-exporter:v0.15.1
    env:
    - name: MYSQLD_EXPORTER_PASSWORD
      valueFrom:
        secretKeyRef:
          name: db
          key: mysql-root-password
    command:
    - sh
    - -c
    - /bin/mysqld_exporter --mysqld.address=mysql:3306 --mysqld.username=root
    ports:
    - name: metrics
      containerPort: 9104
- Deployen Sie den Pod mit 
kubectl apply 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f pod.yaml
- Erstellen Sie eine Datei 
service.yaml, die die Beschreibung für einen Service mit dem Namendbenthält. Sie sollte die folgenden TCP-Port-Zuordnungen enthalten:- Port: 3306 targetPort: 3306 - port: 9104 targetPort: 9104 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
---
apiVersion: v1
kind: Service
metadata:
  name: db
  labels:
    exercise: sidecar
spec:
  selector:
    app: mysql
  ports:
  - name: mysql
    protocol: TCP
    port: 3306
    targetPort: 3306
  - name: metrics
    protocol: TCP
    port: 9104
    targetPort: 9104
- Wenden Sie den Service mit 
kubectl applyan. 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl apply -f service.yaml
- Untersuchen Sie die Container des Pods mit 
kubectl describe - Untersuchen Sie die Logs der beiden Container des Pods mit 
kubectl logsmit der Option-cfür jeden Container - Verwenden Sie 
curl, um die Metriken vom mysqld_exporter abzufragen 
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
kubectl run -it --image=alpine --rm --command -- bash
wget -O- db:9104/metrics
Cleanup
- Löschen Sie alle Objekte die Sie in dieser Übung erstellt haben