10: Liveness i Readiness Probes
Sondy w Kubernetes: Liveness i Readiness Probes
Cel zadania
Celem zadania jest zrozumienie jak działają sondy (probes) w Kubernetes, jak je konfigurować oraz jak wpływają na zachowanie aplikacji w klastrze.
Teoria
Sondy w Kubernetes
- Liveness Probe: Sprawdza czy aplikacja żyje - jeśli nie, Kubernetes restartuje kontener
- Readiness Probe: Sprawdza czy aplikacja jest gotowa na przyjmowanie ruchu
- Startup Probe: (opcjonalna) Sprawdza czy aplikacja zakończyła proces startowania
Typy sond i ich zastosowanie
- HTTP GET
- Najczęściej używany typ
- Sprawdza endpoint HTTP w aplikacji
- Sukces: kod odpowiedzi 200-399
- Idealny dla aplikacji webowych
- TCP Socket
- Sprawdza czy port jest otwarty
- Nie sprawdza stanu aplikacji
- Dobry dla baz danych, cache’ów
- Exec
- Wykonuje komendę w kontenerze
- Sukces: kod wyjścia = 0
- Najbardziej elastyczny
Liveness vs Readiness — co się dzieje przy awarii
graph TD
subgraph LIV["Liveness Probe — fail"]
L1["Liveness check fails"] --> L2["failureThreshold przekroczony"]
L2 --> L3["Kubelet restartuje kontener"]
L3 --> L4["Pod wraca do Running"]
end
subgraph READ["Readiness Probe — fail"]
R1["Readiness check fails"] --> R2["failureThreshold przekroczony"]
R2 --> R3["Pod usunięty z Endpoints"]
R3 --> R4["Service nie kieruje ruchu do tego Poda"]
R4 --> R5["Pod nadal działa!<br/>(nie jest restartowany)"]
end
style L3 fill:#ffebee,stroke:#f44336
style R3 fill:#fff3e0,stroke:#ff9800
style R5 fill:#e8f5e9
Kluczowa różnica: Liveness → restart, Readiness → usunięcie z ruchu (bez restartu).
Zadanie 1: Testowanie Liveness Probe
1.1. Utwórz plik kuard-liveness-XX.yaml:
apiVersion: v1
kind: Pod
metadata:
name: kuard-liveness-XX
spec:
containers:
- name: kuard
image: gcr.io/kuar-demo/kuard-amd64:1
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /healthy
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
1.2. Uruchom test:
Potrzebujesz do tego zadania dwóch terminali
- W pierwszym terminalu uruchom monitoring podów:
kubectl get pods -w - W drugim terminalu utwórz pod:
kubectl apply -f kuard-liveness-XX.yaml - Po wystartowaniu poda, uruchom port-forward:
kubectl port-forward pod/kuard-liveness-XX 8080:8080 -
Otwórz http://localhost:8080 i przejdź do zakładki “Liveness Probe”
-
Kliknij “Fail” aby zasymulować awarię
- W pierwszym terminalu zobaczysz:
NAME READY STATUS RESTARTS AGE kuard-liveness-XX 1/1 Running 0 30s kuard-liveness-XX 1/1 Running 1 50s # Pod został zrestartowany
Zadanie 2: Testowanie Readiness Probe
2.1. Utwórz plik kuard-readiness-XX.yaml:
apiVersion: v1
kind: Pod
metadata:
name: kuard-readiness-XX
labels:
app: kuard-XX
spec:
containers:
- name: kuard
image: gcr.io/kuar-demo/kuard-amd64:1
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 2
periodSeconds: 5
2.2. Uruchom test:
- W pierwszym terminalu obserwuj endpointy:
kubectl get endpoints -w - W drugim terminalu utwórz pod i service:
kubectl apply -f kuard-readiness-XX.yaml kubectl expose pod kuard-readiness-XX --port=8080 - Uruchom port-forward w trzecim terminalu:
kubectl port-forward pod/kuard-readiness-XX 8080:8080 -
Otwórz http://localhost:8080 i przejdź do “Readiness Probe”
- Kliknij “Fail” i obserwuj endpointy w pierwszym terminalu:
NAME ENDPOINTS AGE kuard-readiness-XX 10.244.0.15:8080 30s kuard-readiness-XX <none> 35s # Pod został usunięty z endpointów
Zadanie 3: Pod z obiema sondami
3.1. Utwórz plik kuard-combined-XX.yaml:
apiVersion: v1
kind: Pod
metadata:
name: kuard-combined-XX
labels:
app: kuard-XX
spec:
containers:
- name: kuard
image: gcr.io/kuar-demo/kuard-amd64:1
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /healthy
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 2
periodSeconds: 5
3.2. Testowanie obu sond:
- W pierwszym terminalu uruchom monitoring:
kubectl get pods -w - W drugim terminalu utwórz zasoby:
kubectl apply -f kuard-combined-XX.yaml kubectl expose pod kuard-combined-XX --port=8080 - W trzecim terminalu obserwuj endpointy:
kubectl get endpoints -w - Uruchom port-forward w czwartym terminalu:
kubectl port-forward pod/kuard-combined-XX 8080:8080 - W przeglądarce testuj obie sondy i obserwuj:
- Liveness fail → restart poda (terminal 1)
- Readiness fail → usunięcie z endpointów (terminal 3)
Najczęstsze problemy
| Problem | Rozwiązanie |
|---|---|
| Pod ciągle się restartuje | Sprawdź logi i konfigurację liveness probe |
| Pod nie jest dostępny w service | Sprawdź readiness probe i endpointy |
| Pod nie startuje | Zweryfikuj initialDelaySeconds |
| Fałszywe awarie | Dostosuj periodSeconds i failureThreshold |
Dobre praktyki
- Zawsze używaj obu sond
- Liveness do wykrywania deadlocków
- Readiness do kontroli ruchu
- Odpowiednie parametry czasowe
- Ustaw initialDelaySeconds większy niż czas startu
- Używaj rozsądnych periodSeconds (10-30s)
- Właściwe endpointy
- Używaj lekkich endpointów
- Sprawdzaj tylko krytyczne komponenty
Podsumowanie
- Liveness probe odpowiada za wykrywanie awarii i restart poda
- Readiness probe kontroluje ruch do poda
- Sondy mogą używać różnych mechanizmów (HTTP, TCP, Exec)
- Właściwa konfiguracja jest kluczowa dla stabilności aplikacji