Deployment Rollback
Deployment'ni orqaga qaytarish
Retseptni takomillashtirib borayotgan oshpazni tasavvur qiling: u har bir yangi retsept variantini ESKISINI TASHLAMASDAN, alohida qayd qilib boradi. Agar yangi retsept ("3-versiya") mijozlarga yoqmasa, oshpaz uni butunlay qaytadan o'ylab topish o'rniga, shunchaki oldingi, yaxshi ishlagan "2-versiya" qaydiga QAYTADI. Kubernetes'dagi Deployment ham har bir yangilanishni tarix sifatida saqlaydi va rollback orqali istalgan oldingi versiyaga qaytish imkonini beradi.
package main
import "fmt"
type Revision struct {
Version int
Image string
}
type Deployment struct {
Name string
Current Revision
History []Revision
}
func NewDeployment(name, image string) *Deployment {
rev := Revision{Version: 1, Image: image}
return &Deployment{Name: name, Current: rev, History: []Revision{rev}}
}
func (d *Deployment) Update(image string) {
rev := Revision{Version: d.Current.Version + 1, Image: image}
d.History = append(d.History, rev)
d.Current = rev
}
func (d *Deployment) Rollback(toVersion int) error {
for _, rev := range d.History {
if rev.Version == toVersion {
d.Current = rev
return nil
}
}
return fmt.Errorf("%d-versiya topilmadi", toVersion)
}
func main() {
dep := NewDeployment("web", "myapp:v1")
dep.Update("myapp:v2")
dep.Update("myapp:v3")
fmt.Println(dep.Current.Version, dep.Current.Image)
dep.Rollback(1)
fmt.Println(dep.Current.Version, dep.Current.Image)
}History []Revision — HAR bir Update chaqiruvida yangi yozuv QO'SHIB boriladi, eskilari hech qachon o'chirilmaydi ("Append-Only" naqshini eslang). Rollback(toVersion) — tarix bo'ylab qidirib, mos versiyani Current qilib belgilaydi. Diqqat: rollback YANGI versiya YARATMAYDI, faqat Currentni ESKI qaydga ishora qildiradi — garchi real Kubernetes'da bu texnik jihatdan yangi rollout sifatida qayd qilinsa ham, natija bir xil: ESKI konfiguratsiya qayta faollashadi.
Bu funksiya ayniqsa production'da MUHIM: agar yangi versiya (v3) xatolarga olib kelsa, uni tuzatishni KUTIB o'tirish o'rniga, DARHOL oldingi, ISHLAGAN versiyaga (v2 yoki undan ham oldingisiga) qaytish mumkin — bu "Systematic Debugging" kursida ko'rgan "avval xavfsiz holatga qayt, keyin sabab bilan shug'ullan" tamoyilining amaliy ko'rinishi.
>_ Exercise
Bevosita oldingi versiyaga bir qadamda qaytish imkonini qo'shing.
- •RollbackToPrevious() error metodini yozing: d.Rollback(d.Current.Version - 1) ni chaqiring va natijasini qaytaring
- •Deployment yaratib, ikki marta Update qiling (v1 -> v2 -> v3)
- •RollbackToPrevious() ni chaqiring, so'ng dep.Current.Version va dep.Current.Image ni chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Deployment har bir yangilanishni versiyalar tarixi sifatida saqlaydi, shu orqali muammoli versiyadan darhol, oldingi ishlagan holatga rollback qilish imkonini beradi.
NEXT UP
Service: Stable Networking for Pods
$ go run main.go
Kodingizni ishga tushiring