Portal/Notes πŸ“
Cka

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: 10

Untuk 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 = true
srv.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: 10

Bangun 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 configured

Aplikasi 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 = 0
srv.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)      8m41s

Dan 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: 500

Referensi


Edit on GitHub

Last updated on

Pod & Container: Probes | Faisal Affan