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