GoDasturchi
Putting It All Together: A Mini Control Plane

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.

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

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

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

Hints (0/3)

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