GH GambleHub

Service Discovery и DNS

Service Discovery и DNS

1) რატომ არის ეს აუცილებელი?

განაწილებულ სისტემებში კვანძები ჩნდება და ქრება, ხოლო მომხმარებლებმა უნდა იპოვონ მომსახურების სამუშაო ნიმუშები სწრაფად და საიმედოდ. DNS - სახელების უნივერსალური ფენა; მომსახურება discovery - რეალურ ენდოინტებთან მომსახურების სახელის შედარების სტრატეგია, ჯანმრთელობის, წონის და მარშრუტიზაციის პოლიტიკის გათვალისწინებით.

ძირითადი მიზნები:
  • სტაბილური სახელები ეფემერული მისამართების ნაცვლად,
  • ზუსტი, მაგრამ არა ხმაურიანი განახლება (ბალანსი სიახლესა და TTL- ს შორის),
  • დეგრადაცია სრული ვარდნის გარეშე,
  • მინიმალური „დაშვება“ კლიენტზე: ტაიმაუტები, რეტრაები, ქეშის პოლიტიკა.

2) სერვისის მოდელები

2. 1 კლიენტი (client-side)

თავად კლიენტი საშუალებას აძლევს სახელს ენდოინების ნაკრები და დაბალანსდეს (გზის რობინი, EWMA, ჰაში). წყარო - DNS (A/AAA/SRV), მომსახურების რეესტრი (Consul/Eureka), სტატიკური სია.

დადებითი: ნაკლები ცენტრალური SPOF, მოქნილი ალგორითმები.
უარყოფითი მხარეები: მომხმარებელთა ჰეტეროგენულობა, ლოგიკის განახლება უფრო რთულია.

2. 2 სერვერი (სერვერის მხარე)

კლიენტი მიდის front/LB (L4/L7, gateway/ingress). დაბალანსება და ჯანმრთელობის შემოწმება მარიონეტული/დაბალანსების მხარეზეა.

დადებითი: პოლიტიკის ერთიანი ადგილი, დაკვირვება.
უარყოფითი მხარეები: თქვენ გჭირდებათ მაღალი ხელმისაწვდომი პერიმეტრი (N + 1, multi-AZ).

2. 3 ჰიბრიდი

DNS იძლევა შესასვლელი წერტილების ერთობლიობას (რეგიონალური LB), შემდეგ - დაბალანსებას L7/mesh- ზე.

3) DNS: საფუძვლები, ჩანაწერები და TTL

3. 1 ძირითადი ტიპები

A/AAAA - IPv4/IPv6 მისამართები.
CNAME - ალიასი სხვა სახელით (არა აპექსით).
SRV — `_service._proto. Name მასპინძელი/პორტი/წონა/პრიორიტეტი (gRPC/LDAP/SIP და ა.შ.).
TXT/HTTP/HTTPS - მეტამონაცემები/მაჩვენებლები (მათ შორის HTTP დისკისთვის).
NS/SOA - ზონის დელეგაცია და ატრიბუტები.

3. 2 TTL და ქეში კასკადი

ქეშს აქვს: OS რეზერვუარი, ადგილობრივი stub რეზერვუარი, კვანძები (NodeLOCal DNS/StoreDNS), პროვაიდერი, შუალედური რეკურსორები და ბიბლიოთეკის კლიენტი. ფაქტობრივი სიახლე = min (TTL, კლიენტის პოლიტიკა). ნეგატიური ქეში (NXDOMAIN) ასევე იშლება 'SOA- ს მიხედვით. MINIMUM`/`TTL`.

რეკომენდაციები:
  • Prod - TTL 30-120s დინამიური ჩანაწერებისთვის, 300-600s სტაბილური.
  • გადართვისთვის (ფეილოვერი) წინასწარ მოამზადეთ შემცირებული TTL და არა „ხანძრის დროს“.
  • გაითვალისწინეთ ბიბლიოთეკების sticky ქეში (Java/Go/Node) - საჭიროების შემთხვევაში, ჩამოაყალიბეთ TTL რეზერვუარი ranthim- ის შიგნით.

4) DNS დაბალანსებისა და წინააღმდეგობის პოლიტიკის პოლიტიკა

Wighted RR - წონა A/AAA/SRV.
Failover არის პირველადი/მეორადი ნაკრები.
Geo/Latency - პასუხი „უახლოეს“ ROP/რეგიონში.
Anycast - ერთი IP სხვადასხვა POP (BGP); მდგრადია რეგიონალური ჩავარდნების მიმართ.
Split-horizon არის სხვადასხვა პასუხები VPC/on-prem და ინტერნეტში.
GSLB არის გლობალური დაბალანსება, რომელსაც აქვს ჯანმრთელობის შემოწმებები და პოლიტიკოსები (latency, geo, capacity).

5) ჯანმრთელობის შემოწმებები და სიახლე

DNS თავისთავად „მუნჯია“: მან არ იცის ზურგჩანთების ჯანმრთელობა. ამიტომ:
  • ან გარე health-checker აკონტროლებს ჩანაწერებს/მასშტაბებს (GSLB, Route53/Traffic-policy, external-dns + ნიმუშები).
  • ან კლიენტი/mesh აკეთებს აქტიურ outlier-ejection და retry მრავალი endpoint- დან.

6) Kubernetes: ყუთის დისკო

მომსახურების სახელები: 'svc. namespace. svc. cluster. local`.
ClusterIP: სტაბილური ვირტუალური IP + kube-proxy/ebpf.
Headless Service ('clusterIP: None'): აძლევს A- ჩანაწერებს pod's (ან მათი ქვე-დომენი), SRV პორტებისთვის.
EndpointSlice: Endpoints- ის მასშტაბური სია (Endpoints- ის ჩანაცვლება).
CoreDNS: DNS კასეტა რეზერვერი; lagines rewrite/template/forward/cache; 'kube-dn' ზონა.
NodeLocal DNSCache: კვანძზე ადგილობრივი ქეში უფრო ნაკლებია, ვიდრე ლატენტობა და გამაძლიერებელი რეზინის პრობლემების მოსაგვარებლად.

მაგალითი: Headless + SRV

yaml apiVersion: v1 kind: Service metadata: { name: payments, namespace: prod }
spec:
clusterIP: None selector: { app: payments }
ports:
- name: grpc port: 50051 targetPort: 50051

კლიენტს შეუძლია რეზინის '_ grpc. _ tcp. payments. prod. svc. cluster. ადგილობრივი '(SRV) და მიიღე მასპინძელი/პორტი/წონა.

ConfigMap (ConfigMap ფრაგმენტი)

yaml apiVersion: v1 kind: ConfigMap metadata: { name: coredns, namespace: kube-system }
data:
Corefile:
.:53 {
errors health ready cache 30 loop forward. /etc/resolv. conf prometheus:9153 reload
}
NodeLocal DNS (იდეები):
  • DaemonSet ადგილობრივი რეზერვუარით '169. 254. 20. 10`; kubelet მიუთითებს ამ წერტილზე.
  • ამცირებს p99 name-resolution და იცავს Apple-DNS- სგან.

7) Service discovery вне K8s

კონსული: აგენტი, ჯანმრთელობის შემოწმებები, სერვისის კატალოგი, DNS ინტერფეისი ('.consul'), KV კონფისკაციისთვის.
Eureka/ZooKeeper/etcd: რეესტრები JVM/legacy; ხშირად sidecar/კარიბჭესთან ერთად.
Envoy/Istio: EDS/xDS (Endpoint Discovery) და SDS (საიდუმლოებები); სერვისები გამოცხადებულია საკონტროლო თვითმფრინავის საშუალებით.

8) DNS უსაფრთხოება

DNSSEC: ჩანაწერების მთლიანობის დაცვა (ზონების ხელმოწერა). კრიტიკულია საჯარო დომენებისთვის.
DoT/DoH: არხის დაშიფვრა რეკურსორისთვის (შიდა პოლიტიკა, თავსებადობა).
ACL და split-horizon: პირადი ზონა - მხოლოდ VPC/VPN- დან.
ქეშისგან მოწამვლისგან დაცვა: პორტების/ID რანდომიზაცია, მოკლე TTL დინამიკისთვის.
პოლიტიკოსები egress: დაუშვეთ DNS მხოლოდ სანდო რეზერვუარებზე, ჟურნალები.

9) მომხმარებელთა ქცევა

პატივს სცემთ TTL- ს: ნუ ქეშავთ უსასრულოდ, ნუ „არასწორად“ ხშირი რეზერვებით (ქარიშხალი რეკურსორის მიმართ).
ბედნიერი Eyeballs (IPv4/IPv6), პარალელური კონექტორები რამდენიმე A/AAAA- სთვის ამცირებს tail.
Retrai მხოლოდ idempotent მოთხოვნით; ჯიტერი, budget რეაგირების შეზღუდვა.

Ranthim- ის რეზერვუარის დახვეწილი კონფიგურაცია:
  • Java: `networkaddress. cache. ttl`, `networkaddress. cache. negative. ttl`.
  • Go: `GODEBUG=netdns=go`/`cgo`, `Resolver. PreferGo`, `DialTimeout`.
  • Node: `dns. setDefaultResultOrder('ipv4first')`, `lookup` с `all:true`.

10) GSLB/DNS გადართვა: პრაქტიკა

შეამცირეთ TTL 300-დან 60-მდე დაგეგმილი გადართვამდე 24-48 საათით ადრე.
შეინარჩუნეთ ენდოინტის კანარის ნაკრები, რომელსაც აქვს დაბალი წონა.
გამოიყენეთ შაბათ + ჯანმრთელი შემოწმება ხელით A- ჩანაწერების მასიური ადაპტაციის ნაცვლად.
სტატიკისთვის/edge - Anycast; API- სთვის - Geo/Latency + სწრაფი L7 ფეილოვერი.

11) სახელისთვის დაკვირვება და SLO

მეტრიკა:
  • DNS მოთხოვნების შეფასება/ანალიზი, cache hit-ratio, ტიპის შეცდომები (SERVFAIL/NXDOMAIN).
  • მოთხოვნის წილი ფოლადის პასუხებით (თუ stale-cache იყენებთ).
  • მომხმარებლის ოპერაციების წარმატება ჩანაწერების შეცვლაში (ბიზნეს SLI).
  • p95/p99 resolve დრო პროგრამებში.
დიაგნოზი:
  • დაგეგმეთ გზა: კლიენტი - ადგილობრივი ქეში - ღამის ქეში - კასეტური რეზოლვერი - პროვაიდერის რეკურსორი.
  • თვალყური ადევნეთ NXDOMAIN (სახელების/ტიპების შეცდომები) და SERFAIL (რეკურსორის/რესურსის ლიმიტის პრობლემები).

12) კონფიგურაციის მაგალითები

CoreDNS: rewrite და stub ზონა

yaml
.:53 {
log errors cache 60 rewrite name suffix. svc. cluster. local. svc. cluster. local forward. 10. 0. 0. 2 10. 0. 0. 3
}

example. internal:53 {
file /zones/example. internal. signed dnssec
}

systemd-resolved (ადგილობრივი რეზინის ღერძი)

ini
[Resolve]
DNS=169. 254. 20. 10
FallbackDNS=1. 1. 1. 1 8. 8. 8. 8
Domains=~cluster. local ~internal
DNSSEC=yes

ენვოი: დინამიური DNS-refresh

yaml dns_refresh_rate: 5s dns_failure_refresh_rate:
base_interval: 2s max_interval: 30s respect_dns_ttl: true

external dns (საზოგადოებრივი ზონის მხარდაჭერა)

yaml args:
- --source=service
- --source=ingress
- --domain-filter=example. com
- --policy=upsert-only
- --txt-owner-id=cluster-prod

13) განხორციელების სიის სია (0-30 დღე)

0-7 დღე

სერვისების სახელების კატალოგი, მოდელის არჩევანი (client/სერვერის მხარე/ჰიბრიდი).
ძირითადი TTL, ჩართეთ NodeLocal DNSCache, DNS მეტრის დაშბორდები.
„მკაცრი IP“ - ის აკრძალვა კონფისკაციაში/კოდში.

8-20 დღე

Headless სერვისები + SRV gRPC- სთვის; EndpointSlice ჩართულია.
GSLB/ყოველკვირეული გარე; ჯანმრთელობის შემოწმებები და კანალიზაცია.
შედგენილია მომხმარებელთა ტაიმაუტები/რეტრაილები და რეკრეაციული ბიუჯეტი.

21-30 დღე

Split-horizon და პირადი ზონები; DoT/DoH პოლიტიკის შესახებ.
გადართვის ტესტი (TTL- ის მიხედვით) და ფეილოვერი; შემდგომი ანალიზი.
ჩართულია mesh/EDS პოლიტიკოსები, outlier-ejection.

14) ანტი შაბლონები

TTL = 0 გაყიდვაში - ქარიშხალი რეკურსორებისთვის, არაპროგნოზირებადი შეფერხებები.
IP/პორტების ჰარდკოდი, CNAME/ალიასის დონის არარსებობა.
ჩანაწერების „ხელით“ შეცვლა ჯანმრთელობის შემოწმებისა და კანარის გარეშე.
ერთი გლობალური რეზოლვერი კვანძებზე ქეშის გარეშე (ვიწრო ადგილი).
უარყოფითი ქეშის უგულებელყოფა (NXDOMAIN ადიდებული).
DNS- ის საშუალებით BD- ს უკმარისობის „მკურნალობის“ მცდელობები მონაცემთა დონის/ფეილოვერის ნაცვლად.

15) სიმწიფის მეტრიკა

სერვისების 100% იყენებს სახელებს; ნულოვანი შემთხვევები hard-IP.
MoreDNS/NodeLocal გაყიდვაში, cache hit-ratio> 90% კვანძებში.
GSLB ჯანმრთელობის შემოწმებებით, დოკუმენტირებული TTL და runbook გადართვა.
SRV/EndpointSlice stateful/grRPC, p99 resolve დრო აპლიკაციებში 20-30 ms.
Alerta of SERVFAIL/NXDOMAIN და cache hit-ratio დეგრადაცია.
შემოწმებები CI- ში: აკრძალვა ': latest' და hard IP ჩარტებში/კონფისკაციებში.

16) დასკვნა

Service discovery არის ქეშის სტაბილური სახელისა და დისციპლინის ხელშეკრულება. ააშენეთ ჰიბრიდული მოდელი: DNS იძლევა სწრაფ და მარტივ შესასვლელს, L7/mesh - ჯანმრთელობას და ჭკვიან პოლიტიკოსებს. შეინარჩუნეთ გონივრული TTL, კვანძების ქეში, headless სერვისები და SRV, სადაც საჭიროა, გამოიყენეთ GSLB/Anycast რეგიონების საზღვრებისთვის, დააკვირდით NXDOMAIN/SERVFAIL L L L- ს და PE E E ED DEEAD D D DD D D DDDEIEED D D D DEe შემდეგ თქვენი სახელი იქნება იგივე საიმედო აქტივი, როგორც თავად მომსახურება.

Contact

დაგვიკავშირდით

დაგვიკავშირდით ნებისმიერი კითხვის ან მხარდაჭერისთვის.ჩვენ ყოველთვის მზად ვართ დაგეხმაროთ!

ინტეგრაციის დაწყება

Email — სავალდებულოა. Telegram ან WhatsApp — სურვილისამებრ.

თქვენი სახელი არასავალდებულო
Email არასავალდებულო
თემა არასავალდებულო
შეტყობინება არასავალდებულო
Telegram არასავალდებულო
@
თუ მიუთითებთ Telegram-ს — ვუპასუხებთ იქაც, დამატებით Email-ზე.
WhatsApp არასავალდებულო
ფორმატი: ქვეყნის კოდი და ნომერი (მაგალითად, +995XXXXXXXXX).

ღილაკზე დაჭერით თქვენ ეთანხმებით თქვენი მონაცემების დამუშავებას.