Configure Liveness, Readiness and Startup Probes
In Kubernetes sind Probes definierte Mechanismen, die verwendet werden, um den Status eines Pods zu überprüfen. Sie bestimmen, ob eine Anwendung innerhalb eines Containers korrekt läuft. Es gibt drei Arten von Probes: Liveness Probes, Readiness Probes und Startup Probes.
Liveness Probes überprüfen, ob eine Anwendung innerhalb eines Containers noch läuft. Wenn diese Probes fehlschlagen, wird der kubelet-Prozess den Container neu starten, in der Annahme, dass er nicht mehr reagiert.
Readiness Probes bestimmen, ob ein Container bereit ist, Anfragen zu bearbeiten. Wenn ein Container nicht ready ist, werden keine Anfragen über den Kubernetes Service zu diesem Container geleitet.
Startup Probes sind speziell dafür konzipiert, zu erkennen, ob eine Anwendung länger zum Starten benötigt. Diese verhindern, dass Liveness und Readiness Probes eingreifen, bevor die Anwendung vollständig hochgefahren ist.
Zur Implementierung der Probes werden Konfigurationsoptionen im Pod-Specification File definiert. Probes können HTTP-Get-Anfragen, TCP-Socket-Verbindungen oder spezifische Befehle, die im Container ausgeführt werden, verwenden, um den Status zu überprüfen.
Eine korrekte Implementierung der Probes ist entscheidend für die Aufrechterhaltung der Zuverlässigkeit und Verfügbarkeit von Anwendungen in Kubernetes. Sie tragen wesentlich zur Automatisierung der Fehlerbehandlung und zu einem robusten Systemverhalten bei.
# Beispiel für LivenessProbe mit httpGet
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: up
value: true# Beispiel für LivenessProbe mit tcpSocket
livenessProbe:
tcpSocket:
port: 8080# Beispiel für LivenessProbe mit exec
livenessProbe:
exec:
command:
- cat
- /app/is_alive.txtStartup Probes sind Gesundheitschecks in Kubernetes, die überprüfen, ob ein Container erfolgreich gestartet ist. Sie unterscheiden sich von Liveness und Readiness Probes dadurch, dass sie ausschließlich während des Startvorgangs aktiv sind. Dies ist besonders nützlich für Anwendungen, die längere Startzeiten benötigen.
Die korrekte Implementierung von Startup Probes erhöht die Stabilität und Verfügbarkeit langsam startender Dienste, indem sie optimale Startzeiten sicherstellt und bei Bedarf einen Neustart der Anwendung veranlasst.
Startup Probes sind nützlich in Situationen, in denen eine Anwendung einen komplexen Startvorgang hat, der mehr Zeit in Anspruch nehmen kann, als eine typische Liveness Probe erlaubt. Ohne eine Startup Probe könnte der Kubelet fälschlicherweise annehmen, dass der Container nicht reagiert und ihn neu starten, was den Startvorgang weiter verzögert.
Hier ist ein typisches Szenario, in dem Startup Probes verwendet werden:
Die Konfiguration einer Startup Probe erfolgt im Pod-Manifest. Hier ist ein Beispiel für eine Startup Probe, die eine HTTP-GET-Anfrage verwendet:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: example-container
image: example/image
ports:
- containerPort: 8080
startupProbe:
httpGet:
path: /up
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 30| Parameter | Beschreibung | Wert |
|---|---|---|
initialDelaySeconds |
Verzögerung vor der ersten Überprüfung. | 10 |
periodSeconds |
Wie oft die Probe ausgeführt wird. | 5 |
failureThreshold |
Anzahl der Wiederholungen der Probe, bevor ein Fehler gilt. | 30 |
Das bedeutet, dass die Anwendung bis zu 150 Sekunden (30 x 5) nach dem ersten Verzögerungsintervall hat, um zu starten, bevor der Container neu gestartet wird.
Nginx hat standardmäßig keinen spezifischen Health-Check-Endpunkt.
Normalerweise antwortet Nginx auf alle Anfragen an den Server mit der
entsprechenden Konfiguration, sofern der Dienst läuft. Sie können jedoch
einfach einen Health-Check-Endpunkt in Nginx definieren, indem Sie eine
bestimmte Location in der Konfigurationsdatei (nginx.conf)
einrichten.
Fügen Sie eine location-Direktive in Ihrer
server-Konfiguration hinzu, die speziell für Health-Checks
vorgesehen ist:
server {
listen 80;
server_name localhost;
location /up {
access_log off;
return 200 'nginx is healthy\n';
}
# ... weitere Konfiguration ...
}
Diese location blockiert den Zugriff auf den Pfad
/up und gibt einfach einen 200 OK Status mit einer
Nachricht zurück, was angibt, dass Nginx läuft und gesund ist.
Angenommen, Sie haben die obige Nginx-Konfiguration in einem Container laufen, könnten Sie folgende Startup Probe für diesen Container in Ihrem Kubernetes-Pod-Spezifikation definieren:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
startupProbe:
httpGet:
path: /up
port: 80
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 30In diesem Beispiel wird die Startup Probe den /healthz
Endpunkt Ihres Nginx-Servers überprüfen. Nach einer Anfangsverzögerung
von 10 Sekunden prüft die Probe alle 5 Sekunden, ob Nginx gestartet ist.
Wenn Nginx innerhalb von 30 Versuchen nicht reagiert, nimmt Kubernetes
an, dass ein Fehler vorliegt, und wird entsprechende Maßnahmen
ergreifen.
Diese Konfiguration könnte hilfreich sein, wenn Sie eine Nginx-Instanz in einem Container haben, der eine signifikante Zeit zum Starten benötigt, beispielsweise aufgrund einer langen Initialisierung oder weil er auf abhängige Dienste wartet.
Readiness Probes werden in Kubernetes verwendet, um zu überprüfen, ob ein Container bereit ist, Traffic zu empfangen. Sie sind von Liveness Probes zu unterscheiden, welche lediglich prüfen, ob ein Container noch aktiv ist. Readiness Probes sind dafür zuständig, den Netzwerkverkehr zu Containern zu leiten, die einsatzbereit sind und korrekt arbeiten.
Diese Prüfungen sind für die Verkehrslenkung zu Anwendungen in einem Kubernetes-Cluster von großer Bedeutung. Sie steigern die Zuverlässigkeit und Stabilität von Services, indem sie garantieren, dass nur vollständig hochgefahrene und funktionsfähige Container Anfragen erhalten.
Der Hauptzweck der Readiness Probe ist es sicherzustellen, dass ein Pod nicht in den Service-Endpunkten erscheint, bevor er tatsächlich bereit ist, Anfragen zu verarbeiten. Dies verhindert, dass eingehender Verkehr zu einem Container geleitet wird, der noch mit dem Starten seiner Anwendung oder dem Laden von großen Datenmengen beschäftigt ist.
Readiness Probes können über verschiedene Methoden konfiguriert werden:
Hier ist ein Beispiel für eine Readiness Probe mit einer HTTP-GET-Anfrage in einer Pod-Spezifikation:
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: my-app-container
image: my-app:latest
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
failureThreshold: 3In diesem Beispiel prüft Kubernetes, ob der Container bereit ist,
indem eine HTTP-GET-Anfrage an den Endpunkt /ready auf Port
8080 gesendet wird. Nach einer Anfangsverzögerung von 5
Sekunden wird die Probe alle 5 Sekunden ausgeführt. Der Container gilt
nach einer erfolgreichen Antwort als bereit. Wenn die Probe dreimal
fehlschlägt, wird der Container aus den Service-Endpunkten entfernt.
Manchmal muss die Bereitschaft eines Containers mit spezifischeren
Bedingungen geprüft werden. Hierfür kann man ein Skript verwenden, das
als Exec Command ausgeführt wird. Angenommen, Sie haben ein Skript
check-ready.sh, das überprüft, ob bestimmte Bedingungen
erfüllt sind:
apiVersion: v1
kind: Pod
metadata:
name: custom-app
spec:
containers:
- name: custom-app-container
image: custom-app:latest
readinessProbe:
exec:
command:
- /bin/bash
- -c
- /path/to/check-ready.sh
initialDelaySeconds: 10
periodSeconds: 5
successThreshold: 1
failureThreshold: 5In diesem Szenario führt der Kubelet das Skript
check-ready.sh im Container aus. Wenn das Skript mit einem
Exit-Code von 0 (Null) endet, gilt der Container als bereit. Andernfalls
wird er nach fünf fehlgeschlagenen Versuchen als nicht bereit
betrachtet.
initialDelaySeconds, periodSeconds und
failureThreshold sollten so konfiguriert werden, dass sie
der tatsächlichen Startzeit und Stabilität Ihrer Anwendung
entsprechen.Liveness Probes in Kubernetes prüfen, ob eine Anwendung in einem Container noch adäquat funktioniert. Bei einem Fehlschlag der Probe initiiert Kubernetes einen Neustart des Containers, um den Service wiederherzustellen.
Diese Proben sind zentral für die Aufrechterhaltung der Anwendungsverfügbarkeit in einem Kubernetes-Cluster, indem sie die Selbstheilung von Diensten durch automatische Neustarts bei Fehlverhalten ermöglichen.
Ein Container, der nicht mehr reagiert oder in einer Endlosschleife feststeckt, kann normalerweise durch einen Neustart behoben werden. Liveness Probes helfen Kubernetes zu identifizieren, wann ein Neustart erforderlich ist.
Wie bei Readiness Probes gibt es auch für Liveness Probes verschiedene Methoden:
Ein einfaches Beispiel für eine Liveness Probe mit einer HTTP-GET-Anfrage in einer Pod-Spezifikation sieht wie folgt aus:
apiVersion: v1
kind: Pod
metadata:
name: liveness-http
spec:
containers:
- name: liveness
image: myapp:1.0
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 15
timeoutSeconds: 2
periodSeconds: 5
failureThreshold: 3In diesem Beispiel führt Kubernetes 15 Sekunden nach dem Containerstart eine Liveness Probe durch. Die Probe wird alle 5 Sekunden wiederholt. Nach drei fehlgeschlagenen Versuchen in Folge wird der Container neu gestartet.
Hier ist ein Beispiel, in dem eine Liveness Probe ein benutzerdefiniertes Skript im Container ausführt:
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec
spec:
containers:
- name: liveness
image: myapp:1.0
livenessProbe:
exec:
command:
- /bin/bash
- -c
- /path/to/check-liveness.sh
initialDelaySeconds: 30
periodSeconds: 10Das Skript /path/to/check-liveness.sh wird im Container
ausgeführt, um zu überprüfen, ob die Anwendung noch lebt. Wenn das
Skript einen Exit-Status von 0 zurückgibt, wird angenommen, dass die
Anwendung in Ordnung ist. Wenn das Skript mit einem anderen Status
endet, wird der Container als nicht mehr lebendig betrachtet und neu
gestartet.
initialDelaySeconds und periodSeconds so, dass
Ihre Anwendung genügend Zeit hat, sich von temporären Problemen zu
erholen.