Logo GH

Descoperirea serviciilor și DNS

Service Discovery și 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, retries, 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 în afara 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' cu' 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 retry.

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!

Telegram
@Gamble_GC
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ă.