Pod & Container: Probes
Versi Bahasa Indonesia. Baca dalam Bahasa Inggris
Di Kubernetes, probe adalah mekanisme yang digunakan untuk menentukan kesehatan dan kesiapan container yang berjalan di dalam pod. Probe didefinisikan dalam spesifikasi pod dan dilakukan secara periodik untuk memastikan bahwa container di dalam pod berjalan dengan benar.
Tipe Probe
Kubernetes menyediakan tiga tipe probe untuk memonitor dan mengelola kesehatan container kita.
Liveness Probe
Probe ini memeriksa apakah container masih hidup (berjalan dengan benar). Jika gagal, Kubernetes akan me-restart container. Misalnya, liveness probe dapat mendeteksi deadlock, di mana aplikasi berjalan tetapi tidak dapat melanjutkan proses. Me-restart container dalam keadaan seperti itu dapat membantu membuat aplikasi lebih tersedia meskipun ada bug.
Readiness Probe
Probe ini memeriksa apakah container siap menerima traffic. Jika gagal, Kubernetes menghapus pod dari endpoint Service. Misalnya, aplikasi membutuhkan waktu untuk memuat ulang konfigurasi dan menjadi tidak tersedia sementara. Dalam kasus seperti itu, Anda tidak ingin mematikan aplikasi, tetapi Anda juga tidak ingin mengirim permintaan ke aplikasi tersebut.
Startup Probe
Probe ini memeriksa apakah container yang memulai dengan lambat telah sepenuhnya dimulai. Ini memberikan waktu tambahan bagi container untuk sepenuhnya mulai sebelum pemeriksaan liveness atau readiness dimulai. Jika gagal, Kubernetes akan me-restart container. Misalnya, aplikasi membutuhkan waktu 90 detik untuk memulai. Startup probe mencegah Kubernetes menganggapnya "mati" selama waktu tersebut.
Cara Mendefinisikan Status Probe
Dan untuk setiap probe, ada tiga cara untuk mendefinisikan status probe:
Command Execution (exec)
Menjalankan perintah di dalam container.
exec:
command:
- cat
- /tmp/ready
initialDelaySeconds: 5
periodSeconds: 10- Sukses: Kode keluar
0. - Gagal: Kode keluar bukan nol.
HTTP Request (httpGet)
Mengirim permintaan HTTP GET ke endpoint tertentu di dalam container.
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10- Sukses: Status HTTP 200-399.
- Gagal: Kode status lainnya.
TCP Socket (tcpSocket)
Membuka koneksi TCP pada port tertentu.
tcpSocket:
port: 5432
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 30- Sukses: Port terbuka.
- Gagal: Port tertutup.
Contoh
Mari kita tambahkan liveness probe dan readiness probe untuk aplikasi simple-go kita. Untuk readiness probe, kita akan menggunakan endpoint root /. Edit file deployment.yaml dan tambahkan ini
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 5
periodSeconds: 10Untuk liveness probe, kita akan membuat endpoint baru /health. Endpoint ini akan memeriksa variable status jika true maka akan mengembalikan respons dengan HTTP Code 200, dan jika false akan mengembalikan respons dengan HTTP Code 500.
Edit file main.go untuk menambahkan endpoint /health baru.
var status = truesrv.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
if status {
w.WriteHeader(http.StatusOK)
} else {
w.WriteHeader(http.StatusInternalServerError)
}
})Kemudian tambahkan konfigurasi liveness probe di file deployment.yaml.
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10Bangun ulang aplikasi menggunakan docker lalu terapkan ulang file deployment.yaml menggunakan kubectl apply.
β docker build --tag simple-go .
[+] Building 13.1s (13/13) FINISHED
...β kubectl apply -f deployment.yaml
deployment.apps/simple-go configuredAplikasi Anda akan berfungsi dengan liveness probe dan readiness probe.
Simulasi Kegagalan Liveness
Mari kita edit lagi endpoint /health aplikasi kita. Kali ini kita menambahkan counter jika counter di atas ambang batas maka akan mengembalikan respons dengan HTTP code 500.
var counter = 0srv.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
counter++
if counter > 10 {
status = false
}
if status {
w.WriteHeader(http.StatusOK)
} else {
w.WriteHeader(http.StatusInternalServerError)
}
})Bangun ulang aplikasi menggunakan docker lalu restart deployment Anda. Setelah beberapa menit, periksa daftar pod dan Anda akan melihat pod restart beberapa kali.
β kubectl get pods
NAME READY STATUS RESTARTS AGE
simple-go-75ffcc845f-4xzsc 1/1 Running 4 (11s ago) 8m52s
simple-go-75ffcc845f-5hzl5 1/1 Running 4 (22s ago) 9m2s
simple-go-75ffcc845f-khnsz 0/1 Running 4 (1s ago) 8m41sDan jika Anda memeriksa events, Anda akan melihat pod Killed karena kegagalan liveness probe.
β kubectl events | grep probe
2m56s (x3 over 7m16s) Normal Killing Pod/simple-go-75ffcc845f-5hzl5 Container server failed liveness probe, will be restarted
2m45s (x3 over 7m5s) Normal Killing Pod/simple-go-75ffcc845f-4xzsc Container server failed liveness probe, will be restarted
2m35s (x3 over 6m55s) Normal Killing Pod/simple-go-75ffcc845f-khnsz Container server failed liveness probe, will be restarted
66s (x10 over 7m36s) Warning Unhealthy Pod/simple-go-75ffcc845f-5hzl5 Liveness probe failed: HTTP probe failed with statuscode: 500
45s (x11 over 7m25s) Warning Unhealthy Pod/simple-go-75ffcc845f-4xzsc Liveness probe failed: HTTP probe failed with statuscode: 500
35s (x11 over 7m15s) Warning Unhealthy Pod/simple-go-75ffcc845f-khnsz Liveness probe failed: HTTP probe failed with statuscode: 500Referensi
- https://kubernetes.io/docs/concepts/configuration/liveness-readiness-startup-probes/
- https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
Last updated on