Skip to content

Commit b8e5d67

Browse files
authored
Merge pull request #21535 from girikuncoro/id/probes
Localize liveness readiness startup probes page into Bahasa Indonesia
2 parents 5071b1a + e480b8f commit b8e5d67

File tree

4 files changed

+438
-0
lines changed

4 files changed

+438
-0
lines changed
Lines changed: 374 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,374 @@
1+
---
2+
title: Mengatur Probe Liveness, Readiness dan Startup
3+
content_template: templates/task
4+
weight: 110
5+
---
6+
7+
{{% capture overview %}}
8+
9+
Laman ini memperlihatkan bagaimana cara untuk mengatur _probe liveness_, _readiness_, dan
10+
_startup_ untuk Container.
11+
12+
_Probe liveness_ digunakan oleh [kubelet](/docs/admin/kubelet/) untuk mengetahui
13+
kapan perlu mengulang kembali (_restart_) sebuah Container. Sebagai contoh, _probe liveness_
14+
dapat mendeteksi _deadlock_, ketika aplikasi sedang berjalan tapi tidak dapat berfungsi dengan baik.
15+
Mengulang Container dengan _state_ tersebut dapat membantu ketersediaan aplikasi yang lebih baik
16+
walaupun ada kekutu (_bug_).
17+
18+
_Probe readiness_ digunakan oleh kubelet untuk mengetahui kapan sebuah Container telah siap untuk
19+
menerima lalu lintas jaringan (_traffic_). Suatu Pod dianggap siap saat semua Container di dalamnya telah
20+
siap. Sinyal ini berguna untuk mengontrol Pod-Pod mana yang digunakan sebagai _backend_ dari Service.
21+
Ketika Pod dalam kondisi tidak siap, Pod tersebut dihapus dari Service _load balancer_.
22+
23+
_Probe startup_ digunakan oleh kubelet untuk mengetahui kapan sebuah aplikasi Container telah mulai berjalan.
24+
Jika _probe_ tersebut dinyalakan, _probe_ akan menonaktifkan pemeriksaan _liveness_ dan _readiness_ sampai
25+
berhasil, kamu harus memastikan _probe_ tersebut tidak mengganggu _startup_ dari aplikasi.
26+
Mekanisme ini dapat digunakan untuk mengadopsi pemeriksaan _liveness_ pada saat memulai Container yang lambat,
27+
untuk menghindari Container dimatikan oleh kubelet sebelum Container mulai dan berjalan.
28+
29+
{{% /capture %}}
30+
31+
{{% capture prerequisites %}}
32+
33+
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
34+
35+
{{% /capture %}}
36+
37+
{{% capture steps %}}
38+
39+
## Mendefinisikan perintah liveness
40+
41+
Kebanyakan aplikasi yang telah berjalan dalam waktu lama pada akhirnya akan
42+
bertransisi ke _state_ yang rusak (_broken_), dan tidak dapat pulih kecuali diulang kembali.
43+
Kubernetes menyediakan _probe liveness_ untuk mendeteksi dan memperbaiki situasi tersebut.
44+
45+
Pada latihan ini, kamu akan membuat Pod yang menjalankan Container dari image
46+
`k8s.gcr.io/busybox`. Berikut ini adalah berkas konfigurasi untuk Pod tersebut:
47+
48+
{{< codenew file="pods/probe/exec-liveness.yaml" >}}
49+
50+
Pada berkas konfigurasi di atas, kamu dapat melihat bahwa Pod memiliki satu `Container`.
51+
_Field_ `periodSeconds` menentukan bahwa kubelet harus melakukan _probe liveness_ setiap 5 detik.
52+
_Field_ `initialDelaySeconds` memberitahu kubelet untuk menunggu 5 detik sebelum mengerjakan
53+
_probe_ yang pertama. Untuk mengerjakan _probe_, kubelet menjalankan perintah `cat /tmp/healthy`
54+
pada Container tujuan. Jika perintah berhasil, kode 0 akan dikembalikan, dan kubelet menganggap
55+
Container sedang dalam kondisi hidup (_alive_) dan sehat (_healthy_). Jika perintah mengembalikan
56+
kode selain 0, maka kubelet akan mematikan Container dan mengulangnya kembali.
57+
58+
Saat dimulai, Container akan menjalankan perintah berikut:
59+
60+
```shell
61+
/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600"
62+
```
63+
64+
Container memiliki berkas `/tmp/healthy` pada saat 30 detik pertama setelah dijalankan.
65+
Kemudian, perintah `cat /tmp/healthy` mengembalikan kode sukses. Namun setelah 30 detik,
66+
`cat /tmp/healthy` mengembalikan kode gagal.
67+
68+
Buatlah sebuah Pod:
69+
70+
```shell
71+
kubectl apply -f https://k8s.io/examples/pods/probe/exec-liveness.yaml
72+
```
73+
74+
Dalam 30 detik pertama, lihatlah _event_ dari Pod:
75+
76+
```shell
77+
kubectl describe pod liveness-exec
78+
```
79+
80+
Keluaran dari perintah tersebut memperlihatkan bahwa belum ada _probe liveness_ yang gagal:
81+
82+
```
83+
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
84+
--------- -------- ----- ---- ------------- -------- ------ -------
85+
24s 24s 1 {default-scheduler } Normal Scheduled Successfully assigned liveness-exec to worker0
86+
23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Pulling pulling image "k8s.gcr.io/busybox"
87+
23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Pulled Successfully pulled image "k8s.gcr.io/busybox"
88+
23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Created Created container with docker id 86849c15382e; Security:[seccomp=unconfined]
89+
23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Started Started container with docker id 86849c15382e
90+
```
91+
92+
Setelah 35 detik, lihatlah lagi _event_ Pod tersebut:
93+
94+
```shell
95+
kubectl describe pod liveness-exec
96+
```
97+
98+
Baris terakhir dari keluaran tersebut memperlihatkan pesan bahwa _probe liveness_
99+
mengalami kegagalan, dan Container telah dimatikan dan dibuat ulang.
100+
101+
```
102+
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
103+
--------- -------- ----- ---- ------------- -------- ------ -------
104+
37s 37s 1 {default-scheduler } Normal Scheduled Successfully assigned liveness-exec to worker0
105+
36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Pulling pulling image "k8s.gcr.io/busybox"
106+
36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Pulled Successfully pulled image "k8s.gcr.io/busybox"
107+
36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Created Created container with docker id 86849c15382e; Security:[seccomp=unconfined]
108+
36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Started Started container with docker id 86849c15382e
109+
2s 2s 1 {kubelet worker0} spec.containers{liveness} Warning Unhealthy Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
110+
```
111+
112+
Tunggu 30 detik lagi, dan verifikasi bahwa Container telah diulang kembali:
113+
114+
```shell
115+
kubectl get pod liveness-exec
116+
```
117+
118+
Keluaran perintah tersebut memperlihatkan bahwa jumlah `RESTARTS` telah meningkat:
119+
120+
```
121+
NAME READY STATUS RESTARTS AGE
122+
liveness-exec 1/1 Running 1 1m
123+
```
124+
125+
## Mendefinisikan probe liveness dengan permintaan HTTP
126+
127+
Jenis kedua dari _probe liveness_ menggunakan sebuah permintaan GET HTTP. Berikut ini
128+
berkas konfigurasi untuk Pod yang menjalankan Container dari image `k8s.gcr.io/liveness`.
129+
130+
{{< codenew file="pods/probe/http-liveness.yaml" >}}
131+
132+
Pada berkas konfigurasi tersebut, kamu dapat melihat Pod memiliki sebuah Container.
133+
_Field_ `periodSeconds` menentukan bahwa kubelet harus mengerjakan _probe liveness_ setiap 3 detik.
134+
_Field_ `initialDelaySeconds` memberitahu kubelet untuk menunggu 3 detik sebelum mengerjakan
135+
_probe_ yang pertama. Untuk mengerjakan _probe_ tersebut, kubelet mengirimkan sebuah permintaan
136+
GET HTTP ke server yang sedang berjalan di dalam Container dan mendengarkan (_listen_) pada porta 8080.
137+
Jika _handler path_ `/healthz` yang dimiliki server mengembalikan kode sukses, kubelet menganggap
138+
Container sedang dalam kondisi hidup dan sehat. Jika _handler_ mengembalikan kode gagal,
139+
kubelet mematikan Container dan mengulangnya kembali.
140+
141+
Kode yang lebih besar atau sama dengan 200 dan kurang dari 400 mengindikasikan kesuksesan.
142+
Kode selain ini mengindikasikan kegagalan.
143+
144+
Kamu dapat melihat kode program untuk server ini pada [server.go](https://github.com/kubernetes/kubernetes/blob/{{< param "githubbranch" >}}/test/images/agnhost/liveness/server.go).
145+
146+
Untuk 10 detik pertama setelah Container hidup (_alive_), _handler_ `/healthz` mengembalikan
147+
status 200. Setelah itu, _handler_ mengembalikan status 500.
148+
149+
```go
150+
http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
151+
duration := time.Now().Sub(started)
152+
if duration.Seconds() > 10 {
153+
w.WriteHeader(500)
154+
w.Write([]byte(fmt.Sprintf("error: %v", duration.Seconds())))
155+
} else {
156+
w.WriteHeader(200)
157+
w.Write([]byte("ok"))
158+
}
159+
})
160+
```
161+
162+
Pemeriksaan kesehatan (_health check_) dilakukan kubelet 3 detik setelah Container dimulai,
163+
sehingga beberapa pemeriksaaan pertama akan berhasil. Namun setelah 10 detik,
164+
pemeriksaan akan gagal, dan kubelet akan mematikan dan mengulang Container kembali.
165+
166+
Untuk mencoba pemeriksaan _liveness_ HTTP, marilah membuat sebuah Pod:
167+
168+
```shell
169+
kubectl apply -f https://k8s.io/examples/pods/probe/http-liveness.yaml
170+
```
171+
172+
Setelah 10 detik, lihatlah _event_ Pod untuk memverifikasi bahwa _probe liveness_
173+
telah gagal dan Container telah diulang kembali:
174+
175+
```shell
176+
kubectl describe pod liveness-http
177+
```
178+
179+
Untuk rilis sebelum v1.13 (termasuk v1.13), jika variabel lingkungan
180+
`http_proxy` (atau `HTTP_PROXY`) telah diatur pada Node dimana Pod
181+
berjalan, _probe liveness_ HTTP akan menggunakan proksi tersebut.
182+
Untuk rilis setelah v1.13, pengaturan variabel lingkungan pada proksi HTTP lokal
183+
tidak mempengaruhi _probe liveness_ HTTP.
184+
185+
## Mendefinisikan probe liveness TCP
186+
187+
Jenis ketiga dari _probe liveness_ menggunakaan sebuah soket TCP. Dengan konfigurasi ini,
188+
kubelet akan mencoba untuk membuka soket pada Container kamu dengan porta tertentu.
189+
Jika koneksi dapat terbentuk dengan sukses, maka Container dianggap dalam kondisi sehat.
190+
Namun jika tidak berhasil terbentuk, maka Container dianggap gagal.
191+
192+
{{< codenew file="pods/probe/tcp-liveness-readiness.yaml" >}}
193+
194+
Seperti yang terlihat, konfigurasi untuk pemeriksaan TCP cukup mirip dengan
195+
pemeriksaan HTTP. Contoh ini menggunakan _probe readiness_ dan _liveness_.
196+
_Probe readiness_ yang pertama akan dikirimkan oleh kubelet, 5 detik setelah
197+
Container mulai dijalankan. Container akan coba dihubungkan oleh kubelet dengan
198+
`goproxy` pada porta 8080. Jika _probe_ berhasil, maka Pod akan ditandai menjadi
199+
_ready_. Pemeriksaan ini akan dilanjutkan oleh kubelet setiap 10 detik.
200+
201+
Selain _probe readiness_, _probe liveness_ juga termasuk di dalam konfigurasi.
202+
_Probe liveness_ yang pertama akan dijalankan oleh kubelet, 15 detik setelah Container
203+
mulai dijalankan. Sama seperti _probe readiness_, kubelet akan mencoba untuk
204+
terhubung dengan Container `goproxy` pada porta 8080. Jika _probe liveness_ gagal,
205+
maka Container akan diulang kembali.
206+
207+
Untuk mencoba pemeriksaan _liveness_ TCP, marilah membuat sebuah Pod:
208+
209+
```shell
210+
kubectl apply -f https://k8s.io/examples/pods/probe/tcp-liveness-readiness.yaml
211+
```
212+
213+
Setelah 15 detik, lihatlah _event_ Pod untuk memverifikasi _probe liveness_ tersebut:
214+
215+
```shell
216+
kubectl describe pod goproxy
217+
```
218+
219+
## Menggunakan sebuah porta dengan nama
220+
221+
Kamu dapat menggunakan
222+
[ContainerPort](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#containerport-v1-core)
223+
dengan nama untuk melakukan pemeriksaan _liveness_ HTTP atau TCP:
224+
225+
```yaml
226+
ports:
227+
- name: liveness-port
228+
containerPort: 8080
229+
hostPort: 8080
230+
231+
livenessProbe:
232+
httpGet:
233+
path: /healthz
234+
port: liveness-port
235+
```
236+
237+
## Melindungi Container yang lambat untuk dimulai dengan probe startup {#mendefinisikan-probe-startup}
238+
239+
Terkadang kamu harus berurusan dengan aplikasi peninggalan (_legacy_) yang
240+
memerlukan waktu tambahan untuk mulai berjalan pada saat pertama kali diinisialisasi.
241+
Pada kasus ini, cukup rumit untuk mengatur parameter _probe liveness_ tanpa
242+
mengkompromikan respons yang cepat terhadap _deadlock_ yang memotivasi digunakannya
243+
probe_ tersebut. Triknya adalah mengatur _probe startup_ dengan perintah yang sama,
244+
baik pemeriksaan HTTP ataupun TCP, dengan `failureThreshold * periodSeconds` yang
245+
mencukupi untuk kemungkinan waktu memulai yang terburuk.
246+
247+
Sehingga, contoh sebelumnya menjadi:
248+
249+
```yaml
250+
ports:
251+
- name: liveness-port
252+
containerPort: 8080
253+
hostPort: 8080
254+
255+
livenessProbe:
256+
httpGet:
257+
path: /healthz
258+
port: liveness-port
259+
failureThreshold: 1
260+
periodSeconds: 10
261+
262+
startupProbe:
263+
httpGet:
264+
path: /healthz
265+
port: liveness-port
266+
failureThreshold: 30
267+
periodSeconds: 10
268+
```
269+
270+
Berkat _probe startup_, aplikasi akan memiliki paling lambat 5 menit (30 * 10 = 300 detik)
271+
untuk selesai memulai.
272+
Ketika _probe startup_ telah berhasil satu kali, maka _probe liveness_ akan
273+
mengambil alih untuk menyediakan respons cepat terhadap _deadlock_ Container.
274+
Jika _probe startup_ tidak pernah berhasil, maka Container akan dimatikan setelah
275+
300 detik dan perilakunya akan bergantung pada `restartPolicy` yang dimiliki Pod.
276+
277+
## Mendefinisikan probe readiness
278+
279+
Terkadang aplikasi tidak dapat melayani lalu lintas jaringan sementara.
280+
Contohnya, aplikasi mungkin perlu untuk memuat data besar atau berkas konfigurasi
281+
saat dimulai, atau aplikasi bergantung pada layanan eksternal setelah dimulai.
282+
Pada kasus-kasus ini, kamu tidak ingin mematikan aplikasi, tetapi kamu tidak
283+
ingin juga mengirimkan permintaan ke aplikasi tersebut. Kubernetes menyediakan
284+
_probe readiness_ sebagai solusinya. Sebuah Pod dengan Container yang melaporkan
285+
dirinya tidak siap, tidak akan menerima lalu lintas jaringan dari Kubernetes Service.
286+
287+
{{< note >}}
288+
_Probe readiness_ dijalankan di dalam Container selama siklus hidupnya.
289+
{{< /note >}}
290+
291+
_Probe readiness_ memiliki pengaturan yang mirip dengan _probe liveness_. Perbedaan
292+
satu-satunya adalah kamu menggunakan _field_ `readinessProbe`, bukan _field_ `livenessProbe`.
293+
294+
```yaml
295+
readinessProbe:
296+
exec:
297+
command:
298+
- cat
299+
- /tmp/healthy
300+
initialDelaySeconds: 5
301+
periodSeconds: 5
302+
```
303+
304+
Pengaturan untuk _probe readiness_ untuk HTTP dan TCP juga sama persis dengan
305+
pengaturan untuk _probe liveness_.
306+
307+
_Probe readiness_ dan _liveness_ dapat digunakan secara bersamaan untuk
308+
Container yang sama. Apabila keduanya digunakan sekaligus, lalu lintas jaringan
309+
tidak akan sampai ke Container yang belum siap, dan Container akan diulang kembali
310+
(_restart_) saat mengalami kegagalan.
311+
312+
## Mengatur Probe
313+
314+
{{< comment >}}
315+
Nantinya beberapa bagian dari bab ini dapat berpindah ke topik konsep.
316+
{{< /comment >}}
317+
318+
[Probe](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#probe-v1-core) memiliki
319+
beberapa _field_ yang dapat digunakan untuk mengendalikan pemeriksaan _liveness_ dan _readiness_
320+
secara presisi.
321+
322+
* `initialDelaySeconds`: Durasi dalam detik setelah Container dimulai,
323+
sebelum _probe liveness_ atau _readiness_ diinisiasi. Nilai bawaannya adalah 0 detik. Nilai minimalnya adalah 0.
324+
* `periodSeconds`: Seberapa sering (dalam detik) _probe_ dijalankan. Nilai bawaannya adalah 10 detik.
325+
Nilai minimalnya adalah 0.
326+
* `timeoutSeconds`: Durasi dalam detik setelah _probe_ mengalami _timeout_. Nilai bawaannya adalah 1 detik.
327+
Nilai minimalnya adalah 0.
328+
* `successThreshold`: Jumlah minimal sukses yang berurutan untuk _probe_ dianggap berhasil
329+
setelah mengalami kegagalan. Nilai bawaannya adalah 1. Nilanya harus 1 untuk _liveness_.
330+
Nilai minimalnya adalah 1.
331+
* `failureThreshold`: Ketika sebuah Pod dimulai dan _probe_ mengalami kegagalan, Kubernetes
332+
akan mencoba beberapa kali sesuai nilai `failureThreshold` sebelum menyerah. Menyerah dalam
333+
kasus _probe liveness_ berarti Container akan diulang kembali. Untuk _probe readiness_, menyerah
334+
akan menandai Pod menjadi "tidak siap" (_Unready_). Nilai bawaannya adalah 3. Nilai minimalnya adalah 1.
335+
336+
[_Probe_ HTTP](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#httpgetaction-v1-core)
337+
memiliki _field-field_ tambahan yang bisa diatur melalui `httpGet`:
338+
339+
* `host`: Nama dari host yang akan terhubung, nilai bawaannya adalah IP dari Pod. Kamu mungkin
340+
juga ingin mengatur "Host" pada httpHeaders.
341+
* `scheme`: Skema yang digunakan untuk terhubung pada host (HTTP atau HTTPS). Nilai bawaannya adalah HTTP.
342+
* `path`: _Path_ untuk mengakses server HTTP.
343+
* `httpHeaders`: _Header_ khusus yang diatur dalam permintaan HTTP. HTTP memperbolehkan _header_ yang berulang.
344+
* `port`: Nama atau angka dari porta untuk mengakses Container. Angkanya harus ada di antara 1 sampai 65535.
345+
346+
Untuk sebuah _probe_ HTTP, kubelet mengirimkan permintaan HTTP untuk _path_ yang ditentukan
347+
dan porta untuk mengerjakan pemeriksaan. _Probe_ dikirimkan oleh kubelet untuk alamat IP Pod,
348+
kecuali saat alamat digantikan oleh _field_ opsional pada `httpGet`. Jika _field_ `scheme`
349+
diatur menjadi `HTTPS`, maka kubelet mengirimkan permintaan HTTPS dan melewati langkah verifikasi
350+
sertifikat. Pada skenario kebanyakan, kamu tidak menginginkan _field_ `host`.
351+
Berikut satu skenario yang memerlukan `host`. Misalkan Container mendengarkan permintaan
352+
melalui 127.0.0.1 dan _field_ `hostNetwork` pada Pod bernilai true. Kemudian `host`, melalui
353+
`httpGet`, harus diatur menjadi 127.0.0.1. Jika Pod kamu bergantung pada host virtual, dimana
354+
untuk kasus-kasus umum, kamu tidak perlu menggunakan `host`, tetapi perlu mengatur _header_
355+
`Host` pada `httpHeaders`.
356+
357+
Untuk _probe_ TCP, kubelet membuat koneksi _probe_ pada Node, tidak pada Pod, yang berarti bahwa
358+
kamu tidak menggunakan nama Service di dalam parameter `host` karena kubelet tidak bisa
359+
me-_resolve_-nya.
360+
361+
{{% /capture %}}
362+
363+
{{% capture whatsnext %}}
364+
365+
* Pelajari lebih lanjut tentang
366+
[Probe Container](/id/docs/concepts/workloads/pods/pod-lifecycle/#container-probes).
367+
368+
Kamu juga dapat membaca rujukan API untuk:
369+
370+
* [Pod](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#pod-v1-core)
371+
* [Container](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#container-v1-core)
372+
* [Probe](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#probe-v1-core)
373+
374+
{{% /capture %}}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
labels:
5+
test: liveness
6+
name: liveness-exec
7+
spec:
8+
containers:
9+
- name: liveness
10+
image: k8s.gcr.io/busybox
11+
args:
12+
- /bin/sh
13+
- -c
14+
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
15+
livenessProbe:
16+
exec:
17+
command:
18+
- cat
19+
- /tmp/healthy
20+
initialDelaySeconds: 5
21+
periodSeconds: 5

0 commit comments

Comments
 (0)