GoDasturchi
Scheduling: Filtering & Scoring

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.

example.go
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)
}

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

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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)
}

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

Hints (0/3)

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