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.
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.
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
$ go run main.go
Kodingizni ishga tushiring