GoDasturchi
ReplicaSet: Keeping N Copies Running

ReplicaSet: Keeping N Copies Running

ReplicaSet: N nusxani doim ishlab turishi

Restoran menejeri smenada DOIM aynan 3 ta oshpaz bo'lishini xohlaydi. Agar bittasi kasal bo'lib qolsa, menejer buni payqab, o'rniga boshqasini chaqiradi. Agar ortiqcha, 4-chi oshpaz kelib qolsa, menejer birini uyga jo'natadi. Menejer oshpazning KIM ekanligiga unchalik ahamiyat bermaydi — muhimi, DOIM aynan 3 ta bo'lishi. Kubernetes'dagi ReplicaSet — aynan shu menejer: u Pod'larning individual nomlariga emas, balki ularning SONIGA e'tibor beradi.

example.go
package main

import "fmt"

type Pod struct {
	Name string
}

type ReplicaSet struct {
	Name    string
	Desired int
	pods    []*Pod
	nextID  int
}

func NewReplicaSet(name string, desired int) *ReplicaSet {
	return &ReplicaSet{Name: name, Desired: desired}
}

// Reconcile — joriy pod sonini Desired'ga TENGLASHTIRADI
func (r *ReplicaSet) Reconcile() {
	for len(r.pods) < r.Desired {
		r.nextID++
		r.pods = append(r.pods, &Pod{Name: fmt.Sprintf("%s-%d", r.Name, r.nextID)})
	}
	for len(r.pods) > r.Desired {
		r.pods = r.pods[:len(r.pods)-1]
	}
}

func main() {
	rs := NewReplicaSet("web", 3)
	rs.Reconcile()
	fmt.Println(len(rs.pods))

	rs.pods = rs.pods[:1] // ikkita pod "qulab tushdi" deb faraz qilamiz
	rs.Reconcile()
	fmt.Println(len(rs.pods))
}

Reconcile — "What Does Kubernetes Actually Do?" darsida ko'rgan "kuzat, solishtir, harakat qil" tsiklining birinchi HAQIQIY ko'rinishi: joriy pod soni (len(r.pods)) kamroq bo'lsa — yangi pod QO'SHADI, ko'proq bo'lsa — ortiqchasini O'CHIRADI. E'tibor bering: birinchi Reconcile()dan keyin biz ATAYLAB ikkita pod'ni "yo'qotamiz" (rs.pods[:1]) — bu server ishdan chiqishini simulyatsiya qiladi — va ikkinchi Reconcile() chaqiruvi ularni AVTOMATIK tiklaydi.

nextID — har bir yangi pod NOYOB nomga ega bo'lishi uchun (web-1, web-2, ...), hatto avvalgi pod'lar o'chirilgan bo'lsa ham hech qachon qaytarilmaydigan hisoblagich. Bu — real Kubernetes'da ham xuddi shunday ishlaydi: o'chgan web-2 o'rniga yaratilgan yangi pod web-2 DEB emas, balki yangi, noyob nom bilan ataladi.

>_ Exercise

ReplicaSet'ni istalgan songacha ko'paytirish/kamaytirish (scale) imkonini qo'shing.

  • ScaleTo(n int) metodini yozing: r.Desired = n qiling, so'ng Reconcile() ni chaqiring
  • 3 nusxadan boshlab, 5 tagacha ScaleTo qiling va pod sonini chop eting
  • So'ng 2 tagacha ScaleTo qiling va pod sonini yana chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

ReplicaSet — Pod'larning individual nomiga emas, balki SONIGA e'tibor berib, joriy sonni xohlangan songa (Desired) doimiy ravishda tenglashtiruvchi reconciliation tsiklini amalga oshiradi.

NEXT UP

Deployment: Rolling Updates

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

ReplicaSet: Keeping N Copies Running

ReplicaSet: N nusxani doim ishlab turishi

Restoran menejeri smenada DOIM aynan 3 ta oshpaz bo'lishini xohlaydi. Agar bittasi kasal bo'lib qolsa, menejer buni payqab, o'rniga boshqasini chaqiradi. Agar ortiqcha, 4-chi oshpaz kelib qolsa, menejer birini uyga jo'natadi. Menejer oshpazning KIM ekanligiga unchalik ahamiyat bermaydi — muhimi, DOIM aynan 3 ta bo'lishi. Kubernetes'dagi ReplicaSet — aynan shu menejer: u Pod'larning individual nomlariga emas, balki ularning SONIGA e'tibor beradi.

example.go
package main

import "fmt"

type Pod struct {
	Name string
}

type ReplicaSet struct {
	Name    string
	Desired int
	pods    []*Pod
	nextID  int
}

func NewReplicaSet(name string, desired int) *ReplicaSet {
	return &ReplicaSet{Name: name, Desired: desired}
}

// Reconcile — joriy pod sonini Desired'ga TENGLASHTIRADI
func (r *ReplicaSet) Reconcile() {
	for len(r.pods) < r.Desired {
		r.nextID++
		r.pods = append(r.pods, &Pod{Name: fmt.Sprintf("%s-%d", r.Name, r.nextID)})
	}
	for len(r.pods) > r.Desired {
		r.pods = r.pods[:len(r.pods)-1]
	}
}

func main() {
	rs := NewReplicaSet("web", 3)
	rs.Reconcile()
	fmt.Println(len(rs.pods))

	rs.pods = rs.pods[:1] // ikkita pod "qulab tushdi" deb faraz qilamiz
	rs.Reconcile()
	fmt.Println(len(rs.pods))
}

Reconcile — "What Does Kubernetes Actually Do?" darsida ko'rgan "kuzat, solishtir, harakat qil" tsiklining birinchi HAQIQIY ko'rinishi: joriy pod soni (len(r.pods)) kamroq bo'lsa — yangi pod QO'SHADI, ko'proq bo'lsa — ortiqchasini O'CHIRADI. E'tibor bering: birinchi Reconcile()dan keyin biz ATAYLAB ikkita pod'ni "yo'qotamiz" (rs.pods[:1]) — bu server ishdan chiqishini simulyatsiya qiladi — va ikkinchi Reconcile() chaqiruvi ularni AVTOMATIK tiklaydi.

nextID — har bir yangi pod NOYOB nomga ega bo'lishi uchun (web-1, web-2, ...), hatto avvalgi pod'lar o'chirilgan bo'lsa ham hech qachon qaytarilmaydigan hisoblagich. Bu — real Kubernetes'da ham xuddi shunday ishlaydi: o'chgan web-2 o'rniga yaratilgan yangi pod web-2 DEB emas, balki yangi, noyob nom bilan ataladi.

>_ Exercise

ReplicaSet'ni istalgan songacha ko'paytirish/kamaytirish (scale) imkonini qo'shing.

  • ScaleTo(n int) metodini yozing: r.Desired = n qiling, so'ng Reconcile() ni chaqiring
  • 3 nusxadan boshlab, 5 tagacha ScaleTo qiling va pod sonini chop eting
  • So'ng 2 tagacha ScaleTo qiling va pod sonini yana chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

ReplicaSet — Pod'larning individual nomiga emas, balki SONIGA e'tibor berib, joriy sonni xohlangan songa (Desired) doimiy ravishda tenglashtiruvchi reconciliation tsiklini amalga oshiradi.

NEXT UP

Deployment: Rolling Updates