Node Affinity & Taints
Node moyilligi va "taint"lar
Ba'zi yuk mashinalari FAQAT sovutgichli yuklarni tashiy oladi (affinity — pod ma'lum xususiyatli Node'ni TALAB qiladi). Ba'zi to'xtash joylari esa "faqat ruxsatnomasi bor mashinalar uchun" deb belgilangan — oddiy mashina u yerga to'xtay OLMAYDI, faqat maxsus RUXSATNOMASI (toleration) bo'lgan mashina to'xtashi mumkin (taint — Node'ning o'zi "meni faqat RUXSATI borlar ishlatsin" deb belgilanishi). Kubernetes'da ham Pod'lar QAYSI Node'ga borishi mumkinligini aynan shu ikki mexanizm — affinity va taint/toleration — orqali cheklaydi.
package main
import "fmt"
type Node struct {
Name string
Labels map[string]string
Taints []string
}
type Pod struct {
Name string
NodeSelector map[string]string
Tolerations []string
}
func tolerates(tolerations []string, taint string) bool {
for _, t := range tolerations {
if t == taint {
return true
}
}
return false
}
// Fits — pod shu node'ga JOYLASHISHI mumkinmi: affinity mos kelishi VA barcha taint'lar tolerate qilingan bo'lishi kerak
func Fits(node *Node, pod *Pod) bool {
for key, value := range pod.NodeSelector {
if node.Labels[key] != value {
return false
}
}
for _, taint := range node.Taints {
if !tolerates(pod.Tolerations, taint) {
return false
}
}
return true
}
func main() {
gpuNode := &Node{Name: "gpu-node", Labels: map[string]string{"disktype": "ssd"}, Taints: []string{"gpu-only"}}
normalPod := &Pod{Name: "web-1", NodeSelector: map[string]string{"disktype": "ssd"}}
gpuPod := &Pod{Name: "ml-1", NodeSelector: map[string]string{"disktype": "ssd"}, Tolerations: []string{"gpu-only"}}
fmt.Println(Fits(gpuNode, normalPod))
fmt.Println(Fits(gpuNode, gpuPod))
}Affinity (NodeSelector) — Pod'ning "men FAQAT shunday Node'da ishlashni xohlayman" degan TALABI — bu "Labels & Selectors" darsida ko'rgan Selector'ning aynan o'zi, endi Pod->Node moslashuvi uchun ishlatiladi. Taint — Node'ning "meni FAQAT ruxsati borlar ishlatsin" degan CHEKLOVI; toleration — Pod'ning "menda shu ruxsat BOR" degan JAVOBI. normalPod gpu-only taint'ini tolerate qilmagani uchun gpuNodega JOYLASHA olmaydi — hatto label'lari mos kelsa ham.
Bu ikkalasi TESKARI yo'nalishda ishlaydi: affinity — Pod TOMONDAN "men shu yerga borishni xohlayman", taint — Node TOMONDAN "faqat ruxsati borlar kelsin". Amalda taint ko'pincha maxsus (masalan, GPU'li yoki qimmat) Node'larni ODATIY Pod'lardan HIMOYA qilish uchun ishlatiladi — shunday Node'lar faqat ATAYLAB shunga mo'ljallangan Pod'lar bilan "band" bo'lib qoladi.
>_ Exercise
Bir nechta Node orasidan pod mos keladiganlar sonini hisoblang.
- •CountFits(nodes []*Node, pod *Pod) int funksiyasini yozing: Fits true qaytargan Node'lar sonini hisoblang
- •gpuNode, disktype=hdd bo'lgan plainNode va disktype=ssd, taint'siz ssdNode yarating
- •normalPod uchun CountFits natijasini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Node affinity — Pod'ning "faqat shunday Node'da ishlayman" degan talabi, taint/toleration esa Node'ning "faqat ruxsati borlar kelsin" degan cheklovi; ikkalasi birgalikda Pod'lar qaysi Node'larga joylasha olishini nozik boshqarish imkonini beradi.
NEXT UP
The Reconciliation Loop Pattern
$ go run main.go
Kodingizni ishga tushiring