GoDasturchi
Node Affinity & Taints

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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