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.
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.
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
$ go run main.go
Kodingizni ishga tushiring