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.
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))
}Rule — PodSpecni 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.
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
$ go run main.go
Kodingizni ishga tushiring