Skip to content

Настройка 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:

  1. Установите NodeLocal DNSCache с помощью Helm-чарта, размещенного в сервисе Artifact Registry.
  2. Разверните тестовое приложение, с помощью которого вы сможете проверить работу NodeLocal DNSCache.

Перед началом работы

  1. Создайте сервисный аккаунт с именем sa-puller и ролью registry.puller. Сервисный аккаунт нужен для работы группы узлов Managed Kubernetes и для установки Helm-чарта.
  2. Для сервисного аккаунта создайте API-ключ и сохраните его в отдельном файле.
  3. Создайте кластер Managed Kubernetes и группу узлов для него. При создании группы используйте сервисный аккаунт sa-puller.
  4. Создайте виртуальную машину в той же сети, где развернут кластер Managed Kubernetes. Все последующие шаги руководства выполняйте на виртуальной машине.

1. Подготовьте рабочее окружение

  1. Аутентифицируйтесь в Artifact Registry, используя API-ключ:

    bash
    helm registry login -u apikey -p <API-ключ> registry.mwsapis.ru

    Значение параметра -u apikey предустановлено, изменять его не нужно. Укажите только значение для API-ключа.

  2. Получите kubeconfig для кластера:

    bash
    mws mk8s get-kubeconfig <имя кластера>
  3. Убедитесь, что кластер доступен:

    bash
    kubectl cluster-info

2. Установите NodeLocal DNSCache

  1. Узнайте адрес сервиса kube-dns и сохраните его в переменную окружения:

    bash
    CLUSTERDNS=$(kubectl get svc kube-dns -n kube-system -o jsonpath='{.spec.clusterIP}') && echo $CLUSTERDNS

    Команда выведет на экран сохраненный в переменную окружения IP-адрес.

  2. Установите 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-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. Манифест создания приложения уже содержит нужные настройки.

  1. Сохраните в файл app.yaml манифест для тестового приложения:

    yaml
    apiVersion: 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"]
  2. Установите приложение:

    bash
    kubectl apply -f app.yaml
  3. Убедитесь, что под приложения запущен и работает:

    bash
    kubectl get pods

    Ожидаемый результат:

    bash
    NAME                     READY   STATUS    RESTARTS   AGE
    myapp-64465c6f8f-vdd47   1/1     Running   0          7s

4. Проверьте работу NodeLocal DNSCache

  1. Убедитесь, что приложение 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.local
    nameserver 169.254.20.10
    options ndots:5
  2. Убедитесь, что 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.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.

Удалите платные ресурсы

Ресурсы, созданные в руководстве, тарифицируются. Если вы больше не планируете использовать их: