Logo GH

Service Discovery және DNS

Service Discovery және DNS

1) Бұл не үшін қажет

Бөлінген жүйелерде тораптар пайда болады және жоғалады, ал клиенттер сервистің жұмыс үлгілерін тез және сенімді табуы тиіс. DNS - атаулардың әмбебап қабаты; service discovery - денсаулық, салмақ және бағыттау саясатын ескере отырып, сервис атауын нақты эндпойнттарға салыстыру стратегиясы.

Негізгі мақсаттар:
  • эфемерлік мекенжайлардың орнына тұрақты атаулар,
  • дәл, бірақ шулы емес апдейт (жаңалық пен TTL арасындағы теңгерім),
  • толық құлдыраусыз тозу (failover/health-check),
  • клиентке ең аз «болжам»: таймауттар, ретраилер, кэш-саясат.

2) service discovery модельдері

2. 1 Клиенттік (client-side)

Клиенттің өзі атауды эндпойнттар жиынтығына рұқсат етеді және теңгерімдейді (round-robin, EWMA, кілт бойынша хеш). Дереккөз - DNS (A/AAAA/SRV), сервис-тізілім (Consul/Eureka), статикалық тізім.

Артықшылықтары: орталық SPOF аз, икемді алгоритмдер.
Кемшіліктері: клиенттердің біртекті еместігі, логиканы жаңарту қиынырақ.

2. 2 Серверлік (server-side)

Клиент front/LB-ге барады (L4/L7, gateway/ingress). Теңгерім және health-checking - прокси/теңгеруші жағында.

Артықшылықтары: саясаттың бірыңғай орны, бақылау.
Кемшіліктері: қол жетімділігі жоғары периметр (N + 1, multi-AZ) қажет.

2. 3 Гибрид

DNS кіру нүктелерінің жиынтығын (аймақтық LB) береді, одан әрі - L7/mesh теңгерім.

3) DNS: негіздері, жазбалары және TTL

3. 1 Негізгі түрлері

A/AAAA - IPv4/IPv6 мекенжайлар.
CNAME - басқа атаудағы алиас (apex емес).
SRV — `_service._proto. name '→ хост/порт/салмақ/артықшылық (gRPC/LDAP/SIP және т.б.).
TXT/HTTP/HTTPS - метадеректер/көрсеткіштер (соның ішінде HTTP-discovery үшін).
NS/SOA - жіберу және аймақ төлсипаттары.

3. 2 TTL және кэш-каскад

Кэш бар: ОС резолвері, жергілікті stub-резолвері, тораптар (NodeLocal DNS/CoreDNS), провайдер, аралық рекурсорлар және кітапхана клиентінде. Нақты жаңалық = min (TTL, клиенттің саясаты). Теріс кэш (NXDOMAIN) де 'SOA бойынша кэшеленеді. MINIMUM`/`TTL`.

Ұсынымдар:
  • Прод - динамикалық жазбалар үшін TTL 30-120s, тұрақты үшін 300-600s.
  • Қайта қосу үшін (фейловер) «өрт кезінде» емес, алдын ала төмендетілген TTL дайындаңыз.
  • Sticky-кэшін (Java/Go/Node) ескеріңіз - қажет болған жағдайда рантайм ішіндегі TTL кескінін теңшеңіз.

4) DNS-теңгерім және істен шығуға төзімділік саясаты

Weighted RR - A/AAAA/SRV салмағы.
Failover - бірінші/екінші жиынтық (сыртынан health-check).
Geo/Latency - «жақын» РОР/өңірге жауап.
Anycast - әр түрлі POP (BGP) бір IP; өңірлік іркілістерге төзімді.
Split-horizon - VPC/он-прем ішіндегі және интернеттегі әртүрлі жауаптар.
GSLB - health-тексерулері және саясаты бар жаһандық теңгерімдеуші (latency, гео, capacity).

5) Health-checks және жаңалық

DNS өзі «ақымақ»: ол бэкендтердің денсаулығын білмейді. Сондықтан:
  • Немесе сыртқы health-checker жазбаларды/таразыларды басқарады (GSLB, Route53/Traffic-policy, external-dns + сынамалар).
  • Немесе клиент/mesh көптеген эндпойндардан белсенді outlier-ejection және retry жасайды.

6) Kubernetes: қораптан discovery

Сервистік атаулар: 'svc. namespace. svc. cluster. local`.
ClusterIP: тұрақты виртуалды IP + kube-proxy/ebpf.
Headless Service ('clusterIP: None'): A жазбаларын pod's (немесе олардың астыңғы доменінде), порттар үшін SRV береді.
EndpointSlice: Эндпойнттардың масштабталатын тізімі (Endpoints алмастыру).
CoreDNS: кластердің DNS резолвері; rewrite/template/forward/cache плагиндері; 'kube-dns' аймағы.
NodeLocal DNSCache: тораптағы жергілікті кэш → аз latency және апстрим-резолвер проблемаларын ұстап алу.

Мысал: 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

Клиент '_ grpc. _ tcp. payments. prod. svc. cluster. local '(SRV) және хост/порт/салмақ алу.

CoreDNS (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 (идеялар):
  • DaemonSet '169. 254. 20. 10`; kubelet осы нүктені көрсетеді.
  • p99 name-resolution дегенді азайтады және apstrim-DNS «флапынан» қорғайды.

7) Service discovery сыртында K8s

Consul: агент, health-checks, қызмет каталогы, DNS интерфейсі ('.consul'), конфигурацияларға арналған KV.
Eureka/ZooKeeper/etcd: JVM/legacy үшін тізілімдер; жиі sidecar/шлюз байланысында.
Envoy/Istio: EDS/xDS (Endpoint Discovery) және SDS (құпиялар); сервистер control-plane арқылы жарияланады.

8) DNS қауіпсіздігі

DNSSEC: жазбалардың тұтастығын қорғау (аймақ қолтаңбасы). Көпшілік домендер үшін сыни.
DoT/DoH: рекурсорға арнаны шифрлау (ішкі саясат, үйлесімділік).
ACL және split-horizon: жеке аймақ - тек VPC/VPN-тен.
Кэш-уланудан қорғау: порттарды/ID рандомизациялау, динамика үшін қысқа TTL.
egress саясаты: DNS тек сенімді қарауыштарға рұқсат етіңіз, журналдаңыз.

9) Клиенттердің мінез-құлқы және ретра

TTL-ді құрметтеңіз: шексіз кэштемеңіз, жиілікпен «шектемеңіз» (рекурсорға дауыл).
Happy Eyeballs (IPv4/IPv6), бірнеше A/AAAA параллель коннектілер tail азайтады.
Ретраялар тек идемпотенттік сұраулар кезінде ғана; джиттер, ретрайлардың budget шектелуі.

Рантайм резолверін жіңішке теңшеу:
  • 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-ауыстырып қосу: тәжірибе

TTL-ді жоспарлы ауыстырып қосудан 24-48 сағат бұрын 300 → 60-тан төмендетіңіз.
Валидация үшін аз салмақты эндпойнттардың канареялық жиынтығын ұстаңыз.
Қолмен жазылған А жазбасының орнына weighted + health-check қолданыңыз.
Статика үшін/edge - Anycast; API үшін - Geo/Latency + жылдам L7-фейловер.

11) Атау үшін бақылау және SLO

Өлшемдері:
  • Rate/latency DNS-сұраулар, cache hit-ratio, түрлері бойынша қателер (SERVFAIL/NXDOMAIN).
  • Stale-жауаптары бар сұраулардың үлесі (егер stale-cache пайдалансаңыз).
  • Жазбаларды ауыстыру кезінде пайдаланушы әрекеттерінің табысы (бизнес-SLI).
  • p95/p99 resolve-time бағдарламаларында.
Диагностика:
  • Жолды бөліңіз: клиент → жергілікті кэш → нод кэш → кластерлік резолвер → провайдер рекурсоры.
  • NXDOMAIN (атаулардың қателері/қателер) және SERVFAIL (рекурсор проблемалары/ресурс-лимиттер) жарылыстарын қадағалаңыз.

12) Конфигурация мысалдары

CoreDNS: rewrite және stub аймағы

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

Envoy: динамикалық DNS-refresh

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

external-dns (көпшілік аймағын қолдау)

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

13) Енгізу чек-парағы (0-30 күн)

0-7 күн

Сервис атауларының каталогы, модельді таңдау (client-/server-side/гибрид).
Негізгі TTL, NodeLocal DNSCache, DNS-метрикалық дашбордтарды қосыңыз.
Конфига/кодта «қатты IP» дегенге тыйым салу.

8-20 күн

gRPC үшін Headless-сервистер + SRV; EndpointSlice қосылған.
GSLB/weighted сыртқы үшін; health-checks және канарейка.
Клиенттердің таймауттары/ретрайлары және ретрайлардың бюджеті теңшелген.

21-30 күн

Split-horizon және жеке аймақтар; Саясат бойынша DoT/DoH.
Ауыстырып қосу тесті (TTL бойынша) және фейловер; пост-талдау.
mesh/EDS, outlier-ejection саясаты қосылған.

14) Қарсы үлгілер

Рекурсорларға TTL = 0 прод → дауыл, болжанбайтын кідірістер.
IP/порттардың хардкоды, деңгейлер үшін CNAME/алиастардың болмауы.
Жазуларды health-checks және канарейкаларсыз «қолмен» ауыстыру.
Түйіндердегі кэшсіз бір жаһандық резолвер (тар орын).
Теріс кэшті елемеу (NXDOMAIN жарқылдауы).
Деректер/фейловер деңгейінің орнына DNS арқылы ДБ істен шығуын «емдеу» әрекеттері.

15) Жетілу метрикасы

Сервистердің 100% аттарын пайдаланады; нөлдік жағдайлар hard-IP.
CoreDNS/NodeLocal өнімде, cache hit-ratio> 90% түйіндерде.
TTL және runbook ауыстырып-қосу құжатталған health-checks бар GSLB.
SRV/EndpointSlice stateful/gRPC үшін, p99 resolve-time қосымшаларда ≤ 20-30 мс.
SERVFAIL/NXDOMAIN және cache hit-ratio деградациясы бойынша алерталар.
CI тексерулері: тыйым салу ': latest' және хит/конфигурациялардағы hard-IP.

16) Қорытынды

Service discovery - бұл тұрақты ат және кэш тәртібі туралы шарт. Гибридті модельді жасаңыз: DNS жылдам және қарапайым кіріс береді, L7/mesh - денсаулық және ақылды саясаткерлер. Ақылға қонымды TTL-ді, тораптағы кэшті, headless-сервистерді және қажет жерде SRV-ді қолдаңыз, аймақтардың шекаралары үшін GSLB/Anycast-ті пайдаланыңыз, NXDOMAIN/SERVFAIL және p99 resolve-time-ті қадағалаңыз. Сонда сіздің атыңыз қызметтің өзі сияқты сенімді актив болады.

Contact

Бізбен байланысыңыз

Кез келген сұрақ немесе қолдау қажет болса, бізге жазыңыз.Біз әрдайым көмектесуге дайынбыз!

Telegram
@Gamble_GC
Интеграцияны бастау

Email — міндетті. Telegram немесе WhatsApp — қосымша.

Сіздің атыңыз міндетті емес
Email міндетті емес
Тақырып міндетті емес
Хабарлама міндетті емес
Telegram міндетті емес
@
Егер Telegram-ды көрсетсеңіз — Email-ге қоса, сол жерге де жауап береміз.
WhatsApp міндетті емес
Пішім: +ел коды және номер (мысалы, +7XXXXXXXXXX).

Батырманы басу арқылы деректерді өңдеуге келісім бересіз.