GH GambleHub

Descoperirea serviciilor и DNS

Service Discovery и DNS

1) De ce aveți nevoie de ea

În sistemele distribuite, nodurile apar și dispar, iar clienții trebuie să găsească instanțe de lucru ale serviciului rapid și fiabil. DNS - strat de nume universal; descoperirea serviciilor - o strategie de potrivire a numelui serviciului cu puncte finale reale, luând în considerare politica de sănătate, greutate și rutare.

Obiective cheie:
  • nume stabile în loc de adrese efemere,
  • actualizare precisă, dar nu zgomotoasă (echilibru între prospețime și TTL),
  • degradare fără cădere completă (eșec/control de sănătate)
  • minim „guesswork” pe client: timeout, retrays, politici cache.

2) Modele de descoperire a serviciilor

2. 1 Partea clientului

Clientul însuși rezolvă numele unui set de puncte finale și solduri (round-robin, EWMA, hash by key). Sursa - DNS (A/AAAA/SRV), registrul de servicii (Consul/Eureka), lista statică.

Argumente pro: mai puține SPOF-uri centrale, algoritmi flexibili.
Contra: eterogenitatea clientului, este mai dificil de actualizat logica.

2. 2 Server (server-side)

Clientul merge la fata/LB (L4/L7 gateway/ingress). Echilibrarea și controlul sănătății - pe partea proxy/balancer.

Pro: un singur loc de politică, observabilitate.
Contra: Aveți nevoie de un perimetru extrem de disponibil (N + 1, multi-AZ).

2. 3 Hibrid

DNS oferă un set de puncte de intrare (LB regionale), apoi echilibrarea L7/mesh.

3) DNS: elemente de bază, înregistrări și TTL

3. 1 Tipuri de bază

A/AAAA - adrese IPv4/IPv6.
CNAME - alias la un alt nume (nu la apex).
SRV - '_ service. _ proto. nume "→ gazdă/port/greutate/prioritate (pentru gRPC/LDAP/SIP etc.).
TXT/HTTP/HTTPS - metadate/indicatoare (inclusiv pentru descoperirea HTTP).
NS/SOA - delegarea zonei și atribute.

3. 2 TTL și cache

Cache-ul este disponibil de la: OS resolver, local stub resolver, noduri (NodeLocal DNS/CoreDNS), furnizor, recursoare intermediare și client bibliotecă. Prospețimea reală = min (TTL, politica clientului). Memoria cache negativă (NXDOMAIN) este, de asemenea, cache over 'SOA. MINIM "/" TTL ".

Recomandări:
  • Prod - TTL 30-120s pentru înregistrări dinamice, 300-600 pentru stabil.
  • Pentru comutatoare (feilover), pregătiți un TTL redus în avans și nu „în timpul unui incendiu”.
  • Luați în considerare memoria cache lipicioasă a bibliotecilor (Java/Go/Node) - dacă este necesar, configurați TTL-ul rezolvătorului în timpul rulării.

4) Politici de echilibrare DNS și toleranță la erori

RR ponderată - ponderi pe A/AAAA/SRV.
Failover - seturi primare/secundare (control de sănătate în afara).
Geo/Latency - răspuns la „cel mai apropiat” POP/regiune.
Anycast - un IP în diferite POP (BGP); rezistent la perturbări regionale.
Split-horizon - răspunsuri diferite în interiorul VPC/on-prem și pe Internet.
GSLB este un echilibru global cu controale de sănătate și politici (latență, geo, capacitate).

5) Controale de sănătate și prospețime

DNS în sine este „prost”: nu cunoaște sănătatea backendurilor. Prin urmare:
  • Sau un extern health-checker gestionează înregistrări/greutăți (GSLB, Route53/Traffic-policy, externe-dns + probe).
  • Sau/mesh client face un activ outlier-ejection și încercați din nou de la multe puncte finale.

6) Kubernetes: descoperire din cutie

Nume de serviciu: "svc. namespace. svc. cluster. local '.
ClusterIP: IP virtual stabil + kube-proxy/ebpf.
Serviciul fără cap ('clusterIP: None'): oferă înregistrări A pentru păstăi (sau subdomeniile lor), SRV pentru porturi.
EndpointSlice: listă scalabilă a obiectivelor finale (înlocuirea punctelor finale).
CoreDNS: cluster DNS resolver; plugin-uri rescrie/șablon/înainte/cache; Zona "kube-dns'.
NodeLocal DNSCache: cache local pe nod → mai puțină latență și interceptarea problemelor de rezolvare în amonte.

Exemplu: Fără cap + SRV

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

Clientul poate rezolva '_ grpc. _ tcp. plăți. prod. svc. cluster. local "(SRV) și a obține gazdă/port/greutăți.

CoreDNS (fragment 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 (idei):
  • DaemonSet cu rezolvator local pe '169. 254. 20. 10`; kubelet specifică acest punct.
  • Reduce rezoluția numelui p99 și protejează împotriva clapetei DNS din amonte.

7) Descoperirea serviciului вне K8s

Consul: agent, controale de sănătate, director de servicii, interfață DNS ('.consul'), KV pentru configurații.
Eureka/ZooKeeper/etcd: registre pentru JVM/moștenire; adesea în combinație cu un lateral/gateway.
Trimisul/Istio: EDS/xDS (Endpoint Discovery) și SDS (secrete); serviciile sunt declarate prin intermediul avionului de control.

8) securitate DNS

DNSSEC: protejați integritatea înregistrărilor (semnătura zonală). Critic pentru domeniile publice.
DoT/DoH: canal de criptare recursivă (politici interne, compatibilitate).
ACL și split-horizon: zonă privată - numai de la VPC/VPN.
Protecție împotriva otrăvirii cache: randomizare port/ID, TTL-uri scurte pentru dinamică.
Politici privind ieșirea: permiteți DNS numai pe soluționari de încredere, jurnal.

9) Comportamentul clientului și al retragerii

Respectați TTL: nu faceți cache la nesfârșit, nu „fără lege” cu rezoluții frecvente (furtună la recursiv).
Happy Eyeballs (IPv4/IPv6), conexiuni paralele la mai multe A/AAAAs reduce coada.
Retroactive numai pentru cereri idempotente; Jitter, limitarea retraielor bugetare.

Reglarea fină a runtime resolver:
  • Java: "networkaddress. cache. ttl', "networkaddress. cache. negativ. ttl'.
  • Go: 'GODEBUG = netdns = go '/' cgo', 'Resolver. PreferGo ',' DialTimeout '.
  • Nod: 'dns. setDefaultResultOrder ('ipv4first') ',' lookup 'с' all: true '.

10) Comutare GSLB/DNS: practică

Coborâți TTL de la 300→60 cu 24-48 de ore înainte de trecerea programată.
Țineți un set canar de criterii finale de greutate scăzută pentru validare.
Utilizați ponderat + control de sănătate în loc de o actualizare manuală în masă a înregistrărilor A.
Pentru statică/margine - Anycast; pentru API - Geo/Latency + L7-feiler rapidă.

11) Observabilitate și SLO pentru nume

Măsurători:
  • Rata/latența interogărilor DNS, raportul de succes cache, erori după tip (SERVFAIL/NXDOMAIN).
  • Procentul de cereri cu răspunsuri vechi (dacă se utilizează memoria cache veche).
  • Succesul operațiunilor utilizatorilor privind modificările de înregistrare (SLI de afaceri).
  • p95/p99 rezolvarea timpului în cererile.
Diagnosticare:
  • Stratify calea: client → cache local → cache nodal → cluster resolver → recursion provider.
  • Urmări NXDOMAIN (Nume/Greșeli de scriere) și SERVFAIL (Probleme de recursivitate/Limite de resurse) piroane.

12) Exemple de configurare

CoreDNS: rescriere și zona ciot

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

Trimis: dinamic DNS-refresh

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

extern-dns (suport pentru zone publice)

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

13) Lista de verificare a implementării (0-30 zile)

0-7 zile

Director nume serviciu, selectarea modelului (client-/server-side/hibrid).
TTL de bază, activați NodeLocal DNSCache, DNS tablouri de bord metrice.
Interzicerea „IP hard” în config/cod.

8-20 zile

Servicii fără cap + SRV pentru gRPC; EndpointSlice este activat.
GSLB/ponderat pentru extern; controale de sănătate și canar.
Sunt configurate timeout-urile/retraiele clienților și bugetul de retray.

21-30 zile

Split-orizont și zone private; DoT/DoH după politică.
Test de comutare (prin TTL) și feilover; post-analiză.
Mesh/EDS, politicile de ejecție mai exterioare sunt activate.

14) Anti-modele

TTL = 0 în prod → furtună la recursuri, întârzieri imprevizibile.
Hardcode IP/port, fără CNAME/pseudonime pentru niveluri.
Schimbarea înregistrărilor „manual” fără controale de sănătate și canari.
Un rezolvator global cu nici un cache nod (blocaj).
Ignorarea memoriei cache negative (piroane NXDOMAIN).
Încercările de a „vindeca” un eșec al bazei de date prin DNS în loc de stratul de date/feilover.

15) Valorile maturității

100% din servicii folosesc nume; zero cazuri hard-IP.
CoreDNS/NodeLocal în vânzări, cache hit-raport> 90% pe noduri.
GSLB cu controale de sănătate, comutatoare TTL și runbook documentate.
SRV/EndpointSlice pentru stateful/gRPC, p99 rezolva-timp în aplicații ≤ 20-30 ms.
Alerte pentru degradarea raportului de lovire SERVFAIL/NXDOMAIN și cache.
Verificări în CI: ban „: cele mai recente” și hard-IP în diagrame/configurații.

16) Concluzie

Serviciul de descoperire este un contract de nume stabil și disciplina cache. Construiți un model hibrid: DNS oferă conectare rapidă și ușoară, L7/mesh - sănătate și politici inteligente. Mențineți TTL inteligent, cache-ul gazdă, servicii fără cap și SRV acolo unde este necesar, utilizați GSLB/Anycast pentru limitele regionale, păstrați un ochi pe NXDOMAIN/SERVFAIL și p99 rezolva-timp. Atunci numele tău va fi la fel de fiabil ca și serviciul în sine.

Contact

Contactați-ne

Scrieți-ne pentru orice întrebare sau solicitare de suport.Suntem mereu gata să ajutăm!

Pornește integrarea

Email-ul este obligatoriu. Telegram sau WhatsApp sunt opționale.

Numele dumneavoastră opțional
Email opțional
Subiect opțional
Mesaj opțional
Telegram opțional
@
Dacă indicați Telegram — vă vom răspunde și acolo, pe lângă Email.
WhatsApp opțional
Format: cod de țară și număr (de exemplu, +40XXXXXXXXX).

Apăsând butonul, sunteți de acord cu prelucrarea datelor dumneavoastră.