Usługa Discovery а DNS
Service Discovery а DNS
1) Dlaczego go potrzebujesz
W systemach rozproszonych węzły pojawiają się i znikają, a klienci muszą szybko i niezawodnie znaleźć działające instancje usługi. DNS - uniwersalna warstwa nazw; discovery - strategia dopasowania nazwy usługi do rzeczywistych punktów końcowych, biorąc pod uwagę zdrowie, wagę i politykę routingu.
Główne cele:- nazwy stabilne zamiast adresów efemerycznych,
- dokładna, ale nie hałaśliwa aktualizacja (równowaga między świeżością a TTL),
- degradacja bez całkowitego upadku (kontrola awaryjna),
- minimum „guesswork” na klienta: timeouts, retrays, cache policy.
2) Modele wyszukiwania usług
2. 1 Strona klienta
Sam klient rozwiązuje nazwę do zestawu punktów końcowych i sald (round-robin, EWMA, hash by key). Źródło - DNS (A/AAAA/SRV), rejestr usług (Konsul/Eureka), lista statyczna.
Plusy: mniej centralnych SPOFs, elastyczne algorytmy.
Minusy: heterogeniczność klienta, trudniej jest zaktualizować logikę.
2. 2 Serwer (po stronie serwera)
Klient idzie do front/LB (L4/L7 gateway/ingress). Balansowanie i kontrola zdrowia - po stronie proxy/balancer.
Plusy: jedno miejsce polityki, obserwowalność.
Minusy: Potrzebujesz bardzo dostępnego obwodu (N + 1, multi-AZ).
2. 3 Hybryda
DNS daje zestaw punktów wejścia (regionalnych LB), a następnie L7/mesh bilansowania.
3) DNS: podstawy, zapisy i TTL
3. 1 Typy podstawowe
A/AAAA - adresy IPv4/IPv6.
CNAME - alias do innej nazwy (nie do wierzchołka).
SRV - '_ service. _ proto. nazwa "→ host/port/weight/priority (dla gRPC/LDAP/SIP itp.).
TXT/HTTP/HTTPS - metadane/wskaźniki (w tym dla detekcji HTTP).
NS/SOA - delegacja i atrybuty strefy.
3. 2 TTL i Cache
Pamięć podręczna dostępna jest od: rozdzielacza systemu operacyjnego, lokalnego rozdzielacza stubów, węzłów (NodeLocal DNS/ DNS), dostawcy, rekursorów pośrednich i klienta bibliotecznego. Rzeczywista świeżość = min (TTL, polityka klienta). Pamięć podręczna ujemna (NXDOMAIN) jest również buforowana przez 'SOA. MINIMUM „/” TTL'.
Zalecenia:- Prod - TTL 30-120s dla dynamicznych rekordów, 300-600 s dla stabilnych.
- Dla przełączników (feilover), przygotować obniżony TTL z góry, a nie „podczas pożaru”.
- Weź pod uwagę lepką pamięć podręczną bibliotek (Java/Go/Node) - w razie potrzeby skonfiguruj TTL rozdzielacza wewnątrz czasu trwania.
4) Polityka bilansowania DNS i tolerancji błędów
Ważony RR - wagi A/AAAA/SRV.
Awaria - zestawy podstawowe/wtórne (kontrola zdrowotna na zewnątrz).
Geo/Latency - odpowiedź na „najbliższy” POP/region.
Anycast - jeden IP w różnych POP (BGP); odporne na zakłócenia regionalne.
Split-horizon - różne odpowiedzi wewnątrz VPC/on-prem i w Internecie.
GSLB jest globalnym balancerem z kontrolą zdrowia i polityką (opóźnienia, geo, zdolność).
5) Kontrole zdrowotne i świeżość
Sam DNS jest „głupi”: nie zna zdrowia backendów. Dlatego:- Lub zewnętrzny kontroler zdrowia zarządza zapisami/wagami (GSLB, Route53/Traffic-policy, external-dns + próbki).
- Lub klient/siatki sprawia aktywny wyrzut i ponowne próbowanie z wielu punktów końcowych.
6) Kubernetes: odkrycie z pudełka
Nazwy usług: 'svc. przestrzeń nazw. svc. klastra. lokalne ".
ClusterIP: stabilny wirtualny IP + kube-proxy/ebpf.
Usługa bezgłowa ('clusterIP: None'): nadaje rekordy A strąkom (lub ich subdomenom), SRV dla portów.
EndpointSlice: skalowalna lista punktów końcowych (zastępująca punkty końcowe).
• DNS: cluster DNS resolver; wtyczki przepisać/szablon/do przodu/do pamięci podręcznej; strefa „kube-dns”.
NodeLocal DNSCache: lokalny pamięć podręczna na węźle → mniej opóźnień i przechwytywania problemów z upstream resolver.
Przykład: Bezgłowa + SRV
yaml apiVersion: v1 kind: Service metadata: { name: payments, namespace: prod }
spec:
clusterIP: None selector: { app: payments }
ports:
- name: grpc port: 50051 targetPort: 50051
Klient może rozwiązać '_ grpc. _ tcp. płatności. prod. svc. klastra. lokalne "(SRV) i uzyskać host/port/wagi.
WDNS (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 (pomysły):
- DaemonSet z lokalnym rozdzielaczem w '169. 254. 20. 10`; kubelet określa ten punkt.
- Zmniejsza rozdzielczość nazw p99 i chroni przed klapą DNS.
7) Service discovery вна K8s
Konsul: agent, kontrola zdrowia, katalog usług, interfejs DNS ('.consul'), KV dla konfiguracji.
Eureka/ZooKeeper/etcd: rejestry JVM/dziedzictwo; często w połączeniu z bocznym ekranem/bramą.
Wysłannik/Istio: EDS/xDS (Endpoint Discovery) i SDS (secrets); usługi deklarowane są za pośrednictwem samolotu kontrolnego.
8) Bezpieczeństwo DNS
DNSSEC: ochrona integralności zapisu (podpis strefy). Krytyczne dla domen publicznych.
DoT/DoH: kanał do szyfrowania rekursji (wewnętrzne zasady, kompatybilność).
ACL i split-horizon: strefa prywatna - tylko z VPC/VPN.
Ochrona przed zatruciem pamięci podręcznej: randomizacja portu/identyfikatora, krótkie TTL dla dynamiki.
Zasady dotyczące wyjścia: zezwalaj DNS tylko na zaufanych rozdzielców, dziennik.
9) Zachowanie klienta i odwrotu
Szacunek TTL: nie buforować bez końca, nie „bezprawnie” z częstymi rozdzielczościami (burza do rekursywnego).
Happy Eyeballs (IPv4/IPv6), równoległe połączenia z wieloma A/AAAA zmniejszają ogon.
Przekłada się tylko na idempotentne prośby; jitter, ograniczanie przekładów budżetowych.
- Java: 'network kaddress. pamięci podręcznej. ttl', "networkaddress. pamięci podręcznej. negatywne. ttl'.
- Idź: 'GODEBUG = netdns = go '/' cgo', 'Resolver'. PreferGo ',' DialTimeout '.
- Węzeł: 'dns. SetDefaultلOrder ('ipv4first') ',' searup ',' wszystko: true '.
10) Przełączanie GSLB/DNS: praktyka
Obniżyć TTL od 300 → 60 24-48 godzin przed planowanym przełącznikiem.
Trzymaj zestaw kanaryjski o niskiej masie punktów końcowych do walidacji.
Użyj ważonej + kontroli stanu zdrowia zamiast ręcznej aktualizacji masy zapisów A.
Dla statyków/krawędzi - Anycast; dla API - Geo/Latency + szybki L7-feiler.
11) Obserwowalność i SLO dla nazwy
Metryka:- Szybkość/opóźnienie zapytań DNS, współczynnik trafienia pamięci podręcznej, błędy według typu (SERVFAIL/NXDOMAIN).
- Odsetek zapytań z ciągłymi odpowiedziami (jeśli za pomocą pamięci podręcznej).
- Sukces operacji użytkownika w zakresie zmian rekordu (business SLI).
- p95/p99 czas rozdzielczości w aplikacjach.
- Stratify ścieżka: client → local cache → cache węzłowe → cluster resolver → provider recursion.
- Śledź kolce NXDOMAIN (Błędy nazwy/Typo) i SERVFAIL (Problemy z rekursją/limity zasobów).
12) Przykłady konfiguracji
DNS: strefa przepisu i stubu
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
}
rozdzielczość systemowa
ini
[Resolve]
DNS=169. 254. 20. 10
FallbackDNS=1. 1. 1. 1 8. 8. 8. 8
Domains=~cluster. local ~internal
DNSSEC=yes
Wysłannik: dynamiczny odświeżacz DNS
yaml dns_refresh_rate: 5s dns_failure_refresh_rate:
base_interval: 2s max_interval: 30s respect_dns_ttl: true
zewnętrzne-dns (wsparcie strefy publicznej)
yaml args:
- --source=service
- --source=ingress
- --domain-filter=example. com
- --policy=upsert-only
- --txt-owner-id=cluster-prod
13) Lista kontrolna realizacji (0-30 dni)
0-7 dni
Katalog nazw usług, wybór modelu (client-/server-side/hybrid).
Podstawowe TTL, włącz NodeLocal DNSCache, deski rozdzielcze DNS.
Zakaz „twardego IP” w konfiguracji/kodzie.
8-20 dni
Usługi bez głowy + SRV dla gRPC; EndpointSlice jest włączony.
GSLB/ważone dla zewnętrznych; kontrole zdrowotne i kanaryjskie.
Konfigurowane są czasy klienta/przekwalifikowanie i przekwalifikowanie budżetu.
21-30 dni
Podział na horyzonty i obszary prywatne; DoT/DoH według zasad.
Test przełączania (według TTL) i feilover; po analizie.
Oczka/EDS, włączone są polityki w zakresie wyrzutów zewnętrznych.
14) Anty-wzory
TTL = 0 w prod → burza do nawrotów, nieprzewidywalne opóźnienia.
Kod IP/port, brak CNAME/aliasów dla poziomów.
Zmiana zapisów „ręcznie” bez kontroli zdrowia i kanarków.
Jeden globalny rozdzielacz bez pamięci podręcznej węzła (wąskie gardło).
Ignorowanie pamięci podręcznej ujemnej (kolce NXDOMAIN).
Próby „uzdrowienia” awarii bazy danych za pośrednictwem DNS zamiast warstwy danych/feilover.
15) Wskaźniki zapadalności
100% usług używa nazw; zero ciężkich spraw IP.
DNS/NodeLocal w sprzedaży, cache hit-ratio> 90% na węzłach.
GSLB z kontrolami zdrowotnymi, udokumentowane przełączniki TTL i runbook.
SRV/EndpointSlice dla stacjonarnych/gRPC, p99 czas rozdzielczości w aplikacjach ≤ 20-30 ms.
Wpisy dotyczące degradacji SERVFAIL/NXDOMAIN i współczynnika trafienia w pamięci podręcznej.
Kontrole w CI: zakaz ': najnowsze' i hard-IP w wykresach/konfiguracjach.
16) Wniosek
Odkrycie usługi to stabilny kontrakt na nazwę i dyscyplina pamięci podręcznej. Zbuduj model hybrydowy: DNS zapewnia szybkie i łatwe logowanie, L7/mesh - zdrowie i inteligentne polityki. Utrzymuj inteligentny TTL, pamięć podręczną hosta, usługi bez głowy i SRV w razie potrzeby, użyj GSLB/Anycast dla granic regionalnych, pilnuj NXDOMAIN/SERVFAIL i p99 resolve-time. Wtedy twoje nazwisko będzie tak niezawodnym atutem jak sama usługa.