Что такое DNS и для чего он нужен
Что проверяют
Понимаете ли вы, что происходит между вызовом http.Get("https://api.example.com") и установкой TCP-соединения, и как это влияет на ваш сервис. Следом часто спрашивают, почему после смены IP-адреса часть трафика продолжает идти на старый сервер или откуда в Kubernetes берутся лишние DNS-запросы.
Как отвечать
DNS это распределённая иерархическая система, которая по имени отдаёт записи, чаще всего IP-адрес. Каркас ответа:
- путь запроса: приложение спрашивает рекурсивный резолвер, тот идёт к корневым серверам, потом к серверам зоны
com, потом к авторитетному серверу домена. Ответы кэшируются на каждом уровне; - типы записей:
AиAAAAдля адресов,CNAMEдля псевдонима,MXдля почты,TXTдля проверок владения и SPF,SRVдля сервисов с портом,NSдля делегирования; - TTL: сколько секунд ответ можно держать в кэше. Смену адреса планируют заранее: сначала снижают TTL, потом меняют запись;
- транспорт: UDP на порту 53, TCP для больших ответов и передачи зон, плюс шифрованные DoT и DoH.
Дальше про Go. В пакете net два резолвера: чистый Go и системный через cgo. На Linux обычно работает Go-резолвер, который сам читает /etc/resolv.conf; переключать можно через GODEBUG=netdns=go или netdns=cgo. Своего кэша у net нет, каждый LookupHost идёт наружу, зато http.Transport переиспользует соединения, и пока соединение живо, новый адрес вы не увидите. Для контроля есть net.Resolver с методами, принимающими context, чтобы ограничить время ожидания.
Где спотыкаются
Говорят, что DNSSEC защищает от DDoS. Он подписывает записи и защищает от подмены ответа, а от перегрузки серверов не спасает.
Считают, что после смены записи все клиенты сразу пойдут на новый адрес. Кэши резолверов и долгие keep-alive соединения держат старый ещё долго.
Не знают про ndots:5 в подах Kubernetes: короткое внешнее имя сначала перебирается по всем search-доменам кластера, и на один запрос приходится несколько лишних. Помогает полное имя с точкой в конце.