Настройка Kubernetes External DNS для автоматического управления DNS

Меняем ручные правки DNS на автоматическую синхронизацию с кластером: записи появляются и удаляются сами при изменении нагрузки. Мы настраиваем External DNS в Kubernetes под ключ — от аудита текущих зон до передачи регламентов вашей команде. Сокращаем время на обслуживание записей и убираем ошибки ручного ввода.
Часто задаваемые вопросы

Почему External DNS Kubernetes отстаёт от изменений в кластере

Пересоздали сервис — поды поднялись, проверки проходят, а трафик не идёт. Запись в зоне всё ещё указывает на прежний адрес балансировщика, которого уже нет: клиент получает таймаут, хотя со стороны кластера всё зелёное. И пока не истечёт время жизни записи, кеширующие серверы продолжают отдавать старый адрес — сбой держится дольше, чем длится сам релиз.

Причина в разрыве между жизненным циклом объектов кластера и содержимым зоны. Сервис живёт минуты, запись — до первой ручной правки, поэтому расхождение записей и сервисов копится с каждой выкаткой. Устаревшие записи после пересоздания сами не удаляются: остаётся мусор, который резолвится и уводит часть запросов в никуда, а часть — на прошлый контур. Диагностика при этом усложняется: снаружи домен отвечает, внутри кластера всё работает, а между ними — несовпадение.

Дальше начинаются ручные правки зон. Дежурный сверяет список сервисов с содержимым зоны, вычищает лишнее, дописывает новое — ночью и под давлением, по инструкции, которую никто не проверял на полноту. Обратной сверки нет: никто не подтверждает, что в зоне не осталось указателей на несуществующие адреса. Автоматическое управление DNS снимает именно эту работу — External DNS связывает объекты кластера с зоной напрямую; разбираем, как это устроено и что даёт.

Что меняется в эксплуатации: измеримые эффекты автоматизации

External DNS-контроллер подключается к кластеру и работает как цикл сверки: он читает сервисы и точки входа с пометкой о внешнем имени и приводит записи в зоне к этому состоянию. Источник правды остаётся один — манифест, а не панель регистратора, поэтому изменения не нужно дублировать руками. Дальше эффект раскладывается на четыре измеримых направления.

Скорость появления записей перестаёт зависеть от человека: имя публикуется в течение десятков секунд после применения манифеста, а не в следующем окне ручных правок, и сокращённое время жизни записи позволяет быстро снять устаревший ответ из кэша резолверов. Доля ручных операций в зоне падает до единичных случаев — обычно это делегирование домена и записи для ресурсов вне кластера, которые сознательно выводят из-под автоматики.

Основной выигрыш — устранённый класс отказов из-за человеческой ошибки: опечатка в имени, забытая запись после удаления окружения, конфликт двух владельцев за одно имя, расхождение между тем, что реально работает в кластере, и тем, что опубликовано в зоне. Такие расхождения почти не видны в мониторинге приложения — они всплывают как «сервис жив, но недоступен снаружи», и поиск уходит в сторону от реальной причины.

Время восстановления сервиса сокращается: при пересоздании или переезде нагрузка получает новую точку входа, и запись обновляется без дежурного с доступом к панели регистратора. Обратная операция тоже автоматизирована — удаление окружения освобождает имена, и в зоне не накапливаются мёртвые указатели, которые потом приходится вычищать вручную.

Варианты синхронизации DNS: от ручных правок до полного автомата

Синхронизировать зону с кластером можно четырьмя способами, и выбор между ними — это выбор между скоростью реакции на изменения и предсказуемостью содержимого зоны. External DNS читает описания объектов кластера и создаёт или обновляет записи, но режимы его работы и политики определяют, что он имеет право менять и удалять.

Вариант Когда подходит Ограничения
Ведение зон вручную Стабильный набор сервисов, редкие релизы Правки отстают от выката, ошибки в записях ловятся уже в проде, всё держится на одном человеке
Задания по расписанию Много сервисов, смена адресов раз в сутки Запись появляется с задержкой, параллельные запуски конфликтуют, нет сверки с фактическим состоянием
Автоматика по описанию сервисов Динамические окружения, частое масштабирование Нужны права на запись в зону, требуется явная политика удаления и метки на объектах
Гибридная схема управления Критические записи должны остаться у инженера Сложнее правила разграничения, нужен список зон и записей, которых автоматика не касается

На практике чаще приходят к гибридной схеме: сервисы разработки управляются автоматически, а корневые и почтовые записи остаются за инженером, потому что ошибка в них роняет сразу всё. Границы фиксируются явным перечнем зон, которые автоматика не трогает, — тогда выкат нового сервиса не требует участия человека, а зона остаётся в предсказуемом состоянии.

Этапы внедрения в кластер Kubernetes: от аудита до передачи

Порядок работ выстраиваем так, чтобы автоматизация DNS получила ровно те права, что нужны для публикации записей, и не могла задеть зоны, живущие вне кластера. Каждый этап заканчивается артефактом, который проверяется до перехода к следующему.

  1. Аудит зон и прав. Собираем зоны, которые обслуживает кластер, смотрим, какие записи там созданы вручную и кто за них отвечает. Для облачного провайдера заводим отдельную учётную запись с ограниченной ролью: запись разрешена только в выделенные зоны, остальное — чтение.
  2. Схема соответствия сервисов и записей. Фиксируем, какое имя получает каждый сервис — по аннотации, по метке или по шаблону владельца команды. Здесь же разводим конфликты с уже существующими записями и договариваемся, кто владеет удалением.
  3. Настройка. Определяем источники имён, фильтр по домену, режим синхронизации и интервал сверки. Добавляем служебную запись-маркер: по ней контроллер понимает, что запись создана им, и не перезаписывает чужую.
  4. Проверка на стенде. На копии зоны прогоняем сценарии: публикация нового сервиса, переименование, удаление, конфликт имён, недоступность провайдера. Отдельно смотрим, что происходит с записями при откате релиза.
  5. Передача в эксплуатацию. Отдаём регламент, доступы, метрики и порядок действий при расхождении — что чинится автоматически, а где нужен человек.

Конфигурации, схемы и регламенты в комплекте передачи

Комплект передачи — не архив с манифестами, а набор артефактов, по которым ваша команда сама добавляет зоны, отзывает доступы и разбирает сбои без обращения к нам. Всё складываем в ваш репозиторий с историей изменений и прогоняем сценарии на стенде вместе с дежурной сменой.

  • Рабочие конфигурации — манифесты контроллера External DNS с фактическими значениями: источники записей, фильтры по зонам и доменам, интервал синхронизации, режим правки записей.
  • Карта зон — что делегировано, где размещён авторитетный DNS, какие записи управляются автоматически, какие заведены руками и трогать их нельзя, где проходят границы ответственности.
  • Политики владения записями — контроллер правит только своими записями: метка владельца, отдельный реестр, разделение зон между командами.
  • Политики доступа — сервисная учётная запись под контроллер, права только на нужные зоны, чтение и запись разделены, ключи в секретах с регламентом ротации.
  • Регламент реагирования — что проверять при рассинхроне, пропаже обновлений и отказе доступа к провайдеру; как вернуться к предыдущему состоянию и к кому эскалировать.
  • Инструкции для дежурных — как посмотреть план изменений без применения, убедиться, что запись управляется автоматически, и что смотреть в журналах при конфликте.
  • Подключение новой зоны — порядок шагов: делегирование, доступы, фильтры, тестовый прогон, включение правок в рабочем контуре.
  • Наблюдаемость — метрики контроллера, оповещения об ошибках авторизации и задержке синхронизации, панель для дежурной смены.

Документацию пишем под ваш контур, а не под типовой стенд: имена зон, учётных записей и пороги оповещений в ней уже ваши, поэтому передача не превращается в повторное проектирование.

Кейс: от ручных правок записей к автоматической синхронизации

Продуктовая команда держала 40+ сервисов в кластере, а зоны в панели регистратора вела вручную: записи A, CNAME и TXT заводились тикетами и правились дежурным инженером. Вывод сервиса, смена балансировщика или переезд узла превращались в цепочку согласований — правка доезжала до боевой зоны за 30-40 минут. За квартал набралось 11 инцидентов с записями: забытая запись при выводе сервиса, указатель на снятый узел, дубли после ручного слияния зон. Суммарный простой из-за неверной маршрутизации — около 9 часов.

Внедрили External DNS: источником истины стали аннотации сервисов и объектов Ingress, а доступ к API регистратора выдали отдельному сервисному аккаунту с правами только на нужные зоны. На тестовом контуре сначала включили режим предпросмотра — сервис показывал план изменений и не применял его; сверка с фактическими записями вскрыла 14 расхождений, оставшихся от ручного периода, и их вычистили до включения на боевых зонах. Зоны разработки, предпродакшена и боевого контура развели по отдельным именам, TTL держим коротким.

Теперь маршрут меняется вместе с выкатом: инженер правит манифест, запись обновляется в том же цикле, окно — минуты. Откат — возврат предыдущего манифеста, а не ручной поиск старого адреса. За следующий квартал число инцидентов с записями упало с 11 до 1, и тот пришёл со стороны регистратора, а не из наших зон. Простои из-за неверной маршрутизации сократились с 9 часов до получаса, а указатели на выведенные узлы исчезают вместе с объектами — реестр зон перестал расти.

Что делать, если кластер уже развёрнут и записи ведутся вручную?

Кластер уже работает, а записи в зонах создавались вручную — переход на автоматику при этом не требует окна обслуживания. Начинаем с инвентаризации: выгружаем записи, сопоставляем их с объектами кластера, отмечаем, что создано руками, что балансировщиком, какие TTL и кто владелец домена. Без этой карты первый же прогон синхронизации снесёт то, что годами настраивали вручную.

Дальше External DNS включается в режиме наблюдения: права на зону выдаём только на чтение, решения сверяем с фактическим состоянием без изменений. Ключевое — метка владения: управляемая запись получает служебную TXT-запись с идентификатором владельца, и сервис считает своими только те, где метка совпала. Чужие записи остаются нетронутыми: политика upsert-only (обновление и добавление без удаления) запрещает стирание, а фильтр по доменам ограничивает ответственность уже проверенными поддоменами.

Переход идёт поэтапно — сначала непродуктивный контур, затем по одной зоне продуктив с паузой на сверку. Перед переключением TTL ключевых записей снижается заранее, поэтому откат возвращает трафик за минуты. Откат вообще дешёвый: синхронизация выключается, записи в зоне остаются рабочими, потому что ни одну из них мы не удаляли.

В итоге сервисы не простаивают, существующие записи сохраняются, а ручное редактирование зоны становится исключением — только для того, что кластером не управляется.

Технические сомнения: ограничения, отказоустойчивость, права

ExternalDNS нередко воспринимают как способ раздать командам доступ к управлению DNS-зоной. На деле контроллер видит только разрешённые ему объекты кластера и правит зону в границах выданного доменного фильтра — всё остальное вне его ответственности.

Ниже — сомнения, которые чаще всего звучат на приёмке: поведение при сбоях у провайдера, защита от удаления чужих записей, разделение прав между командами и границы самого подхода.

Что будет, если DNS-провайдер недоступен или отвечает ошибками?

Контроллер повторяет запросы с нарастающей паузой и не трогает записи, которые не смог подтвердить: в зоне остаётся последнее успешно применённое состояние, и сервисы продолжают резолвиться по нему. Алерты ставим на длительность серии ошибок и на расхождение между кластером и зоной — сбой видно до следующего релиза, а не после жалоб пользователей.

Как контроллер понимает, какие записи его, и не удалит ли лишнее?

Каждую созданную запись сопровождает служебная TXT-запись с идентификатором владельца. Меняется и удаляется только помеченное этим идентификатором, поэтому записи, заведённые вручную, остаются нетронутыми. Режим upsert-only запрещает удаление вовсе, а доменный фильтр ограничивает работу конкретными зонами.

Как разграничить права между командами?

Разделяем источники: одна команда публикует сервисы только в своём пространстве имён, другая — в своей подзоне. Права на объекты кластера выдаются ролями, права на зону — отдельной учётной записью провайдера с доступом к одной зоне. Ошибка в манифесте не выводит команду за периметр.

Какие ограничения у подхода?

Автоматизация покрывает записи, выводимые из объектов кластера. Статические записи, почтовые маршруты и географическая балансировка остаются за администратором DNS: если таких записей много, автоматизируем только сервисную часть зоны.

Что подготовить к обсуждению и как начнём работу

Оценка автоматического управления DNS-записями укладывается в один разговор, если на входе есть инвентарь зон и понятные границы доступов. Ниже — вводные, которые снимают большую часть неопределённости: часть закрывается прямо в переписке, остальное — доступом к тестовой среде.

  • Список доменов и поддоменов, которые должны управляться из кластера, и где заканчивается ручное управление.
  • Владелец зоны и токен доступа к DNS с правами только на нужную зону, а не на весь аккаунт.
  • Перечень сервисов и точек входа, которым нужны записи: только внешние или ещё внутренние.
  • Режим синхронизации: запись на каждый объект или только на помеченные, и что делать с уже существующими записями.
  • Количество сред и то, как разделены зоны между ними.
  • Окно изменений и правило отката: что происходит с записью при удалении сервиса.

Дальше порядок простой: короткий разговор по вводным, инвентаризация зон и доступов, пилот на тестовом домене, раскатка по средам и передача регламента эксплуатации. Пилот занимает несколько дней — на нём проверяем создание, обновление и удаление записей и отдельно поведение при откате. Полная раскатка по средам — обычно одна-две недели с учётом окна изменений. По итогу у вас остаётся воспроизводимая схема и понятный порядок действий, если понадобится вернуть ручное управление.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142