Перейти к содержимому

Настройка 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. Аутентифицируйтесь в 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
  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

Приложение будет использовать 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
  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.

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