Настройка 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. Подготовьте рабочее окружение
Заголовок раздела «1. Подготовьте рабочее окружение»Подключитесь к ВМ по SSH.
Аутентифицируйтесь в Artifact Registry, используя API-ключ:
bash helm registry login -u apikey -p <API-ключ> registry.mwsapis.ruЗначение параметра
-u apikeyпредустановлено, изменять его не нужно. Укажите только значение для API-ключа.Получите
kubeconfigдля кластера:bash mws mk8s get-kubeconfig <имя кластера>Убедитесь, что кластер доступен:
bash kubectl cluster-info
2. Установите NodeLocal DNSCache
Заголовок раздела «2. Установите NodeLocal DNSCache»Узнайте адрес сервиса
kube-dnsи сохраните его в переменную окружения:bash CLUSTERDNS=$(kubectl get svc kube-dns -n kube-system -o jsonpath='{.spec.clusterIP}') && echo $CLUSTERDNSКоманда выведет на экран сохраненный в переменную окружения IP-адрес.
Установите Helm-чарт
node-localdns, используя образ из Artifact Registry и переменную$CLUSTERDNS:bash helm 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.Ожидаемый результат:
bash NAME: node-localdnsLAST DEPLOYED: Tue Apr 7 10:13:25 2026NAMESPACE: kube-systemSTATUS: deployedREVISION: 1TEST SUITE: None
3. Разверните тестовое приложение
Заголовок раздела «3. Разверните тестовое приложение»Приложение будет использовать NodeLocal DNSCache, если в его манифесте:
- указаны настройки для параметров
dnsPolicyиdnsConfig; - указан параметр
nameserverсо значением169.254.20.10.
В этом руководстве для проверки NodeLocal DNSCache будет создано тестовое приложение busybox:1.28. Манифест создания приложения уже содержит нужные настройки.
Сохраните в файл
app.yamlманифест для тестового приложения:yaml apiVersion: apps/v1kind: Deploymentmetadata:name: myappnamespace: defaultspec:replicas: 1selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:dnsPolicy: NonednsConfig:nameservers:- 169.254.20.10searches:- default.svc.cluster.local- svc.cluster.local- cluster.localoptions:- name: ndotsvalue: "5"containers:- name: myappimage: registry.mwsapis.ru/mws-mk8s-images/customer/busybox:1.28command: ["sleep", "3600"]Установите приложение:
bash kubectl apply -f app.yamlУбедитесь, что под приложения запущен и работает:
bash kubectl get podsОжидаемый результат:
bash NAME READY STATUS RESTARTS AGEmyapp-64465c6f8f-vdd47 1/1 Running 0 7s
4. Проверьте работу NodeLocal DNSCache
Заголовок раздела «4. Проверьте работу NodeLocal DNSCache»Убедитесь, что приложение
myappиспользует NodeLocal DNSCache:bash kubectl exec -it deploy/myapp -n default -- cat /etc/resolv.confОжидаемый результат — используется link-local IP-адрес
169.254.20.10:bash search default.svc.cluster.local svc.cluster.local cluster.localnameserver 169.254.20.10options ndots:5Убедитесь, что NodeLocal DNSCache возвращает корректный адрес из диапазона сервисной подсети для
kubernetes.default.svc.cluster.local:bash kubectl exec -it deploy/myapp -n default -- nslookup kubernetes.default.svc.cluster.localОжидаемый результат:
bash Server: 169.254.20.10Address 1: 169.254.20.10Name: kubernetes.default.svc.cluster.localAddress 1: 10.222.64.1 kubernetes.default.svc.cluster.localЧтобы узнать диапазон адресов сервисной подсети кластера и сравнить его с выводом
nslookup, выполните командуmws mk8s cluster get <имя кластера> | grep servicesCidr.
Удалите платные ресурсы
Заголовок раздела «Удалите платные ресурсы»Ресурсы, созданные в руководстве, тарифицируются. Если вы больше не планируете использовать их: