Настройка NodeLocal DNSCache
NodeLocal DNSCache — компонент Kubernetes, который запускает локальный кеш DNS на каждом узле кластера. Использование NodeLocal DNSCache улучшает производительность кластера и повышает надежность разрешения доменных имен.
После установки компонента на каждом узле кластера запускается DaemonSet node-localdns. Он принимает запросы на разрешение доменных имен на link-local IP-адресе 169.254.20.10.
Руководство актуально для кластеров Managed Kubernetes c компонентом kube-proxy, работающим в стандартном для версии Kubernetes 1.34 режиме IPVS. В этом режиме нет автоматического перенаправления DNS-запросов в локальный кеш. NodeLocal DNSCache будут использовать только те поды, для которых в блоке dnsPolicy явно указана настройка nameserver: 169.254.20.10. Глобальная активация NodeLocal DNSCache через настройку kubelet (--cluster-dns=169.254.20.10) в рамках этого руководства не выполняется, поскольку такая настройка требует изменения конфигурации и перезапуска kubelet на каждом узле кластера.
Чтобы развернуть и использовать NodeLocal DNSCache:
- Установите NodeLocal DNSCache с помощью Helm-чарта, размещенного в сервисе Artifact Registry.
- Разверните тестовое приложение, с помощью которого вы сможете проверить работу NodeLocal DNSCache.
Перед началом работы
- Создайте сервисный аккаунт с именем
sa-pullerи рольюregistry.puller. Сервисный аккаунт нужен для работы группы узлов Managed Kubernetes и для установки Helm-чарта. - Для сервисного аккаунта создайте API-ключ и сохраните его в отдельном файле.
- Создайте кластер Managed Kubernetes и группу узлов для него. При создании группы используйте сервисный аккаунт
sa-puller. - Создайте виртуальную машину в той же сети, где развернут кластер Managed Kubernetes. Все последующие шаги руководства выполняйте на виртуальной машине.
1. Подготовьте рабочее окружение
Подключитесь к ВМ по SSH.
Аутентифицируйтесь в Artifact Registry, используя API-ключ:
bashhelm registry login -u apikey -p <API-ключ> registry.mwsapis.ruЗначение параметра
-u apikeyпредустановлено, изменять его не нужно. Укажите только значение для API-ключа.Получите
kubeconfigдля кластера:bashmws mk8s get-kubeconfig <имя кластера>Убедитесь, что кластер доступен:
bashkubectl cluster-info
2. Установите NodeLocal DNSCache
Узнайте адрес сервиса
kube-dnsи сохраните его в переменную окружения:bashCLUSTERDNS=$(kubectl get svc kube-dns -n kube-system -o jsonpath='{.spec.clusterIP}') && echo $CLUSTERDNSКоманда выведет на экран сохраненный в переменную окружения IP-адрес.
Установите Helm-чарт
node-localdns, используя образ из Artifact Registry и переменную$CLUSTERDNS:bashhelm upgrade --install node-localdns oci://registry.mwsapis.ru/mws-mk8s-images/customer/charts/node-local-dns \ --version 2.4.0 \ --namespace kube-system \ --set config.clusterDns=$CLUSTERDNSНе изменяйте значение параметра
namespace. Для корректной работы NodeLocal DNSCache должен быть установлен в пространство именkube-system.Ожидаемый результат:
bashNAME: node-localdns LAST DEPLOYED: Tue Apr 7 10:13:25 2026 NAMESPACE: kube-system STATUS: deployed REVISION: 1 TEST SUITE: None
3. Разверните тестовое приложение
Приложение будет использовать NodeLocal DNSCache, если в его манифесте:
- указаны настройки для параметров
dnsPolicyиdnsConfig; - указан параметр
nameserverсо значением169.254.20.10.
В этом руководстве для проверки NodeLocal DNSCache будет создано тестовое приложение busybox:1.28. Манифест создания приложения уже содержит нужные настройки.
Сохраните в файл
app.yamlманифест для тестового приложения:yamlapiVersion: apps/v1 kind: Deployment metadata: name: myapp namespace: default spec: replicas: 1 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: dnsPolicy: None dnsConfig: nameservers: - 169.254.20.10 searches: - default.svc.cluster.local - svc.cluster.local - cluster.local options: - name: ndots value: "5" containers: - name: myapp image: registry.mwsapis.ru/mws-mk8s-images/customer/busybox:1.28 command: ["sleep", "3600"]Установите приложение:
bashkubectl apply -f app.yamlУбедитесь, что под приложения запущен и работает:
bashkubectl get podsОжидаемый результат:
bashNAME READY STATUS RESTARTS AGE myapp-64465c6f8f-vdd47 1/1 Running 0 7s
4. Проверьте работу NodeLocal DNSCache
Убедитесь, что приложение
myappиспользует NodeLocal DNSCache:bashkubectl exec -it deploy/myapp -n default -- cat /etc/resolv.confОжидаемый результат — используется link-local IP-адрес
169.254.20.10:bashsearch default.svc.cluster.local svc.cluster.local cluster.local nameserver 169.254.20.10 options ndots:5Убедитесь, что NodeLocal DNSCache возвращает корректный адрес из диапазона сервисной подсети для
kubernetes.default.svc.cluster.local:bashkubectl exec -it deploy/myapp -n default -- nslookup kubernetes.default.svc.cluster.localОжидаемый результат:
bashServer: 169.254.20.10 Address 1: 169.254.20.10 Name: kubernetes.default.svc.cluster.local Address 1: 10.222.64.1 kubernetes.default.svc.cluster.localЧтобы узнать диапазон адресов сервисной подсети кластера и сравнить его с выводом
nslookup, выполните командуmws mk8s cluster get <имя кластера> | grep servicesCidr.
Удалите платные ресурсы
Ресурсы, созданные в руководстве, тарифицируются. Если вы больше не планируете использовать их: