Ausführen mehrerer Befehle und Umgang mit Startfehlern
In diesem Schritt lernen wir, wie wir mehrere Befehle beim Start eines Pods ausführen können und wie wir Startfehler mithilfe von Gesundheitsüberprüfungen (Health Checks) behandeln können.
Ausführen mehrerer Befehle
Oft müssen Sie mehrere Befehle ausführen, wenn ein Container startet. Es gibt mehrere Möglichkeiten, dies in Kubernetes zu tun:
- Verkettung von Befehlen mit Shell-Operatoren (
&&
, ;
usw.)
- Verwendung einer Skriptdatei
- Verwendung eines Init-Containers
Lassen Sie uns die erste Methode untersuchen, indem wir die Datei multi-command-pod.yaml
betrachten:
nano multi-command-pod.yaml
Sie werden Folgendes sehen:
apiVersion: v1
kind: Pod
metadata:
name: multi-command-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
command: ["/bin/bash", "-c"]
args:
[
"echo 'First command' > /tmp/first.txt && echo 'Second command' > /tmp/second.txt && sleep 3600"
]
Diese Konfiguration verknüpft mehrere Befehle mithilfe des &&
-Operators, der jeden Befehl nur ausführt, wenn der vorherige erfolgreich war.
Drücken Sie Ctrl+X
, um den Editor zu verlassen.
Lassen Sie uns diesen Pod erstellen:
kubectl apply -f multi-command-pod.yaml
Sie sollten sehen:
pod/multi-command-pod created
Jetzt überprüfen wir, ob beide Befehle ausgeführt wurden, indem wir die erstellten Dateien prüfen:
kubectl exec multi-command-pod -- cat /tmp/first.txt
Sie sollten sehen:
First command
Und für die zweite Datei:
kubectl exec multi-command-pod -- cat /tmp/second.txt
Sie sollten sehen:
Second command
Umgang mit Startfehlern mithilfe von Gesundheitsüberprüfungen
Kubernetes bietet Mechanismen, um Startfehler zu erkennen und zu behandeln:
- Liveness Probes: Überprüfen, ob der Container läuft; wenn nicht, wird Kubernetes ihn neu starten.
- Readiness Probes: Überprüfen, ob der Container bereit ist, Datenverkehr zu empfangen.
- Startup Probes: Überprüfen, ob die Anwendung gestartet wurde; nützlich für langsam startende Container.
Lassen Sie uns einen Pod untersuchen, der einen Liveness Probe verwendet:
nano liveness-probe-pod.yaml
Sie werden Folgendes sehen:
apiVersion: v1
kind: Pod
metadata:
name: liveness-probe-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
command: ["/bin/bash", "-c"]
args: ["touch /tmp/healthy && sleep 3600"]
livenessProbe:
exec:
command: ["cat", "/tmp/healthy"]
initialDelaySeconds: 5
periodSeconds: 5
In dieser Konfiguration:
- Der Container erstellt beim Start eine Datei
/tmp/healthy
.
- Der Liveness Probe überprüft alle 5 Sekunden, ob diese Datei vorhanden ist.
- Wenn die Datei fehlt, hält Kubernetes den Container für fehlerhaft und startet ihn neu.
Drücken Sie Ctrl+X
, um den Editor zu verlassen.
Lassen Sie uns diesen Pod erstellen:
kubectl apply -f liveness-probe-pod.yaml
Sie sollten sehen:
pod/liveness-probe-pod created
Überprüfen Sie, ob der Pod läuft:
kubectl get pods liveness-probe-pod
Sie sollten sehen:
NAME READY STATUS RESTARTS AGE
liveness-probe-pod 1/1 Running 0 30s
Jetzt sehen wir, was passiert, wenn wir die Gesundheitsüberprüfungsdatei entfernen:
kubectl exec liveness-probe-pod -- rm /tmp/healthy
Warten Sie etwa 10 Sekunden und überprüfen Sie dann erneut den Pod-Status:
kubectl get pods liveness-probe-pod
Sie sollten sehen, dass der Container neu gestartet wurde:
NAME READY STATUS RESTARTS AGE
liveness-probe-pod 1/1 Running 1 60s
Die Anzahl der Neustarts (RESTARTS) hat sich auf 1 erhöht, was darauf hinweist, dass Kubernetes den fehlerhaften Zustand erkannt und den Container neu gestartet hat.
Lassen Sie uns überprüfen, ob die Gesundheitsüberprüfungsdatei wieder vorhanden ist (sie sollte beim Neustart des Containers durch den Startbefehl neu erstellt worden sein):
kubectl exec liveness-probe-pod -- ls -la /tmp/healthy
Sie sollten sehen, dass die Datei wieder vorhanden ist:
-rw-r--r-- 1 root root 0 Sep 21 10:30 /tmp/healthy
Dies zeigt, wie Kubernetes automatisch von Startfehlern recoverieren und den gewünschten Zustand Ihrer Anwendungen aufrechterhalten kann.
Erstellen eines benutzerdefinierten Startskripts
Für komplexere Initialisierungen möchten Sie möglicherweise ein benutzerdefiniertes Startskript verwenden. Lassen Sie uns einen Pod erstellen, der ein Shellskript zum Starten verwendet:
nano script-pod.yaml
Fügen Sie den folgenden Inhalt hinzu:
apiVersion: v1
kind: Pod
metadata:
name: script-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
command: ["/bin/bash", "-c"]
args:
- |
cat > /tmp/startup.sh << 'EOF'
#!/bin/bash
echo "Script started at $(date)" > /tmp/script-log.txt
echo "Creating configuration files..." >> /tmp/script-log.txt
mkdir -p /tmp/config
echo "app_name=MyApp" > /tmp/config/app.conf
echo "version=1.0" >> /tmp/config/app.conf
echo "Script completed successfully" >> /tmp/script-log.txt
EOF
chmod +x /tmp/startup.sh
/tmp/startup.sh
sleep 3600
Diese Konfiguration:
- Erstellt ein Startskript im Container.
- Macht es ausführbar.
- Führt das Skript aus.
- Lässt den Container mit
sleep
laufen.
Speichern Sie die Datei und verlassen Sie den Editor mit Ctrl+X
, gefolgt von Y
und Enter
.
Lassen Sie uns diesen Pod erstellen:
kubectl apply -f script-pod.yaml
Sie sollten sehen:
pod/script-pod created
Warten Sie einen Moment, bis der Pod gestartet ist, und überprüfen Sie dann seinen Status:
kubectl get pods script-pod
Sie sollten sehen:
NAME READY STATUS RESTARTS AGE
script-pod 1/1 Running 0 30s
Jetzt überprüfen wir die Ausgabe unseres Skripts:
kubectl exec script-pod -- cat /tmp/script-log.txt
Sie sollten etwas wie Folgendes sehen:
Script started at Tue Sep 21 10:35:42 UTC 2023
Creating configuration files...
Script completed successfully
Und lassen Sie uns überprüfen, ob die Konfigurationsdatei erstellt wurde:
kubectl exec script-pod -- cat /tmp/config/app.conf
Sie sollten sehen:
app_name=MyApp
version=1.0
Dies zeigt, wie Sie komplexe Startskripts verwenden können, um Ihre Container in Kubernetes zu initialisieren.