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!

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.