GoDasturchi
Deployment: Rolling Updates

Deployment: Rolling Updates

Deployment: bosqichma-bosqich yangilash

Shahar avtobus parkida 3 ta eski avtobusni yangisiga almashtirish kerak. Buni QANDAY qilasiz? Uchalasini BIR VAQTDA to'xtatib, uchalasini ham yangisiga almashtirsangiz — yo'lovchilar bir muddat avtobussiz qoladi! Aqlliroq yo'l: bittasini olib, o'rniga yangisini qo'yasiz, u ishga tushgach — keyingisiga o'tasiz. Har doim kamida 2 ta avtobus YO'LDA bo'ladi. Kubernetes'dagi Deployment ROLLING UPDATE strategiyasi orqali, Pod'larni aynan shunday, xizmatni TO'XTATMASDAN, birma-bir yangi versiyaga almashtiradi.

example.go
package main

import "fmt"

type Deployment struct {
	Name     string
	OldReady int
	NewReady int
	Total    int
}

func NewDeployment(name string, total int) *Deployment {
	return &Deployment{Name: name, OldReady: total, NewReady: 0, Total: total}
}

// Step — bitta eski pod'ni o'chirib, bitta yangi pod qo'shadi (maxUnavailable=1, maxSurge=0)
func (d *Deployment) Step() {
	if d.OldReady == 0 {
		return
	}
	d.OldReady--
	d.NewReady++
}

func (d *Deployment) Done() bool {
	return d.OldReady == 0
}

func main() {
	dep := NewDeployment("web", 3)
	for !dep.Done() {
		dep.Step()
		fmt.Println(dep.OldReady, dep.NewReady)
	}
}

Bu — "Cloud Patterns for Go" kursidagi "Deployment Strategies: Kubernetes" darsida ko'rgan maxUnavailable: 1 va maxSurge: 1 sozlamalarining, eng SODDA ko'rinishi: bir vaqtning o'zida bittadan ortiq eski pod ISHDAN chiqarilmaydi (maxUnavailable=1), va yangi pod ESKI pod o'chirilgandan KEYIN qo'shiladi (bu yerda maxSurge=0 — umumiy son o'zgarmaydi). Real Kubernetes'da bu ikkalasi mustaqil sozlanadi, lekin g'oya bir xil: HAR bir qadamda faqat OZ qismi o'zgaradi.

Step() — har chaqirilganda BITTA pod'ni eskidan yangiga "o'tkazadi". Done() — barcha eski pod'lar almashtirilganda true qaytaradi. Real Kubernetes'da har bir yangi Pod ishga tushgach, uning readinessProbesi ("Health Checks: Liveness & Readiness" darsini eslang) MUVAFFAQIYATLI bo'lgandagina keyingi qadamga o'tiladi — bu yerda soddalik uchun buni o'tkazib yuboramiz.

>_ Exercise

Yangilanish jarayonining foizini (progress) hisoblash imkonini qo'shing.

  • Progress() int metodini yozing: (d.NewReady * 100) / d.Total ni qaytaring
  • Har bir Step'dan keyin dep.OldReady, dep.NewReady va dep.Progress() ni bitta qatorda chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Deployment'ning rolling update strategiyasi — bir vaqtning o'zida faqat OZ qismini o'zgartirib, eski va yangi versiyani vaqtincha BIRGA ishlatib turish orqali, xizmatni to'xtatmasdan yangilashni ta'minlaydi.

NEXT UP

Deployment Rollback

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Deployment: Rolling Updates

Deployment: bosqichma-bosqich yangilash

Shahar avtobus parkida 3 ta eski avtobusni yangisiga almashtirish kerak. Buni QANDAY qilasiz? Uchalasini BIR VAQTDA to'xtatib, uchalasini ham yangisiga almashtirsangiz — yo'lovchilar bir muddat avtobussiz qoladi! Aqlliroq yo'l: bittasini olib, o'rniga yangisini qo'yasiz, u ishga tushgach — keyingisiga o'tasiz. Har doim kamida 2 ta avtobus YO'LDA bo'ladi. Kubernetes'dagi Deployment ROLLING UPDATE strategiyasi orqali, Pod'larni aynan shunday, xizmatni TO'XTATMASDAN, birma-bir yangi versiyaga almashtiradi.

example.go
package main

import "fmt"

type Deployment struct {
	Name     string
	OldReady int
	NewReady int
	Total    int
}

func NewDeployment(name string, total int) *Deployment {
	return &Deployment{Name: name, OldReady: total, NewReady: 0, Total: total}
}

// Step — bitta eski pod'ni o'chirib, bitta yangi pod qo'shadi (maxUnavailable=1, maxSurge=0)
func (d *Deployment) Step() {
	if d.OldReady == 0 {
		return
	}
	d.OldReady--
	d.NewReady++
}

func (d *Deployment) Done() bool {
	return d.OldReady == 0
}

func main() {
	dep := NewDeployment("web", 3)
	for !dep.Done() {
		dep.Step()
		fmt.Println(dep.OldReady, dep.NewReady)
	}
}

Bu — "Cloud Patterns for Go" kursidagi "Deployment Strategies: Kubernetes" darsida ko'rgan maxUnavailable: 1 va maxSurge: 1 sozlamalarining, eng SODDA ko'rinishi: bir vaqtning o'zida bittadan ortiq eski pod ISHDAN chiqarilmaydi (maxUnavailable=1), va yangi pod ESKI pod o'chirilgandan KEYIN qo'shiladi (bu yerda maxSurge=0 — umumiy son o'zgarmaydi). Real Kubernetes'da bu ikkalasi mustaqil sozlanadi, lekin g'oya bir xil: HAR bir qadamda faqat OZ qismi o'zgaradi.

Step() — har chaqirilganda BITTA pod'ni eskidan yangiga "o'tkazadi". Done() — barcha eski pod'lar almashtirilganda true qaytaradi. Real Kubernetes'da har bir yangi Pod ishga tushgach, uning readinessProbesi ("Health Checks: Liveness & Readiness" darsini eslang) MUVAFFAQIYATLI bo'lgandagina keyingi qadamga o'tiladi — bu yerda soddalik uchun buni o'tkazib yuboramiz.

>_ Exercise

Yangilanish jarayonining foizini (progress) hisoblash imkonini qo'shing.

  • Progress() int metodini yozing: (d.NewReady * 100) / d.Total ni qaytaring
  • Har bir Step'dan keyin dep.OldReady, dep.NewReady va dep.Progress() ni bitta qatorda chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Deployment'ning rolling update strategiyasi — bir vaqtning o'zida faqat OZ qismini o'zgartirib, eski va yangi versiyani vaqtincha BIRGA ishlatib turish orqali, xizmatni to'xtatmasdan yangilashni ta'minlaydi.

NEXT UP

Deployment Rollback