GoDasturchi
Pod Lifecycle & Status

Pod Lifecycle & Status

Pod hayot tsikli va holati

Restoranga buyurtma berganingizda, u bir necha aniq bosqichdan o'tadi: "qabul qilindi" (hali pishirilmagan), "tayyorlanmoqda", va nihoyat "tayyor" yoki (kamdan-kam) "bekor qilindi". Buyurtma bir vaqtning o'zida ikkita bosqichda bo'la olmaydi, va "tayyor"dan to'g'ridan-to'g'ri "qabul qilindi"ga qaytа olmaydi. Kubernetes'dagi Pod ham xuddi shunday, ANIQ belgilangan bosqichlar (Phase) orqali o'tadi.

example.go
package main

import "fmt"

type PodPhase string

const (
	PodPending   PodPhase = "Pending"
	PodRunning   PodPhase = "Running"
	PodSucceeded PodPhase = "Succeeded"
	PodFailed    PodPhase = "Failed"
)

type Pod struct {
	Name  string
	Phase PodPhase
}

func NewPod(name string) *Pod {
	return &Pod{Name: name, Phase: PodPending}
}

func (p *Pod) Start() error {
	if p.Phase != PodPending {
		return fmt.Errorf("%s: Pending holatidan boshqa holatdan Start bo'lmaydi", p.Name)
	}
	p.Phase = PodRunning
	return nil
}

func (p *Pod) Finish(success bool) error {
	if p.Phase != PodRunning {
		return fmt.Errorf("%s: Running holatida bo'lmagan pod tugatilmaydi", p.Name)
	}
	if success {
		p.Phase = PodSucceeded
	} else {
		p.Phase = PodFailed
	}
	return nil
}

func main() {
	pod := NewPod("job-1")
	pod.Start()
	pod.Finish(true)
	fmt.Println(pod.Phase)

	err := pod.Start()
	fmt.Println(err)
}

To'rtta holat: Pending (Pod yaratildi, lekin hali ishga tushmagan — masalan, image hali yuklab olinmoqda), Running (kamida bitta konteyner ishlab turibdi), Succeeded (barcha konteyner MUVAFFAQIYATLI tugadi — odatda bir martalik Job uchun) va Failed (kamida bitta konteyner xato bilan tugadi).

Start va Finish metodlaridagi tekshiruvlar — "Pod Lifecycle" darsining eng muhim g'oyasi: HAR bir o'tish faqat MA'LUM holatdan boshlanishi mumkin (Succeededdan Runningga o'tib bo'lmaydi). Bu xuddi "State Machines" darsida ko'rgan g'oya — noto'g'ri o'tishni ONALARINING o'zida, xato qaytarish orqali OLDINI olish.

>_ Exercise

Muvaffaqiyatsiz Pod'ni qaytadan ishga tushirish imkonini qo'shing.

  • Restart() error metodini yozing: faqat Failed holatidan chaqirilsa Phase'ni Pending'ga qaytaring, aks holda xato qaytaring
  • Pod yarating, uni Start qiling, Finish(false) bilan Failed holatiga o'tkazing, Phase'ni chop eting
  • Restart() ni chaqiring va Phase'ni yana chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Pod hayot tsikli — Pending, Running, Succeeded, Failed kabi ANIQ belgilangan bosqichlardan iborat, va har bir o'tish faqat ma'lum boshlang'ich holatdan RUXSAT etilgan — bu noto'g'ri holat almashinuvlarining oldini oladi.

NEXT UP

Labels & Selectors

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Pod Lifecycle & Status

Pod hayot tsikli va holati

Restoranga buyurtma berganingizda, u bir necha aniq bosqichdan o'tadi: "qabul qilindi" (hali pishirilmagan), "tayyorlanmoqda", va nihoyat "tayyor" yoki (kamdan-kam) "bekor qilindi". Buyurtma bir vaqtning o'zida ikkita bosqichda bo'la olmaydi, va "tayyor"dan to'g'ridan-to'g'ri "qabul qilindi"ga qaytа olmaydi. Kubernetes'dagi Pod ham xuddi shunday, ANIQ belgilangan bosqichlar (Phase) orqali o'tadi.

example.go
package main

import "fmt"

type PodPhase string

const (
	PodPending   PodPhase = "Pending"
	PodRunning   PodPhase = "Running"
	PodSucceeded PodPhase = "Succeeded"
	PodFailed    PodPhase = "Failed"
)

type Pod struct {
	Name  string
	Phase PodPhase
}

func NewPod(name string) *Pod {
	return &Pod{Name: name, Phase: PodPending}
}

func (p *Pod) Start() error {
	if p.Phase != PodPending {
		return fmt.Errorf("%s: Pending holatidan boshqa holatdan Start bo'lmaydi", p.Name)
	}
	p.Phase = PodRunning
	return nil
}

func (p *Pod) Finish(success bool) error {
	if p.Phase != PodRunning {
		return fmt.Errorf("%s: Running holatida bo'lmagan pod tugatilmaydi", p.Name)
	}
	if success {
		p.Phase = PodSucceeded
	} else {
		p.Phase = PodFailed
	}
	return nil
}

func main() {
	pod := NewPod("job-1")
	pod.Start()
	pod.Finish(true)
	fmt.Println(pod.Phase)

	err := pod.Start()
	fmt.Println(err)
}

To'rtta holat: Pending (Pod yaratildi, lekin hali ishga tushmagan — masalan, image hali yuklab olinmoqda), Running (kamida bitta konteyner ishlab turibdi), Succeeded (barcha konteyner MUVAFFAQIYATLI tugadi — odatda bir martalik Job uchun) va Failed (kamida bitta konteyner xato bilan tugadi).

Start va Finish metodlaridagi tekshiruvlar — "Pod Lifecycle" darsining eng muhim g'oyasi: HAR bir o'tish faqat MA'LUM holatdan boshlanishi mumkin (Succeededdan Runningga o'tib bo'lmaydi). Bu xuddi "State Machines" darsida ko'rgan g'oya — noto'g'ri o'tishni ONALARINING o'zida, xato qaytarish orqali OLDINI olish.

>_ Exercise

Muvaffaqiyatsiz Pod'ni qaytadan ishga tushirish imkonini qo'shing.

  • Restart() error metodini yozing: faqat Failed holatidan chaqirilsa Phase'ni Pending'ga qaytaring, aks holda xato qaytaring
  • Pod yarating, uni Start qiling, Finish(false) bilan Failed holatiga o'tkazing, Phase'ni chop eting
  • Restart() ni chaqiring va Phase'ni yana chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Pod hayot tsikli — Pending, Running, Succeeded, Failed kabi ANIQ belgilangan bosqichlardan iborat, va har bir o'tish faqat ma'lum boshlang'ich holatdan RUXSAT etilgan — bu noto'g'ri holat almashinuvlarining oldini oladi.

NEXT UP

Labels & Selectors