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