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.
- 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.
- 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.