GoDasturchi
Admission Validation: Gatekeeping Changes

Admission Validation: Gatekeeping Changes

Admission validatsiya: o'zgarishlarni nazorat qilish

Bino kirish eshigidagi qorovul har bir tashrif buyuruvchining ID kartasini va ruxsatnomasini TEKSHIRADI — hatto agar lift (keyingi bosqich) texnik jihatdan ishlab tursa ham, qorovul ID'si YO'Q odamni ICHKARIGA umuman KIRITMAYDI. Kubernetes'da Admission Validator — aynan shu qorovul: yangi Pod yoki Deployment YARATILISHIDAN OLDIN, uni tekshirib, agar QOIDALARGA mos kelmasa, Scheduler HATTO KO'RMASDAN turib RAD etadi.

example.go
package main

import (
	"fmt"
	"strings"
)

type PodSpec struct {
	Name     string
	Image    string
	CPULimit int
	MemLimit int
}

type Rule func(PodSpec) error

func RequireResourceLimits(p PodSpec) error {
	if p.CPULimit <= 0 || p.MemLimit <= 0 {
		return fmt.Errorf("%s: CPU va Memory limit ko'rsatilishi shart", p.Name)
	}
	return nil
}

func ForbidLatestTag(p PodSpec) error {
	if p.Image == "" {
		return fmt.Errorf("%s: image ko'rsatilmagan", p.Name)
	}
	if strings.HasSuffix(p.Image, "latest") {
		return fmt.Errorf("%s: \":latest\" tegidan foydalanish taqiqlangan", p.Name)
	}
	return nil
}

type AdmissionValidator struct {
	Rules []Rule
}

// Validate — barcha qoidalarni ketma-ket tekshiradi, BIRINCHI xatoda to'xtaydi
func (v *AdmissionValidator) Validate(p PodSpec) error {
	for _, rule := range v.Rules {
		if err := rule(p); err != nil {
			return err
		}
	}
	return nil
}

func main() {
	validator := &AdmissionValidator{Rules: []Rule{RequireResourceLimits, ForbidLatestTag}}

	good := PodSpec{Name: "web-1", Image: "myapp:v1", CPULimit: 1, MemLimit: 512}
	bad := PodSpec{Name: "web-2", Image: "myapp:latest", CPULimit: 1, MemLimit: 512}

	fmt.Println(validator.Validate(good))
	fmt.Println(validator.Validate(bad))
}

RulePodSpecni qabul qilib, error qaytaradigan FUNKSIYA TURI ("Function Types" darsini eslang). Bu, HAR bir qoidani ALOHIDA, kichik funksiya sifatida yozib, ularni Rules slice'iga ERKIN qo'shish/olib tashlash imkonini beradi — xuddi "Middleware Pattern"da ko'rgan zanjirlash (chaining) g'oyasi kabi. ForbidLatestTag:latest tegidan foydalanishni TAQIQLAYDI, chunki bu tegi HAR safar BOSHQA image'ga ishora qilishi mumkin, bu esa production'da QAYSI aniq versiya ishlab turganini NOANIQ qiladi.

Validate — qoidalarni KETMA-KET, BIRINCHI xatoda TO'XTAB tekshiradi ("fail-fast"). Bu — Pod hali Scheduler'ga YETIB BORMASDAN turib, xato konfiguratsiyani ERTAROQ ushlab qolish imkonini beradi: resurs limitisiz yoki :latest bilan yozilgan Pod umuman "qabul QILINMAYDI", hatto klasterda joy YETARLI bo'lsa ham.

>_ Exercise

Pod nomining uzunligiga chegara qo'yuvchi yangi qoida qo'shing.

  • MaxNameLength(p PodSpec) error funksiyasini yozing: agar len(p.Name) 20 dan katta bo'lsa, xato qaytaring
  • Uni AdmissionValidator'ning Rules ro'yxatiga (RequireResourceLimits va ForbidLatestTag bilan birga) qo'shing
  • Yaxshi nomli va JUDA UZUN nomli ikkita PodSpec'ni Validate qilib, natijalarni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Admission Validator — Pod Scheduler'ga yetib borishidan OLDIN, uni belgilangan qoidalar zanjiri orqali tekshirib, mos kelmasa RAD etadigan "qorovul"; har bir qoidani alohida, kichik funksiya sifatida yozish, ularni erkin qo'shish/olib tashlash imkonini beradi.

NEXT UP

Writing a Real Kubernetes Manifest

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Admission Validation: Gatekeeping Changes

Admission validatsiya: o'zgarishlarni nazorat qilish

Bino kirish eshigidagi qorovul har bir tashrif buyuruvchining ID kartasini va ruxsatnomasini TEKSHIRADI — hatto agar lift (keyingi bosqich) texnik jihatdan ishlab tursa ham, qorovul ID'si YO'Q odamni ICHKARIGA umuman KIRITMAYDI. Kubernetes'da Admission Validator — aynan shu qorovul: yangi Pod yoki Deployment YARATILISHIDAN OLDIN, uni tekshirib, agar QOIDALARGA mos kelmasa, Scheduler HATTO KO'RMASDAN turib RAD etadi.

example.go
package main

import (
	"fmt"
	"strings"
)

type PodSpec struct {
	Name     string
	Image    string
	CPULimit int
	MemLimit int
}

type Rule func(PodSpec) error

func RequireResourceLimits(p PodSpec) error {
	if p.CPULimit <= 0 || p.MemLimit <= 0 {
		return fmt.Errorf("%s: CPU va Memory limit ko'rsatilishi shart", p.Name)
	}
	return nil
}

func ForbidLatestTag(p PodSpec) error {
	if p.Image == "" {
		return fmt.Errorf("%s: image ko'rsatilmagan", p.Name)
	}
	if strings.HasSuffix(p.Image, "latest") {
		return fmt.Errorf("%s: \":latest\" tegidan foydalanish taqiqlangan", p.Name)
	}
	return nil
}

type AdmissionValidator struct {
	Rules []Rule
}

// Validate — barcha qoidalarni ketma-ket tekshiradi, BIRINCHI xatoda to'xtaydi
func (v *AdmissionValidator) Validate(p PodSpec) error {
	for _, rule := range v.Rules {
		if err := rule(p); err != nil {
			return err
		}
	}
	return nil
}

func main() {
	validator := &AdmissionValidator{Rules: []Rule{RequireResourceLimits, ForbidLatestTag}}

	good := PodSpec{Name: "web-1", Image: "myapp:v1", CPULimit: 1, MemLimit: 512}
	bad := PodSpec{Name: "web-2", Image: "myapp:latest", CPULimit: 1, MemLimit: 512}

	fmt.Println(validator.Validate(good))
	fmt.Println(validator.Validate(bad))
}

RulePodSpecni qabul qilib, error qaytaradigan FUNKSIYA TURI ("Function Types" darsini eslang). Bu, HAR bir qoidani ALOHIDA, kichik funksiya sifatida yozib, ularni Rules slice'iga ERKIN qo'shish/olib tashlash imkonini beradi — xuddi "Middleware Pattern"da ko'rgan zanjirlash (chaining) g'oyasi kabi. ForbidLatestTag:latest tegidan foydalanishni TAQIQLAYDI, chunki bu tegi HAR safar BOSHQA image'ga ishora qilishi mumkin, bu esa production'da QAYSI aniq versiya ishlab turganini NOANIQ qiladi.

Validate — qoidalarni KETMA-KET, BIRINCHI xatoda TO'XTAB tekshiradi ("fail-fast"). Bu — Pod hali Scheduler'ga YETIB BORMASDAN turib, xato konfiguratsiyani ERTAROQ ushlab qolish imkonini beradi: resurs limitisiz yoki :latest bilan yozilgan Pod umuman "qabul QILINMAYDI", hatto klasterda joy YETARLI bo'lsa ham.

>_ Exercise

Pod nomining uzunligiga chegara qo'yuvchi yangi qoida qo'shing.

  • MaxNameLength(p PodSpec) error funksiyasini yozing: agar len(p.Name) 20 dan katta bo'lsa, xato qaytaring
  • Uni AdmissionValidator'ning Rules ro'yxatiga (RequireResourceLimits va ForbidLatestTag bilan birga) qo'shing
  • Yaxshi nomli va JUDA UZUN nomli ikkita PodSpec'ni Validate qilib, natijalarni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Admission Validator — Pod Scheduler'ga yetib borishidan OLDIN, uni belgilangan qoidalar zanjiri orqali tekshirib, mos kelmasa RAD etadigan "qorovul"; har bir qoidani alohida, kichik funksiya sifatida yozish, ularni erkin qo'shish/olib tashlash imkonini beradi.

NEXT UP

Writing a Real Kubernetes Manifest