Skip to content

Commit c6d8fa9

Browse files
authored
Merge pull request #20195 from ariscahyadi/id-local-schedule-framework
ID Localization for Scheduling Framework.
2 parents 75137d7 + bfe50a6 commit c6d8fa9

File tree

1 file changed

+249
-0
lines changed

1 file changed

+249
-0
lines changed
Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,249 @@
1+
---
2+
title: Kerangka Kerja Penjadwalan (Scheduling Framework)
3+
content_template: templates/concept
4+
weight: 60
5+
---
6+
7+
{{% capture overview %}}
8+
9+
{{< feature-state for_k8s_version="1.15" state="alpha" >}}
10+
11+
Kerangka kerja penjadwalan (_Scheduling Framework_) adalah arsitektur yang dapat
12+
dipasang (_pluggable_) pada penjadwal Kubernetes untuk membuat kustomisasi
13+
penjadwal lebih mudah. Hal itu dilakukan dengan menambahkan satu kumpulan "plugin"
14+
API ke penjadwal yang telah ada. _Plugin_ dikompilasi ke dalam penjadwal.
15+
Beberapa API memungkinkan sebagian besar fitur penjadwalan diimplementasikan
16+
sebagai _plugin_, sambil tetap mempertahankan penjadwalan "inti" sederhana dan
17+
terpelihara. Silahkan merujuk pada [proposal desain dari kerangka penjadwalan]
18+
[kep] untuk informasi teknis lebih lanjut tentang desain kerangka kerja
19+
tersebut.
20+
21+
[kep]: https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/20180409-scheduling-framework.md
22+
23+
{{% /capture %}}
24+
25+
{{% capture body %}}
26+
27+
# Alur kerja kerangka kerja
28+
29+
Kerangka kerja penjadwalan mendefinisikan beberapa titik ekstensi. _Plugin_ penjadwal
30+
mendaftar untuk dipanggil di satu atau lebih titik ekstensi. Beberapa _plugin_ ini
31+
dapat mengubah keputusan penjadwalan dan beberapa hanya bersifat informasi.
32+
33+
Setiap upaya untuk menjadwalkan satu Pod dibagi menjadi dua fase, **Siklus Penjadwalan (_Scheduling Cycle_)** dan **Siklus Pengikatan (_Binding Cycle_)**.
34+
35+
## Siklus Penjadwalan dan Siklus Pengikatan
36+
37+
Siklus penjadwalan memilih sebuah Node untuk Pod, dan siklus pengikatan menerapkan
38+
keputusan tersebut ke klaster. Secara bersama-sama, siklus penjadwalan dan siklus
39+
pengikatan diartikan sebagai sebuah "konteks penjadwalan (_scheduling context_)".
40+
41+
Siklus penjadwalan dijalankan secara serial, sementara siklus pengikatan dapat
42+
berjalan secara bersamaan.
43+
44+
Siklus penjadwalan atau pengikatan dapat dibatalkan jika Pod telah ditentukan
45+
untuk tidak terjadwalkan atau jika terdapat kesalahan internal. Pod akan
46+
dikembalikan ke antrian dan dicoba lagi.
47+
48+
## Titik-titik ekstensi
49+
50+
Gambar berikut menunjukkan konteks penjadwalan Pod dan titik-titik ekstensi
51+
yang diperlihatkan oleh kerangka penjadwalan. Dalam gambar ini "Filter"
52+
setara dengan "Predicate" dan "Scoring" setara dengan "Priority Function".
53+
54+
Satu _plugin_ dapat mendaftar di beberapa titik ekstensi untuk melakukan pekerjaan
55+
yang lebih kompleks atau _stateful_.
56+
57+
{{< figure src="/images/docs/scheduling-framework-extensions.png" title="Titik-titik ekstensi dari kerangka kerja Penjadwalan" >}}
58+
59+
### QueueSort {#queue-sort}
60+
61+
_Plugin_ ini digunakan untuk mengurutkan Pod-Pod dalam antrian penjadwalan. _Plugin_
62+
QueueSort pada dasarnya menyediakan fungsi `Less (Pod1, Pod2)`. Hanya satu jenis
63+
_plugin_ QueueSort yang dapat diaktifkan dalam waktu yang bersamaan.
64+
65+
### PreFilter {#pre-filter}
66+
67+
_Plugin_ ini digunakan untuk melakukan pra-proses informasi tentang Pod, atau untuk
68+
memeriksa tertentu kondisi yang harus dipenuhi oleh klaster atau Pod. Jika
69+
_plugin_ PreFilter menghasilkan hasil yang salah, siklus penjadwalan dibatalkan.
70+
71+
### Filter
72+
73+
_Plugin_ ini digunakan untuk menyaring Node yang tidak dapat menjalankan Pod.
74+
Untuk setiap Node, penjadwal akan memanggil _plugin_ Filter sesuai dengan urutan
75+
mereka dikonfigurasi. Jika ada _plugin_ Filter menandai Node menjadi _infeasible_,
76+
maka _plugin_ yang lainnya tidak akan dipanggil untuk Node itu. Node-Node dapat dievaluasi
77+
secara bersamaan.
78+
79+
### PreScore {#pre-score}
80+
81+
_Plugin_ ini digunakan untuk melakukan pekerjaan "pra-penilaian", yang
82+
menghasilkan keadaan yang dapat dibagi untuk digunakan oleh _plugin-plugin_ Score.
83+
Jika _plugin_ PreScore mengeluarkan hasil salah, maka siklus penjadwalan dibatalkan.
84+
85+
### Score {#score}
86+
87+
_Plugin_ ini digunakan untuk menentukan peringkat Node yang telah melewati fase
88+
penyaringan. Penjadwal akan memanggil setiap _plugin_ Score untuk setiap Node.
89+
Akan ada kisaran bilangan bulat yang telah ditetapkan untuk mewakili skor
90+
minimum dan maksimum. Setelah fase [NormalizeScore](#normalize-scoring),
91+
penjadwal akan menggabungkan skor Node dari semua _plugin_ sesuai dengan bobot
92+
_plugin_ yang telah dikonfigurasi.
93+
94+
### NormalizeScore {#normalize-score}
95+
96+
_Plugin_ ini digunakan untuk memodifikasi skor sebelum penjadwal menghitung
97+
peringkat akhir Node-Node. _Plugin_ yang mendaftar untuk titik ekstensi ini akan
98+
dipanggil dengan hasil [Score](#score) dari _plugin_ yang sama. Hal ini dilakukan
99+
sekali untuk setiap _plugin_ dan setiap siklus penjadwalan.
100+
101+
Sebagai contoh, anggaplah sebuah _plugin_ `BlinkingLightScorer` memberi peringkat
102+
pada Node-Node berdasarkan berapa banyak kedipan lampu yang mereka miliki.
103+
104+
```go
105+
func ScoreNode(_ *v1.pod, n *v1.Node) (int, error) {
106+
return getBlinkingLightCount(n)
107+
}
108+
```
109+
110+
Namun, jumlah maksimum kedipan lampu mungkin kecil jika dibandingkan dengan
111+
`NodeScoreMax`. Untuk memperbaikinya, `BlinkingLightScorer` juga harus mendaftar
112+
untuk titik ekstensi ini.
113+
114+
```go
115+
func NormalizeScores(scores map[string]int) {
116+
highest := 0
117+
for _, score := range scores {
118+
highest = max(highest, score)
119+
}
120+
for node, score := range scores {
121+
scores[node] = score*NodeScoreMax/highest
122+
}
123+
}
124+
```
125+
126+
Jika ada _plugin_ NormalizeScore yang menghasilkan hasil yang salah, maka siklus
127+
penjadwalan dibatalkan.
128+
129+
{{< note >}}
130+
_Plugin_ yang ingin melakukan pekerjaan "pra-pemesanan" harus menggunakan
131+
titik ekstensi NormalizeScore.
132+
{{< /note >}}
133+
134+
### Reserve
135+
136+
Ini adalah titik ekstensi yang bersifat informasi. _Plugin_ yang mempertahankan
137+
keadaan _runtime_ (alias "_stateful plugins_") harus menggunakan titik ekstensi ini
138+
untuk diberitahukan oleh penjadwal ketika sumber daya pada suatu Node dicadangkan
139+
untuk Pod yang telah disiapkan. Proses ini terjadi sebelum penjadwal benar-benar
140+
mengikat Pod ke Node, dan itu ada untuk mencegah kondisi balapan (_race conditions_)
141+
ketika penjadwal menunggu agar pengikatan berhasil.
142+
143+
Ini adalah langkah terakhir dalam siklus penjadwalan. Setelah Pod berada dalam
144+
status dicadangkan, maka itu akan memicu _plugin_ [Unreserve](#unreserve)
145+
(apabila gagal) atau _plugin_ [PostBind](#post-bind) (apabila sukses)
146+
di akhir siklus pengikatan.
147+
148+
### Permit
149+
150+
_Plugin_ Permit dipanggil pada akhir siklus penjadwalan untuk setiap Pod
151+
untuk mencegah atau menunda pengikatan ke Node kandidat. _Plugin_ Permit dapat
152+
melakukan salah satu dari ketiga hal ini:
153+
154+
1. **approve** \
155+
     Setelah semua _plugin_ Permit menyetujui sebuah Pod, Pod tersebut akan dikirimkan untuk diikat.
156+
157+
2. **deny** \
158+
     Jika ada _plugin_ Permit yang menolak sebuah Pod, Pod tersebut akan dikembalikan ke
159+
antrian penjadwalan. Hal ini akan memicu _plugin_ [Unreserve](#unreserve).
160+
161+
3. **wait** (dengan batas waktu) \
162+
     Jika _plugin_ Permit menghasilkan "wait", maka Pod disimpan dalam
163+
     daftar Pod "yang menunggu" internal, dan siklus pengikatan Pod ini dimulai tetapi akan langsung diblokir
164+
     sampai mendapatkan [_approved_](#frameworkhandle). Jika waktu tunggu habis, ** wait ** menjadi ** deny **
165+
     dan Pod dikembalikan ke antrian penjadwalan, yang memicu _plugin_ [Unreserve](#unreserve).
166+
167+
{{< note >}}
168+
Ketika setiap _plugin_ dapat mengakses daftar Pod-Pod "yang menunggu" dan menyetujuinya
169+
(silahkan lihat [`FrameworkHandle`](#frameworkhandle)), kami hanya mengharapkan
170+
_plugin_ Permit untuk menyetujui pengikatan Pod dalam kondisi "menunggu" yang
171+
telah dipesan. Setelah Pod disetujui, akan dikirim ke fase [PreBind](#pre-bind).
172+
{{< /note >}}
173+
174+
### PreBind {#pre-bind}
175+
176+
_Plugin_ ini digunakan untuk melakukan pekerjaan apa pun yang diperlukan sebelum
177+
Pod terikat. Sebagai contoh, _plugin_ PreBind dapat menyediakan _network volume_
178+
dan melakukan _mounting_ pada Node target sebelum mengizinkan Pod berjalan di
179+
sana.
180+
181+
Jika ada _plugin_ PreBind yang menghasilkan kesalahan, maka Pod [ditolak](#unreserve)
182+
dan kembali ke antrian penjadwalan.
183+
184+
### Bind
185+
186+
_Plugin_ ini digunakan untuk mengikat Pod ke Node. _Plugin-plugin_ Bind tidak akan
187+
dipanggil sampai semua _plugin_ PreBind selesai. Setiap _plugin_ Bind dipanggil
188+
sesuai urutan saat dikonfigurasi. _Plugin_ Bind dapat memilih untuk menangani
189+
atau tidak Pod yang diberikan. Jika _plugin_ Bind memilih untuk menangani Pod,
190+
** _plugin_ Bind yang tersisa dilewati **.
191+
192+
### PostBind {#post-bind}
193+
194+
Ini adalah titik ekstensi bersifat informasi. _Plugin-plugin_ PostBind dipanggil
195+
setelah sebuah Pod berhasil diikat. Ini adalah akhir dari siklus pengikatan, dan
196+
dapat digunakan untuk membersihkan sumber daya terkait.
197+
198+
### Unreserve
199+
200+
Ini adalah titik ekstensi bersifat informasi. Jika sebuah Pod telah dipesan dan
201+
kemudian ditolak di tahap selanjutnya, maka _plugin-plugin_ Unreserve akan
202+
diberitahu. _Plugin_ Unreserve harus membersihkan status yang terkait dengan Pod
203+
yang dipesan.
204+
205+
_Plugin_ yang menggunakan titik ekstensi ini sebaiknya juga harus digunakan
206+
[Reserve](#unreserve).
207+
208+
## _Plugin_ API
209+
210+
Ada dua langkah untuk _plugin_ API. Pertama, _plugin_ harus mendaftar dan mendapatkan
211+
konfigurasi, kemudian mereka menggunakan antarmuka titik ekstensi. Antarmuka (_interface_)
212+
titik ekstensi memiliki bentuk sebagai berikut.
213+
214+
```go
215+
type Plugin interface {
216+
Name() string
217+
}
218+
219+
type QueueSortPlugin interface {
220+
Plugin
221+
Less(*v1.pod, *v1.pod) bool
222+
}
223+
224+
type PreFilterPlugin interface {
225+
Plugin
226+
PreFilter(context.Context, *framework.CycleState, *v1.pod) error
227+
}
228+
229+
// ...
230+
```
231+
232+
## Konfigurasi _plugin_
233+
234+
Kamu dapat mengaktifkan atau menonaktifkan _plugin_ dalam konfigurasi penjadwal.
235+
Jika kamu menggunakan Kubernetes v1.18 atau yang lebih baru, kebanyakan
236+
[plugin-plugin penjadwalan](/docs/reference/scheduling/profiles/#scheduling-plugins)
237+
sudah digunakan dan diaktifkan secara bawaan.
238+
239+
Selain _plugin-plugin_ bawaan, kamu juga dapat mengimplementasikan _plugin-plugin_ penjadwalan
240+
kamu sendiri dan mengonfigurasinya bersama-sama dengan _plugin-plugin_ bawaan.
241+
Kamu bisa mengunjungi [plugin-plugin penjadwalan](https://github.com/kubernetes-sigs/scheduler-plugins)
242+
untuk informasi lebih lanjut.
243+
244+
Jika kamu menggunakan Kubernetes v1.18 atau yang lebih baru, kamu dapat
245+
mengonfigurasi sekumpulan _plugin_ sebagai profil penjadwal dan kemudian menetapkan
246+
beberapa profil agar sesuai dengan berbagai jenis beban kerja. Pelajari lebih
247+
lanjut di [multi profil](/docs/reference/scheduling/profiles/#multiple-profiles).
248+
249+
{{% /capture %}}

0 commit comments

Comments
 (0)