Какие типы записей существуют в DNS
Что проверяют
Знаете ли вы базовые записи и понимаете ли, как DNS влияет на поведение Go-сервиса: кэширование, смена адресов, резолвинг в Kubernetes. Следом часто спрашивают, как Go резолвит имена и почему сервис ходит на старый IP после смены записи.
Как отвечать
Основные типы с назначением:
- A и AAAA: имя в адрес IPv4 и IPv6;
- CNAME: псевдоним на другое имя. На том же имени рядом с CNAME не может быть других записей, поэтому на корне зоны его не ставят;
- MX: почтовые серверы домена с приоритетом, меньшее число важнее;
- TXT: произвольный текст, на практике SPF, DKIM, DMARC и подтверждение владения доменом;
- NS и SOA: делегирование зоны и её служебные параметры, включая серийный номер;
- PTR: обратная запись, адрес в имя;
- SRV: хост и порт сервиса в формате
_service._proto.name, их используют Consul и headless-сервисы Kubernetes; - CAA: какие удостоверяющие центры вправе выпускать сертификаты для домена;
- HTTPS и SVCB: параметры подключения, например поддержка HTTP/3.
Для Go-разработчика важно, как это выглядит в коде. Пакет net даёт net.LookupHost, LookupMX, LookupTXT, LookupSRV, LookupAddr для PTR, а для таймаутов и своего DNS-сервера используют net.Resolver с PreferGo: true и своей функцией Dial. Выбор между резолвером на чистом Go и системным через cgo переключается GODEBUG=netdns=go или netdns=cgo. Для произвольных типов записей есть библиотека github.com/miekg/dns.
Где спотыкаются
Думают, что Go кэширует DNS. Сам он ответы не кэширует, а http.Transport держит соединения открытыми и новый IP увидит только после их закрытия. При смене адреса помогают IdleConnTimeout и SetConnMaxLifetime у database/sql.
Забывают про ndots:5 в Kubernetes: короткое внешнее имя сначала перебирается по поисковым доменам кластера, и один запрос превращается в несколько. Помогает точка в конце имени.
Путают CNAME с HTTP-редиректом. CNAME меняет только результат резолвинга, адрес в браузере и заголовок Host остаются прежними.