Di episode ini kita akan coba bahas konsep penting di Kubernetes yaitu Probe. Kita akan mempelajari tentang Liveness, Readiness, dan Startup Probe untuk memastikan kesehatan dan ketersediaan aplikasi.

Catatan
Untuk kalian yang ingin membaca episode sebelumnya, bisa click thumbnail episode 9 di bawah ini
Di episode sebelumnya kita sudah belajar tentang berbagai metode untuk menghapus Pod di Kubernetes. Selanjutnya di episode 10 kali ini, kita akan coba bahas konsep penting untuk memastikan kesehatan dan ketersediaan aplikasi yaitu Probe.
Catatan: Disini saya akan menggunakan Kubernetes Cluster yang di install melalui K3s.
Probe adalah health check yang Kubernetes gunakan untuk menentukan apakah aplikasi kalian berjalan dengan benar. Mereka membantu Kubernetes membuat keputusan intelligent tentang kapan restart container, kapan mengirim traffic ke Pod, dan kapan aplikasi siap menerima request. Memahami Probe sangat penting untuk membangun aplikasi yang resilient dan highly available di Kubernetes.
Probe adalah diagnostic check yang Kubernetes lakukan pada container untuk menentukan status kesehatan mereka. Bayangkan Probe seperti dokter yang memeriksa vital sign kalian - mereka secara periodik memeriksa apakah aplikasi kalian sehat dan berfungsi dengan benar.
Kubernetes menyediakan tiga tipe Probe:
Setiap tipe Probe memiliki tujuan berbeda dan membantu Kubernetes mengelola application lifecycle kalian secara efektif.
Tanpa Probe, Kubernetes tidak punya cara untuk mengetahui apakah aplikasi kalian benar-benar bekerja dengan benar. Container mungkin berjalan, tapi aplikasi di dalamnya bisa:
Probe membantu Kubernetes mendeteksi situasi ini dan mengambil tindakan yang tepat:
List ProbeMari kita explore setiap tipe Probe secara detail:
Liveness Probe menentukan apakah container berjalan dengan benar. Jika Liveness Probe gagal, Kubernetes akan kill container dan restart sesuai dengan restart policy Pod.
Use case untuk Liveness Probe:
Contoh skenario: Aplikasi kalian punya memory leak dan menjadi unresponsive setelah berjalan beberapa waktu. Liveness Probe bisa mendeteksi ini dan restart container secara otomatis.
Readiness Probe menentukan apakah container siap menerima traffic. Jika Readiness Probe gagal, Kubernetes akan menghapus Pod dari Service endpoint, mencegah traffic dikirim ke Pod tersebut.
Use case untuk Readiness Probe:
Contoh skenario: Aplikasi kalian perlu connect ke database sebelum bisa serve request. Readiness Probe memastikan traffic hanya dikirim setelah database connection established.
Perbedaan kunci dari Liveness Probe: Readiness Probe failure tidak restart container - mereka hanya stop mengirim traffic ke container tersebut.
Startup Probe digunakan untuk container yang membutuhkan waktu lama untuk start. Probe ini disable Liveness dan Readiness Probe sampai aplikasi berhasil start.
Use case untuk Startup Probe:
Contoh skenario: Aplikasi kalian perlu load dataset 5GB ke memory saat startup, yang membutuhkan 2 menit. Startup Probe memberi waktu untuk initialize tanpa di-kill oleh Liveness Probe.
Kubernetes support tiga mekanisme untuk melakukan Probe:
Kubernetes mengirim HTTP GET request ke path dan port yang di-specify. Probe succeed jika response status code antara 200 dan 399.
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 3
periodSeconds: 3Terbaik untuk: Web aplikasi, REST API, HTTP service
Kubernetes mencoba membuka TCP connection ke port yang di-specify. Probe succeed jika connection established.
livenessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 5
periodSeconds: 10Terbaik untuk: Database, TCP service, aplikasi tanpa HTTP endpoint
Kubernetes execute command di dalam container. Probe succeed jika command exit dengan status code 0.
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5Terbaik untuk: Custom health check, file-based check, complex validation logic
Semua Probe support parameter konfigurasi ini:
Waktu tunggu sebelum melakukan Probe pertama setelah container start.
initialDelaySeconds: 10 # Tunggu 10 detik sebelum check pertamaDefault: 0 detik
Seberapa sering melakukan Probe.
periodSeconds: 5 # Check setiap 5 detikDefault: 10 detik
Berapa lama menunggu Probe complete sebelum dianggap gagal.
timeoutSeconds: 3 # Probe harus complete dalam 3 detikDefault: 1 detik
Minimum consecutive success agar Probe dianggap successful setelah failure.
successThreshold: 1 # Satu success sudah cukupDefault: 1 (harus 1 untuk Liveness dan Startup Probe)
Jumlah consecutive failure sebelum mengambil tindakan (restart container atau remove dari Service).
failureThreshold: 3 # Fail 3 kali sebelum ambil tindakanDefault: 3
Mari kita buat contoh praktis untuk setiap tipe Probe:
Buat Pod dengan HTTP Liveness Probe:
apiVersion: v1
kind: Pod
metadata:
name: liveness-http
labels:
app: liveness-demo
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 3
timeoutSeconds: 1
failureThreshold: 3Apply konfigurasi:
sudo kubectl apply -f liveness-http.ymlVerifikasi Pod berjalan:
sudo kubectl get podsCek status Probe:
sudo kubectl describe pod liveness-httpKalian akan melihat event yang menunjukkan Liveness Probe bekerja:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 30s default-scheduler Successfully assigned default/liveness-http to node1
Normal Pulled 29s kubelet Container image "nginx:1.25" already present on machine
Normal Created 29s kubelet Created container nginx
Normal Started 29s kubelet Started container nginxMari kita buat Pod yang akan fail Liveness Probe:
apiVersion: v1
kind: Pod
metadata:
name: liveness-failure
spec:
containers:
- name: liveness-test
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5Pod ini:
/tmp/healthy/tmp/healthyApply dan watch:
sudo kubectl apply -f liveness-failure.yml
sudo kubectl get pods -wSetelah sekitar 30 detik, kalian akan melihat container restart:
NAME READY STATUS RESTARTS AGE
liveness-failure 1/1 Running 0 20s
liveness-failure 1/1 Running 1 45s
liveness-failure 1/1 Running 2 70sCek event:
sudo kubectl describe pod liveness-failureKalian akan melihat event yang menunjukkan Liveness Probe gagal dan container di-restart:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m default-scheduler Successfully assigned default/liveness-failure to node1
Normal Pulled 2m kubelet Container image "busybox" already present on machine
Normal Created 2m kubelet Created container liveness-test
Normal Started 2m kubelet Started container liveness-test
Warning Unhealthy 90s (x3 over 100s) kubelet Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
Normal Killing 90s kubelet Container liveness-test failed liveness probe, will be restartedBuat Pod dengan Liveness dan Readiness Probe:
apiVersion: v1
kind: Pod
metadata:
name: readiness-demo
labels:
app: readiness-demo
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 3Buat Service untuk melihat bagaimana Readiness Probe mempengaruhi traffic:
apiVersion: v1
kind: Service
metadata:
name: readiness-service
spec:
selector:
app: readiness-demo
ports:
- protocol: TCP
port: 80
targetPort: 80Apply keduanya:
sudo kubectl apply -f readiness-probe.yml
sudo kubectl apply -f readiness-service.ymlCek endpoint:
sudo kubectl get endpoints readiness-serviceKalian akan melihat Pod IP ditambahkan ke endpoint hanya setelah Readiness Probe succeed:
NAME ENDPOINTS AGE
readiness-service 10.42.0.15:80 30sBuat Pod dengan Startup Probe:
apiVersion: v1
kind: Pod
metadata:
name: startup-demo
spec:
containers:
- name: slow-app
image: nginx:1.25
ports:
- containerPort: 80
startupProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 0
periodSeconds: 10
failureThreshold: 30 # 30 * 10 = 300 detik (5 menit) untuk start
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 0
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 0
periodSeconds: 10Konfigurasi ini:
Buat Pod dengan TCP Socket Probe:
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
value: "password123"
ports:
- containerPort: 3306
livenessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 10
periodSeconds: 5Ini memeriksa apakah MySQL menerima connection di port 3306.
Buat Pod dengan custom health check script:
apiVersion: v1
kind: Pod
metadata:
name: exec-probe-demo
spec:
containers:
- name: app
image: busybox
command:
- /bin/sh
- -c
- |
# Buat health check script
cat > /usr/local/bin/health-check.sh << 'EOF'
#!/bin/sh
# Custom health check logic
if [ -f /tmp/healthy ]; then
exit 0
else
exit 1
fi
EOF
chmod +x /usr/local/bin/health-check.sh
# Jaga container tetap berjalan dan buat healthy file
touch /tmp/healthy
sleep 3600
livenessProbe:
exec:
command:
- /usr/local/bin/health-check.sh
initialDelaySeconds: 5
periodSeconds: 5Di production, kalian biasanya menggunakan ketiga tipe Probe bersama-sama:
apiVersion: v1
kind: Pod
metadata:
name: complete-probes
labels:
app: web-app
spec:
containers:
- name: app
image: nginx:1.25
ports:
- containerPort: 80
# Startup Probe - untuk slow-starting application
startupProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 0
periodSeconds: 10
failureThreshold: 30 # 5 menit untuk start
# Liveness Probe - restart jika unhealthy
livenessProbe:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 0
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
# Readiness Probe - remove dari load balancer jika not ready
readinessProbe:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 0
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 3Buat endpoint terpisah untuk Liveness dan Readiness:
/healthz - Liveness check (basic health)/ready - Readiness check (dependency ready)livenessProbe:
httpGet:
path: /healthz
port: 8080
readinessProbe:
httpGet:
path: /ready
port: 8080Probe check harus cepat dan tidak mengkonsumsi resource signifikan:
# Bagus - simple check
livenessProbe:
httpGet:
path: /healthz
port: 8080
timeoutSeconds: 1 # Fast timeout
# Buruk - complex check yang mungkin timeout
livenessProbe:
exec:
command:
- /bin/sh
- -c
- "complex-database-query.sh" # Terlalu lambat!
timeoutSeconds: 1Beri Probe cukup waktu untuk complete, tapi tidak terlalu banyak:
livenessProbe:
httpGet:
path: /healthz
port: 8080
timeoutSeconds: 3 # Reasonable timeout
periodSeconds: 10 # Check setiap 10 detik
failureThreshold: 3 # Fail 3 kali sebelum restartJangan buat Liveness Probe menunggu terlalu lama - gunakan Startup Probe:
# Pendekatan yang bagus
startupProbe:
httpGet:
path: /healthz
port: 8080
periodSeconds: 10
failureThreshold: 30 # 5 menit untuk start
livenessProbe:
httpGet:
path: /healthz
port: 8080
periodSeconds: 10
failureThreshold: 3 # Quick failure setelah startupLiveness Probe hanya harus check apakah aplikasi itu sendiri sehat:
# Buruk - check external database
livenessProbe:
exec:
command:
- check-database-connection.sh # Jangan lakukan ini!
# Bagus - check hanya application health
livenessProbe:
httpGet:
path: /healthz # Return 200 jika app berjalan
port: 8080Check external dependency di Readiness Probe:
# Bagus - Readiness check dependency
readinessProbe:
exec:
command:
- check-database-connection.sh # OK untuk readinessBeri aplikasi kalian waktu untuk start sebelum Probe pertama:
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30 # Tunggu 30 detik sebelum check pertama
periodSeconds: 10Readiness Probe memastikan traffic hanya dikirim ke ready Pod:
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 1 # Remove dari load balancer immediatelyMenjalankan Pod tanpa Probe berarti Kubernetes tidak bisa mendeteksi failure.
Problem: Aplikasi crash tapi container tetap berjalan. Kubernetes tidak tahu dan tetap mengirim traffic.
Solusi: Selalu implementasikan setidaknya Liveness dan Readiness Probe.
Menggunakan endpoint yang sama tidak membedakan antara "app is alive" dan "app is ready".
Problem: Database down, Readiness fail, tapi Liveness juga fail dan restart container secara tidak perlu.
Solusi: Gunakan endpoint berbeda dengan logic berbeda.
Setting timeout terlalu pendek menyebabkan false failure.
Problem: Probe timeout selama operasi normal, menyebabkan restart yang tidak perlu.
Solusi: Set realistic timeout berdasarkan response time aplikasi kalian.
Liveness Probe hanya harus check aplikasi itu sendiri.
Problem: Database temporarily unavailable, Liveness fail, container restart, tapi database masih unavailable - restart loop.
Solusi: Check external dependency hanya di Readiness Probe.
Menggunakan initialDelaySeconds tinggi di Liveness Probe delay failure detection.
Problem: Aplikasi crash setelah startup, tapi Liveness Probe menunggu 5 menit sebelum check.
Solusi: Gunakan Startup Probe untuk initialization, jaga Liveness Probe responsive.
Heavy Probe check mengkonsumsi resource dan memperlambat aplikasi.
Problem: Liveness Probe menjalankan complex database query setiap 5 detik, overload database.
Solusi: Jaga Probe check tetap lightweight dan cepat.
sudo kubectl describe pod <nama-pod>Cari section Probe:
Containers:
app:
Liveness: http-get http://:8080/healthz delay=0s timeout=1s period=10s #success=1 #failure=3
Readiness: http-get http://:8080/ready delay=0s timeout=1s period=5s #success=1 #failure=3
Startup: http-get http://:8080/healthz delay=0s timeout=1s period=10s #success=1 #failure=30sudo kubectl get events --sort-by='.lastTimestamp'Cari event seperti:
Warning Unhealthy Liveness probe failed: HTTP probe failed with statuscode: 500
Warning Unhealthy Readiness probe failed: Get http://10.42.0.15:8080/ready: dial tcp 10.42.0.15:8080: connect: connection refusedsudo kubectl get pods -wFrequent restart menunjukkan Liveness Probe failure:
NAME READY STATUS RESTARTS AGE
app-pod 1/1 Running 5 10mPada episode 10 ini, kita telah membahas Probe di Kubernetes secara mendalam. Kita sudah belajar tentang tiga tipe Probe (Liveness, Readiness, dan Startup), tujuan mereka, dan cara mengkonfigurasi mereka secara efektif.
Key takeaway:
Probe sangat essential untuk membangun aplikasi resilient dan self-healing di Kubernetes. Dengan properly mengkonfigurasi Probe, kalian memastikan bahwa Kubernetes bisa otomatis mendeteksi dan recover dari failure, maintain high availability, dan menyediakan experience yang lebih baik untuk user kalian.
Bagaimana, makin jelas kan tentang Probe di Kubernetes? Pada episode berikutnya (Episode 11), kita akan membahas konsep fundamental lain yang membawa Kubernetes lebih dekat ke janji intinya yaitu infrastruktur yang dapat memperbaiki diri sendiri: ReplicationController.
ReplicationController adalah salah satu mekanisme paling awal di Kubernetes yang dirancang untuk memastikan bahwa sejumlah replika pod yang ditentukan selalu berjalan. Alih-alih membuat dan memantau pod satu per satu secara manual, Anda mendeklarasikan jumlah replika yang diinginkan, dan Kubernetes terus berupaya mempertahankan keadaan tersebut. Jika sebuah pod mengalami crash, terhapus, atau sebuah node gagal, ReplicationController secara otomatis membuat pod baru untuk menggantikannya.
Dengan kata lain, ReplicationController memperkenalkan ide penting di Kubernetes:
Keadaan yang diinginkan secara deklaratif.
Anda tidak memberi tahu Kubernetes bagaimana cara memulihkan diri ketika terjadi kerusakan—Anda cukup mendeklarasikan berapa banyak pod yang harus ada, dan Kubernetes memastikan sistem selalu kembali ke keadaan tersebut.