Putting It All Together: A Mini Control Plane
Hammasini birlashtirish: mini boshqaruv markazi
Restoranlar tarmog'ining bosh ofisini tasavvur qiling: bosh ofis "har bir filialda 3 tadan oshpaz bo'lsin" deb BUYRUQ beradi (Deployment); mintaqaviy menejer buni eshitib, aynan 3 ta OSHPAZ lavozimini OCHADI (ReplicaSet); kadrlar bo'limi esa har bir lavozim uchun QAYSI filialda ISHLASHINI (qaysi shahar, qaysi restoran) BELGILAYDI (Scheduler). Uch xil bo'lim, uch xil vazifa — lekin BIRGALIKDA, ketma-ket ishlab, bitta natijaga OLIB KELADI. Bu darsda siz aynan shu ZANJIRNI — Deployment -> ReplicaSet -> Pod -> Scheduler -> Node — BIR DASTURDA ulaysiz.
package main
import "fmt"
type Node struct {
Name string
CPUFree int
}
type Pod struct {
Name string
Node string
}
type ReplicaSet struct {
Name string
Desired int
Pods []*Pod
}
func (r *ReplicaSet) CreatePods() {
for i := len(r.Pods) + 1; len(r.Pods) < r.Desired; i++ {
r.Pods = append(r.Pods, &Pod{Name: fmt.Sprintf("%s-%d", r.Name, i)})
}
}
type Deployment struct {
Name string
Replicas int
ReplicaSet *ReplicaSet
}
// Rollout — Deployment o'ziga tegishli ReplicaSet'ni yaratadi va uni kerakli songacha to'ldiradi
func (d *Deployment) Rollout() {
d.ReplicaSet = &ReplicaSet{Name: d.Name, Desired: d.Replicas}
d.ReplicaSet.CreatePods()
}
type Scheduler struct {
Nodes []*Node
}
func (s *Scheduler) Assign(pod *Pod, cpuNeeded int) bool {
for _, n := range s.Nodes {
if n.CPUFree >= cpuNeeded {
n.CPUFree -= cpuNeeded
pod.Node = n.Name
return true
}
}
return false
}
func main() {
dep := &Deployment{Name: "web", Replicas: 3}
dep.Rollout()
scheduler := &Scheduler{Nodes: []*Node{
{Name: "node-1", CPUFree: 2},
{Name: "node-2", CPUFree: 4},
}}
for _, pod := range dep.ReplicaSet.Pods {
scheduler.Assign(pod, 2)
}
for _, pod := range dep.ReplicaSet.Pods {
fmt.Println(pod.Name, pod.Node)
}
}E'tibor bering: bu kod — kursning butun davomida yozgan qismlaringizning, ATAYLAB SODDALASHTIRILGAN, lekin AYNAN shu ZANJIR bo'yicha ishlaydigan versiyasi. dep.Rollout() — "Deployment: Rolling Updates" darsidagi g'oyaning boshlang'ich qadami: o'ziga ReplicaSet'ni BIRIKTIRADI. ReplicaSet.CreatePods() — "ReplicaSet: Keeping N Copies Running" darsidagi Reconcilening SODDALASHTIRILGAN shakli (faqat KO'PAYTIRISH tomoni). scheduler.Assign — "The Scheduler: Placing Pods on Nodes" darsidagi Schedulening O'ZI, faqat endi Pod'ning O'ZIGA Node maydonini YOZADI.
Natija: uchta Pod, ikkita Node orasida CPU'ga qarab TAQSIMLANADI — birinchi ikkitasi turli Node'larga, uchinchisi esa ikkinchi Node'da JOY qolgani uchun o'sha yerga tushadi. Bu — real Kubernetes'da HAR safar kubectl apply qilganingizda, PARDA ORQASIDA sodir bo'ladigan ZANJIRNING, siz O'ZINGIZ qurgan MINIATYUR ko'rinishi.
>_ Exercise
Resurs YETMAGANDA, Pod'lar "kutish" (pending) holatida qolishini aniqlang.
- •PendingPods() []*Pod metodini Deployment'ga qo'shing: Node biriktirilmagan (Node == "") barcha Pod'larni qaytaring
- •4 ta nusxali Deployment yarating (jami CPU'si faqat 3 tasiga YETADIGAN ikkita Node bilan)
- •PendingPods()ning uzunligini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Bir nechta mustaqil qism — Deployment, ReplicaSet, Scheduler — har biri O'Z, tor vazifasini bajarib, ketma-ket ULANGANDA, real Kubernetes'ning butun asosiy oqimini (Deployment yaratildi -> Pod'lar hosil bo'ldi -> Node'larga joylashtirildi) TASHKIL etadi.
NEXT UP
Project Recap & Where Real Kubernetes Goes Further
$ go run main.go
Kodingizni ishga tushiring