Одна цифра в /etc/resolv.conf способна положить внутренний DNS кластер быстрее, чем ботнет на 100 000 хостов.
Разберем анатомию классической аварии, когда параметр `ndots:5` в libc резолвере превращает один легитимный запрос к внешнему API в шторм из шести сетевых пакетов, умножая нагрузку на CoreDNS в разы.
По умолчанию в glibc значение `ndots` равно 1. Но в Kubernetes (и во многих базовых образах дистрибутивов) инжекция search domains в `/etc/resolv.conf` часто выставляет `ndots:5`. Это означает, что если в доменном имени точки встречаются реже пяти раз - а под это условие попадают почти все внешние вызовы вроде `api.stripe.com` или `s3.amazonaws.com` - glibc сначала пытается резолвить имя последовательно через все поисковые суффиксы кубера:
1. `api.stripe.com.default.svc.cluster.local` (NXDOMAIN)
2. `api.stripe.com.svc.cluster.local` (NXDOMAIN)
3. `api.stripe.com.cluster.local` (NXDOMAIN)
4. `api.stripe.com.c.internal-project.internal` (NXDOMAIN)
5. `api.stripe.com` ( SUCCESS )
Каждый шаг - это полноценный UDP (или TCP при fallback) запрос в CoreDNS, который честно идет по цепочке `kube-dns`. Если ваше приложение делает 10 000 запросов в секунду к внешним API, реальный трафик в сторону CoreDNS взлетает до 60 000 RPS. Начинается деградация кэша, срабатывают лимиты `iptables/conntrack` на UDP-соединениях, а p99 латентность сервисов улетает в космос.
Экономика инцидента бьет по карману мгновенно. Кластер из 50 инстансов CoreDNS на AWS `c6i.xlarge` вместо спокойной утилизации ресурсов в 15% упирается в CPU throttle из-за обработки миллионов пустых NXDOMAIN-ответов. Плюс скрытый TCO: деградировавший таймаут соединения (glibc ждет ответ по каждому суффиксу перед отправкой следующего) увеличивает время ожидания потоков в пуле приложения, вызывая каскадный отказ микросервисов.
Как лечить на уровне инфраструктуры:
- Принудительно переопределяйте `dnsConfig` в PodSpec для всех подов с интенсивным внешним трафиком, выставляя `ndots:1`.
- Настраивайте `dnsPolicy: ClusterFirstWithHostNet` или оптимизируйте `kube-dns/CoreDNS` с включением плагина `loop` и агрессивным кэшированием (`cache 30`).
- Используйте короткие канонические имена с точкой на конце (`api.stripe.com.`) в коде приложений - это заставляет glibc сразу идти за абсолютным адресом, минуя суффиксы.
- Инфраструктурный аудит и калькулятор TCO кластера: @Personnel_run_bot (/tma)
- База знаний и разборы: ftops.space
- ftops.space | Run-As-Daemon Infrastructure
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | Памятник kubelet, Kubernetes != CRI | 0 | 7 | 13-07-2026 |
| 2 | Каждые 5 минут транзакции в высоконагруженной PostgreSQL базе внезапно замирают ... | 0 | 11.86 | 24-09-2026 |
| 3 | Каждые 5 минут транзакции в PostgreSQL замирают на 3 - ... | 0 | 11.32 | 24-09-2026 |
| 4 | CoreDNS-1.14.1 Release | 0 | 12.99 | 15-01-2026 |
| 5 | Linux наконец-то не тормозит или пятничный релакс | 0 | 13.18 | 07-08-2026 |
| 6 | CoreDNS-1.14.2 Release | 0 | 8.67 | 06-03-2026 |
| 7 | Why is your Kubernetes cluster adding nodes when the dashboards look fine? | 0 | 17.07 | 08-03-2026 |
| 8 | Инверсия приоритетов в Kubernetes: Когда планировщик убивает бизнес, спасая «важные» поды | 0 | 7 | 13-07-2026 |
| 9 | Kubernetes teams trust automation to ship code but not to touch CPU, and AI is raising the stakes | 0 | 13.9 | 23-06-2026 |