GH GambleHub

Service Discovery и DNS

Service Discovery и DNS

1) Warum es notwendig ist

In verteilten Systemen entstehen und verschwinden Knoten und Kunden müssen schnell und zuverlässig funktionierende Service-Instanzen finden. DNS - die universelle Schicht der Namen; service discovery - Eine Strategie zur Zuordnung des Dienstnamens zu realen Endpoints unter Berücksichtigung von Gesundheits-, Gewichts- und Routing-Richtlinien.

Die Hauptziele sind:
  • stabile Namen statt ephemerer Adressen,
  • genaue, aber nicht laute Aktualisierung (Balance zwischen Frische und TTL),
  • Degradation ohne vollständigen Sturz (failover/health-check),
  • minimales „Raten“ auf dem Client: Timeouts, Retrays, Cache-Richtlinien.

2) Service-Entdeckungsmodelle

2. 1 Client (Client-Seite)

Der Kunde selbst löst den Namen im Endpoint-Set auf und gleicht aus (round-robin, EWMA, Hash per Key). Quelle: DNS (A/AAAA/SRV), Dienstregister (Consul/Eureka), statische Liste.

Vorteile: weniger zentrale SPOFs, flexible Algorithmen.
Nachteile: Heterogenität der Kunden, es ist schwieriger, die Logik zu aktualisieren.

2. 2 Serverraum (Server-Seite)

Der Kunde geht zu front/LB (L4/L7, gateway/ingress). Balancing und Health-Checking sind auf der Seite des Proxy/Balancers.

Vorteile: einheitlicher Ort der Politik, Beobachtbarkeit.
Nachteile: Sie benötigen einen hochverfügbaren Perimeter (N + 1, multi-AZ).

2. 3 Hybrid

DNS gibt eine Reihe von Einstiegspunkten (regionale LBs), dann - Balancing auf L7/mesh.

3) DNS: Grundlagen, Einträge und TTL

3. 1 Grundtypen

A/AAAA - IPv4/IPv6 Adressen.
CNAME - Alias auf einem anderen Namen (nicht auf Apex).
SRV — `_service._proto. name' → Host/Port/Gewicht/Priorität (für gRPC/LDAP/SIP usw.).
TXT/HTTP/HTTPS - Metadaten/Pointer (inkl. HTTP-Discovery).
NS/SOA - Delegierung und Zonenattribute.

3. 2 TTL und Cache-Kaskade

Der Cache ist in: OS Resolver, Local Stub Resolver, Nodes (NodeLocal DNS/CoreDNS), Provider, Intermediate Recursors und im Library Client. Tatsächliche Frische = min (TTL, Kundenrichtlinie). Der negative Cache (NXDOMAIN) wird ebenfalls über 'SOA zwischengespeichert. MINIMUM`/`TTL`.

Empfehlungen:
  • Prod - TTL 30-120s für dynamische Aufnahmen, 300-600s für stabile Aufnahmen.
  • Bei Schaltungen (Failover) vorher reduzierte TTL vorbereiten, nicht „im Brandfall“.
  • Berücksichtigen Sie den Sticky-Cache der Bibliotheken (Java/Go/Node) - passen Sie bei Bedarf die TTL des Resolvers innerhalb des Rantymes an.

4) DNS-Ausgleichs- und Fehlertoleranzrichtlinien

Weighted RR - Gewichte auf A/AAAA/SRV.
Failover - primäre/sekundäre Kits (Health-Check von außen).
Geo/Latenz ist die Antwort auf die „nächste“ ROR/Region.
Anycast - eine IP in verschiedenen POPs (BGP); resistent gegen regionale Störungen.
Split-Horizon - unterschiedliche Antworten innerhalb des VPC/on-prem und im Internet.
Die GSLB ist ein globaler Bilanzierer mit Gesundheitschecks und Richtlinien (Latenz, Geo, Kapazität).

5) Gesundheitschecks und Frische

DNS selbst ist „stumpf“: Es kennt die Gesundheit der Backends nicht. Daher:
  • Entweder verwaltet ein externer Health-Checker die Einträge/Gewichte (GSLB, Route53/Traffic-policy, external-dns + samples).
  • Entweder Client/Mesh macht eine aktive Outlier-Ejection und Retry aus einer Vielzahl von Endpunkten.

6) Kubernetes: Entdeckung aus der Box

Service-Namen: 'svc. namespace. svc. cluster. local`.
ClusterIP: stabile virtuelle IP + kube-proxy/ebpf.
Headless Service ('clusterIP: None'): gibt A-Datensätze an Pod's (oder deren Subdomain), SRV für Ports.
EndpointSlice: Skalierbare Liste von Endpunkten (Ersatz von Endpunkten).
CoreDNS: DNS-Resolver des Clusters; plugins rewrite/template/forward/cache; 'kube-dns' zone.
NodeLocal DNSCache: Lokaler Cache auf dem Knoten → weniger Latenz und Abfangen von Upstream-Resolver-Problemen.

Beispiel: 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

Der Client kann'_ grpc. _ tcp zurückrufen. payments. prod. svc. cluster. local'(SRV) und erhalten Host/Port/Gewichte.

CoreDNS (ConfigMap-Fragment)

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 (Ideen):
  • DaemonSet mit lokalem Resolver auf '169. 254. 20. 10`; kubelet gibt diesen Punkt an.
  • Reduziert p99 name-resolution und schützt vor „flap“ upstream-DNS.

7) Service discovery вне K8s

Consul: Agent, Health-Checks, Service-Verzeichnis, DNS-Schnittstelle ('.consul'), KV für Config.
Eureka/ZooKeeper/etcd: Register für JVM/legacy; oft in Verbindung mit Sidecar/Gateway.
Envoy/Istio: EDS/xDS (Endpoint Discovery) und SDS (Secrets); Dienste werden über control-plane angekündigt.

8) DNS-Sicherheit

DNSSEC: Schutz der Integrität von Datensätzen (Zonensignatur). Kritisch für Public Domains.
DoT/DoH: Kanal-zu-Rekursor-Verschlüsselung (interne Richtlinien, Kompatibilität).
ACL und Split-Horizon: privater Bereich - nur von VPC/VPN.
Schutz vor Cache-Vergiftung: Port-Randomisierung/ID, kurze TTLs für Dynamik.
Richtlinien auf egress: DNS nur auf vertrauenswürdige Resolver zulassen, protokollieren.

9) Kundenverhalten und Retrays

Respektieren Sie TTL: Zwischenspeichern Sie nicht unbegrenzt, „zügeln“ Sie nicht durch häufige Resolve (Sturm auf den Rekursor).
Happy Eyeballs (IPv4/IPv6), parallele Anschlüsse zu mehreren A/AAAAs reduzieren das Tail.
Retrays nur bei idempotenten Anfragen; jitter, Beschränkung der Budget-Retrays.

Feinabstimmung des Rantime Resolvers:
  • 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-Switching: Praxis

Senken Sie die TTL von 300→60 24 bis 48 Stunden vor dem geplanten Wechsel.
Halten Sie einen kanarischen Satz von Endpoints mit geringem Gewicht für die Validierung.
Wenden Sie weighted + health-check anstelle eines manuellen Massen-Updates von A-Einträgen an.
Für Statik/Kante - Anycast; für API - Geo/Latency + schneller L7-Failover.

11) Beobachtbarkeit und SLO für den Namen

Metriken:
  • Rate/Latenz von DNS-Abfragen, Cache-Trefferverhältnis, Fehler nach Typ (SERVFAIL/NXDOMAIN).
  • Anteil der Anfragen mit Stale-Antworten (bei Verwendung von Stale-Cache).
  • Erfolg der Benutzeroperationen bei Datensatzwechsel (Business SLI).
  • p95/p99 resolve-time in Anwendungen.
Diagnose:
  • Trennen Sie den Pfad: Der Client → den lokalen Cache → den Node-Cache → den Cluster-Resolver → den Rekursor des Anbieters.
  • Überwachen Sie die Spitzen von NXDOMAIN (Namensfehler/Tippfehler) und SERVFAIL (Rekursorprobleme/Ressourcenlimits).

12) Beispiele für Konfigurationen

CoreDNS: rewrite und stub-zone

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 (Force of Local Resolver)

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

Envoy: dynamische DNS-Aktualisierung

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

External-DNS (Unterstützung öffentlicher Bereiche)

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

13) Checkliste Umsetzung (0-30 Tage)

0-7 Tage

Verzeichnis der Dienstnamen, Modellauswahl (client-/server-side/hybrid).
Basis-TTLs, NodeLocal DNSCache, DNS-Metrik Dashboards einschließen.
Verbot von "harten IPs' in Config/Code.

8-20 Tage

Headless-Dienste + SRV für gRPC; EndpointSlice ist aktiviert.
GSLB/gewichtet für extern; Gesundheitschecks und ein Kanarienvogel.
Kunden-Timeouts/Retrays und das Retrail-Budget sind eingerichtet.

21-30 Tage

Split-Horizon und private Bereiche; DoT/DoH zur Politik.
Schalt- (nach TTL) und Failover-Test; Post-Analyse.
Die Richtlinien mesh/EDS, outlier-ejection sind aktiviert.

14) Anti-Muster

TTL = 0 in der Produktion → Sturm auf Rekursor, unvorhersehbare Verzögerungen.
IP/Port-Hardcode, keine CNAME/Aliasse für Ebenen.
Änderung der Einträge „manuell“ ohne Gesundheitschecks und Kanarienvögel.
Ein globaler Resolver ohne Cache auf Knoten (Engpass).
Ignorieren Sie den negativen Cache (NXDOMAIN-Bursts).
Versuche, DB-Fehler über DNS anstelle der Daten-/Failover-Schicht zu „behandeln“.

15) Reifegradkennzahlen

100% der Dienste verwenden Namen; null Hard-IP-Fälle.
CoreDNS/NodeLocal in der Produktion, Cache-Trefferverhältnis> 90% auf den Knoten.
GSLB mit Health-Checks, TTL-dokumentierten und Runbook-Schaltungen.
SRV/EndpointSlice für stateful/gRPC, p99 resolve-time in Anwendungen ≤ 20-30 ms.
Alerts durch SERVFAIL/NXDOMAIN und Cache-Hit-Ratio-Degradation.
Checks in CI: Ban': latest 'und Hard-IP in den Charts/Config.

16) Schlussfolgerung

Service Discovery ist ein stabiler Namensvertrag und eine Cache-Disziplin. Bauen Sie ein Hybridmodell auf: DNS bietet einen schnellen und einfachen Einstieg, L7/mesh Gesundheit und intelligente Richtlinien. Unterstützen Sie vernünftige TTLs, Node-on-Cache, Headless-Dienste und SRVs, wo Sie müssen, verwenden Sie GSLB/Anycast für Regionsgrenzen, achten Sie auf NXDOMAIN/SERVFAIL und p99 resolve-time. Dann wird Ihr Name so zuverlässig sein wie der Service selbst.

Contact

Kontakt aufnehmen

Kontaktieren Sie uns bei Fragen oder Support.Wir helfen Ihnen jederzeit gerne!

Telegram
@Gamble_GC
Integration starten

Email ist erforderlich. Telegram oder WhatsApp – optional.

Ihr Name optional
Email optional
Betreff optional
Nachricht optional
Telegram optional
@
Wenn Sie Telegram angeben – antworten wir zusätzlich dort.
WhatsApp optional
Format: +Ländercode und Nummer (z. B. +49XXXXXXXXX).

Mit dem Klicken des Buttons stimmen Sie der Datenverarbeitung zu.