Scheduling: Filtering & Scoring
Rejalashtirish: filtrlash va baholash
Ishga xodim yollashda ikki bosqich bo'ladi: avval MINIMAL talablarga (masalan, "Go tilini bilishi shart") javob bermaydigan nomzodlarni chetlab o'tasiz (filter) — bu ular yomon ekanidan emas, oddiy TALABGA mos kelmagani uchun. Qolgan nomzodlar orasidan esa ENG YAXSHISINI, ballash (score) orqali tanlaysiz. Kubernetes Scheduler'i aynan shu ikki bosqichli — filter, keyin score — jarayonni ishlatadi.
package main
import "fmt"
type Node struct {
Name string
CPUFree int
MemFree int
}
type PodSpec struct {
CPURequest int
MemRequest int
}
// Filter — talabga YETMAYDIGAN node'larni chetlab o'tadi
func Filter(nodes []*Node, spec PodSpec) []*Node {
var result []*Node
for _, n := range nodes {
if n.CPUFree >= spec.CPURequest && n.MemFree >= spec.MemRequest {
result = append(result, n)
}
}
return result
}
// Score — eng KO'P bo'sh resursga ega node'ni tanlaydi (yukni tekis taqsimlash uchun)
func Score(nodes []*Node) *Node {
if len(nodes) == 0 {
return nil
}
best := nodes[0]
for _, n := range nodes[1:] {
if (n.CPUFree + n.MemFree) > (best.CPUFree + best.MemFree) {
best = n
}
}
return best
}
func main() {
nodes := []*Node{
{Name: "node-1", CPUFree: 4, MemFree: 4},
{Name: "node-2", CPUFree: 8, MemFree: 2},
{Name: "node-3", CPUFree: 2, MemFree: 2},
}
spec := PodSpec{CPURequest: 3, MemRequest: 1}
filtered := Filter(nodes, spec)
fmt.Println(len(filtered))
chosen := Score(filtered)
fmt.Println(chosen.Name)
}Filter — node-3ni (2 CPU < 3 talab) CHETLAB o'tadi, node-1 va node-2 esa ikkalasi ham talabga JAVOB beradi. Score esa qolgan ikkitasi orasidan ENG KO'P umumiy bo'sh resursga (CPUFree + MemFree) ega bo'lganini — node-2 (8+2=10 > 4+4=8) — TANLAYDI. Bu strategiya "eng bo'sh Node'ni tanlash" deb ataladi va yukni klaster bo'ylab TEKIS taqsimlashga yordam beradi (barcha Pod'lar bitta Node'ga "to'planib qolishining" oldini oladi).
Ikki bosqichga AJRATISHNING foydasi: Filter — "mumkinmi, mumkin emasmi" degan QATTIQ savolga javob beradi (talab qilingan resurs YO'Q bo'lsa, Pod u yerda umuman ISHLAMAYDI). Score esa "qay biri YAXSHIROQ" degan YUMSHOQ, taqqoslash savoliga javob beradi. Bu ikkalasini ARALASHTIRMASLIK — real Kubernetes Scheduler'ida ham xuddi shunday ajratilgan, va bu "Simplification" kursida ko'rgan "bir funksiya — bir mas'uliyat" tamoyilining aynan o'zi.
>_ Exercise
Filtrlangan Node'larning faqat nomlarini olish imkonini qo'shing.
- •FilteredNames(nodes []*Node) []string funksiyasini yozing: har bir node'ning Name'ini natija slice'ga qo'shing
- •filtered natijasidan FilteredNames chaqirib, natijani chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Scheduling ikki aniq bosqichga bo'linadi: Filter — talabga UMUMAN javob bermaydigan Node'larni chetlab o'tadi, Score — qolganlar orasidan ENG YAXSHISINI tanlaydi; bu ikkalasini ajratish, har bir bosqichni sodda va mustaqil qiladi.
NEXT UP
Node Affinity & Taints
$ go run main.go
Kodingizni ishga tushiring