GoDasturchi
Service: Stable Networking for Pods

Service: Stable Networking for Pods

Service: Pod'lar uchun barqaror tarmoq

Restoranning bitta umumiy telefon raqami bor — mijoz shu raqamga qo'ng'iroq qilganda, u DOIM band bo'lmagan xodimga ulanadi, hatto xodimlar smena almashtirsa, kasal bo'lib qolsa yoki yangisi ishga kirsa ham. Mijoz uchun raqam har doim BIR XIL — kim javob berishi muhim emas. Pod'lar esa doimo o'chib-yonib turadi, ularning IP-manzili HAR safar YANGI Pod yaratilganda o'zgaradi. Kubernetes'dagi Service — aynan shu "umumiy telefon raqami": u Pod'larga BARQAROR nom orqali murojaat qilish imkonini beradi.

example.go
package main

import "fmt"

type Pod struct {
	Name   string
	IP     string
	Labels map[string]string
}

type Service struct {
	Name     string
	Selector map[string]string
	next     int
}

func (s *Service) Endpoints(pods []Pod) []string {
	var ips []string
	for _, pod := range pods {
		matches := true
		for k, v := range s.Selector {
			if pod.Labels[k] != v {
				matches = false
				break
			}
		}
		if matches {
			ips = append(ips, pod.IP)
		}
	}
	return ips
}

// Pick — round-robin: har chaqiriqda navbatdagi endpoint'ni tanlaydi
func (s *Service) Pick(pods []Pod) string {
	ips := s.Endpoints(pods)
	if len(ips) == 0 {
		return ""
	}
	ip := ips[s.next%len(ips)]
	s.next++
	return ip
}

func main() {
	pods := []Pod{
		{Name: "web-1", IP: "10.0.0.1", Labels: map[string]string{"app": "web"}},
		{Name: "web-2", IP: "10.0.0.2", Labels: map[string]string{"app": "web"}},
		{Name: "db-1", IP: "10.0.0.3", Labels: map[string]string{"app": "db"}},
	}
	svc := &Service{Name: "web-svc", Selector: map[string]string{"app": "web"}}

	for i := 0; i < 4; i++ {
		fmt.Println(svc.Pick(pods))
	}
}

E'tibor bering: Service o'zida Pod IP-manzillarini SAQLAMAYDI — u har Pick chaqiruvida Endpointsni QAYTA hisoblaydi, "Labels & Selectors" darsida ko'rgan Selectordan foydalanib. Bu degani: agar web-2 o'chib, o'rniga yangi web-3 (yangi IP bilan) yaratilsa, Service HECH QANDAY qo'shimcha sozlashsiz, AVTOMATIK ravishda yangi Pod'ni ham ko'radi — chunki u har doim JORIY Pod ro'yxatidan qidiradi.

Pick — "round-robin" yuklarni taqsimlash (load balancing): har chaqiriqda NAVBATDAGI endpoint tanlanadi (s.next % len(ips)), shu orqali so'rovlar barcha mos Pod'lar orasida TEKIS taqsimlanadi. "Service Discovery Part 2: DNS and Kubernetes" darsida (Introduction to Microservices kursida) ko'rganingizdek, real Kubernetes'da bu ish DNS orqali, sizning Go kodingiz buni SEZMASDAN ham amalga oshadi.

>_ Exercise

Service'ga mos endpoint'lar sonini hisoblash imkonini qo'shing.

  • EndpointCount(pods []Pod) int metodini yozing: len(s.Endpoints(pods)) ni qaytaring
  • Uchta app=web va bitta app=db pod bilan, EndpointCount natijasini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Service — Pod'larning o'zgaruvchan IP-manzillari o'rniga, Selector orqali JORIY mos Pod'larni har doim qayta topib, ularga BARQAROR nom va yuk taqsimlash (load balancing) orqali murojaat qilish imkonini beradi.

NEXT UP

The Scheduler: Placing Pods on Nodes

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Service: Stable Networking for Pods

Service: Pod'lar uchun barqaror tarmoq

Restoranning bitta umumiy telefon raqami bor — mijoz shu raqamga qo'ng'iroq qilganda, u DOIM band bo'lmagan xodimga ulanadi, hatto xodimlar smena almashtirsa, kasal bo'lib qolsa yoki yangisi ishga kirsa ham. Mijoz uchun raqam har doim BIR XIL — kim javob berishi muhim emas. Pod'lar esa doimo o'chib-yonib turadi, ularning IP-manzili HAR safar YANGI Pod yaratilganda o'zgaradi. Kubernetes'dagi Service — aynan shu "umumiy telefon raqami": u Pod'larga BARQAROR nom orqali murojaat qilish imkonini beradi.

example.go
package main

import "fmt"

type Pod struct {
	Name   string
	IP     string
	Labels map[string]string
}

type Service struct {
	Name     string
	Selector map[string]string
	next     int
}

func (s *Service) Endpoints(pods []Pod) []string {
	var ips []string
	for _, pod := range pods {
		matches := true
		for k, v := range s.Selector {
			if pod.Labels[k] != v {
				matches = false
				break
			}
		}
		if matches {
			ips = append(ips, pod.IP)
		}
	}
	return ips
}

// Pick — round-robin: har chaqiriqda navbatdagi endpoint'ni tanlaydi
func (s *Service) Pick(pods []Pod) string {
	ips := s.Endpoints(pods)
	if len(ips) == 0 {
		return ""
	}
	ip := ips[s.next%len(ips)]
	s.next++
	return ip
}

func main() {
	pods := []Pod{
		{Name: "web-1", IP: "10.0.0.1", Labels: map[string]string{"app": "web"}},
		{Name: "web-2", IP: "10.0.0.2", Labels: map[string]string{"app": "web"}},
		{Name: "db-1", IP: "10.0.0.3", Labels: map[string]string{"app": "db"}},
	}
	svc := &Service{Name: "web-svc", Selector: map[string]string{"app": "web"}}

	for i := 0; i < 4; i++ {
		fmt.Println(svc.Pick(pods))
	}
}

E'tibor bering: Service o'zida Pod IP-manzillarini SAQLAMAYDI — u har Pick chaqiruvida Endpointsni QAYTA hisoblaydi, "Labels & Selectors" darsida ko'rgan Selectordan foydalanib. Bu degani: agar web-2 o'chib, o'rniga yangi web-3 (yangi IP bilan) yaratilsa, Service HECH QANDAY qo'shimcha sozlashsiz, AVTOMATIK ravishda yangi Pod'ni ham ko'radi — chunki u har doim JORIY Pod ro'yxatidan qidiradi.

Pick — "round-robin" yuklarni taqsimlash (load balancing): har chaqiriqda NAVBATDAGI endpoint tanlanadi (s.next % len(ips)), shu orqali so'rovlar barcha mos Pod'lar orasida TEKIS taqsimlanadi. "Service Discovery Part 2: DNS and Kubernetes" darsida (Introduction to Microservices kursida) ko'rganingizdek, real Kubernetes'da bu ish DNS orqali, sizning Go kodingiz buni SEZMASDAN ham amalga oshadi.

>_ Exercise

Service'ga mos endpoint'lar sonini hisoblash imkonini qo'shing.

  • EndpointCount(pods []Pod) int metodini yozing: len(s.Endpoints(pods)) ni qaytaring
  • Uchta app=web va bitta app=db pod bilan, EndpointCount natijasini chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Service — Pod'larning o'zgaruvchan IP-manzillari o'rniga, Selector orqali JORIY mos Pod'larni har doim qayta topib, ularga BARQAROR nom va yuk taqsimlash (load balancing) orqali murojaat qilish imkonini beradi.

NEXT UP

The Scheduler: Placing Pods on Nodes