Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Managed Service for Kubernetes
  • Сопоставление с другими сервисами Yandex Cloud
  • Начало работы
    • Все инструкции
    • Подключение к узлу по SSH
    • Подключение к узлу через OS Login
    • Обновление Kubernetes
    • Настройка автомасштабирования
      • Обеспечение доступа к приложению, запущенному в кластере Kubernetes
      • Настройка контроллера сетевых политик Calico
      • Настройка контроллера сетевых политик Cilium
      • Настройка NodeLocal DNS для контроллера сетевых политик Cilium
      • Создание сетевого балансировщика с помощью Ingress-контроллера NGINX
    • Подключение внешних узлов к кластеру
  • Управление доступом
  • Правила тарификации
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • История изменений
  • Обучающие курсы

В этой статье:

  • Перед началом работы
  • Подготовьте спецификации для NodeLocal DNS и Local Redirect Policy
  • Создайте тестовое окружение
  • Проверьте работу NodeLocal DNS
  • Удалите созданные ресурсы
  1. Пошаговые инструкции
  2. Сетевые сценарии
  3. Настройка NodeLocal DNS для контроллера сетевых политик Cilium

Настройка NodeLocal DNS для контроллера сетевых политик Cilium

Статья создана
Yandex Cloud
Улучшена
S M.
Обновлена 21 января 2025 г.
  • Перед началом работы
  • Подготовьте спецификации для NodeLocal DNS и Local Redirect Policy
  • Создайте тестовое окружение
  • Проверьте работу NodeLocal DNS
  • Удалите созданные ресурсы

Из этой статьи вы узнаете, как настроить локальный DNS для контроллера сетевых политик Cilium с помощью Local Redirect Policy.

Чтобы настроить локальный DNS в кластере Managed Service for Kubernetes:

  1. Подготовьте спецификации для NodeLocal DNS и Local Redirect Policy.
  2. Создайте тестовое окружение.
  3. Проверьте работу NodeLocal DNS.

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

  1. Создайте сервисный аккаунт и назначьте ему роли k8s.tunnelClusters.agent и vpc.publicAdmin.

  2. Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.

    Важно

    От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.

  3. Создайте кластер Managed Service for Kubernetes любой подходящей конфигурации.

    При создании укажите сервисный аккаунт и группы безопасности, подготовленные заранее. В блоке Сетевые настройки кластера выберите опцию Включить туннельный режим.

  4. Создайте группу узлов любой подходящей конфигурации. При создании укажите группы безопасности, подготовленные заранее.

  5. Установите kubectl и настройте его на работу с созданным кластером.

  6. Узнайте IP-адрес сервиса kube-dns:

    kubectl get svc kube-dns -n kube-system -o jsonpath={.spec.clusterIP}
    

Подготовьте спецификации для NodeLocal DNS и Local Redirect PolicyПодготовьте спецификации для NodeLocal DNS и Local Redirect Policy

  1. Создайте файл node-local-dns.yaml. В настройках DaemonSet node-local-dns укажите IP-адрес сервиса kube-dns:

    node-local-dns.yaml
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: node-local-dns
      namespace: kube-system
      labels:
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: kube-dns-upstream
      namespace: kube-system
      labels:
        k8s-app: kube-dns
        kubernetes.io/name: "KubeDNSUpstream"
    spec:
      ports:
      - name: dns
        port: 53
        protocol: UDP
        targetPort: 53
      - name: dns-tcp
        port: 53
        protocol: TCP
        targetPort: 53
      selector:
        k8s-app: kube-dns
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: node-local-dns
      namespace: kube-system
      labels:
    data:
      Corefile: |
        cluster.local:53 {
          errors
          cache {
            success 9984 30
            denial 9984 5
          }
          reload
          loop
          bind 0.0.0.0
          forward . __PILLAR__CLUSTER__DNS__ {
            prefer_udp
          }
          prometheus :9253
          health
        }
        in-addr.arpa:53 {
          errors
          cache 30
          reload
          loop
          bind 0.0.0.0
          forward . __PILLAR__CLUSTER__DNS__ {
            prefer_udp
          }
          prometheus :9253
        }
        ip6.arpa:53 {
          errors
          cache 30
          reload
          loop
          bind 0.0.0.0
          forward . __PILLAR__CLUSTER__DNS__ {
            prefer_udp
          }
          prometheus :9253
        }
        .:53 {
          errors
          cache 30
          reload
          loop
          bind 0.0.0.0
          forward . __PILLAR__UPSTREAM__SERVERS__ {
            prefer_udp
          }
          prometheus :9253
        }
    ---
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: node-local-dns
      namespace: kube-system
      labels:
        k8s-app: node-local-dns
    spec:
      updateStrategy:
        rollingUpdate:
          maxUnavailable: 10%
      selector:
        matchLabels:
          k8s-app: node-local-dns
      template:
        metadata:
          labels:
            k8s-app: node-local-dns
          annotations:
            prometheus.io/port: "9253"
            prometheus.io/scrape: "true"
        spec:
          priorityClassName: system-node-critical
          serviceAccountName: node-local-dns
          dnsPolicy: Default # Don't use cluster DNS.
          tolerations:
          - key: "CriticalAddonsOnly"
            operator: "Exists"
          - effect: "NoExecute"
            operator: "Exists"
          - effect: "NoSchedule"
            operator: "Exists"
          containers:
          - name: node-cache
            image: registry.k8s.io/dns/k8s-dns-node-cache:1.17.0
            resources:
              requests:
                cpu: 25m
                memory: 5Mi
            args: [ "-localip", "169.254.20.10,<IP-адрес_сервиса_kube-dns>", "-conf", "/etc/Corefile", "-upstreamsvc", "kube-dns-upstream", "-skipteardown=true", "-setupinterface=false", "-setupiptables=false" ]
            securityContext:
              privileged: true
            ports:
            - containerPort: 53
              name: dns
              protocol: UDP
            - containerPort: 53
              name: dns-tcp
              protocol: TCP
            - containerPort: 9253
              name: metrics
              protocol: TCP
            livenessProbe:
              httpGet:
                path: /health
                port: 8080
              initialDelaySeconds: 60
              timeoutSeconds: 5
            volumeMounts:
            - mountPath: /run/xtables.lock
              name: xtables-lock
              readOnly: false
            - name: config-volume
              mountPath: /etc/coredns
            - name: kube-dns-config
              mountPath: /etc/kube-dns
          volumes:
          - name: xtables-lock
            hostPath:
              path: /run/xtables.lock
              type: FileOrCreate
          - name: kube-dns-config
            configMap:
              name: kube-dns
              optional: true
          - name: config-volume
            configMap:
              name: node-local-dns
              items:
                - key: Corefile
                  path: Corefile.base
    

    Важно

    Приложение работает корректно только с пространством имен kube-system.

  2. Создайте файл node-local-dns-lrp.yaml:

    node-local-dns-lrp.yaml
    ---
    apiVersion: "cilium.io/v2"
    kind: CiliumLocalRedirectPolicy
    metadata:
      name: "nodelocaldns"
      namespace: kube-system
    spec:
      redirectFrontend:
        serviceMatcher:
          serviceName: kube-dns
          namespace: kube-system
      redirectBackend:
        localEndpointSelector:
          matchLabels:
            k8s-app: node-local-dns
        toPorts:
          - port: "53"
            name: dns
            protocol: UDP
          - port: "53"
            name: dns-tcp
            protocol: TCP
    
  3. Создайте ресурсы для NodeLocal DNS:

    kubectl apply -f node-local-dns.yaml
    

    Результат:

    serviceaccount/node-local-dns created
    service/kube-dns-upstream created
    configmap/node-local-dns created
    daemonset.apps/node-local-dns created
    
  4. Создайте ресурсы для Local Redirect Policy:

    kubectl apply -f node-local-dns-lrp.yaml
    

    Результат:

    ciliumlocalredirectpolicy.cilium.io/NodeLocal DNS created
    

Создайте тестовое окружениеСоздайте тестовое окружение

Для проверки работы локального DNS в кластере Managed Service for Kubernetes будет запущен под nettool, содержащий в себе пакет сетевых утилит dnsutils.

  1. Запустите под nettool:

    kubectl run nettool --image cr.yandex/yc/demo/network-multitool -- sleep infinity
    
  2. Убедитесь, что под перешел в состояние Running:

    kubectl get pods
    
  3. Выясните, на каком узле кластера Managed Service for Kubernetes развернут под nettool:

    kubectl get pod nettool -o wide
    

    Имя узла указано в столбце NODE, например:

    NAME     READY  STATUS   RESTARTS  AGE  IP         NODE        NOMINATED NODE  READINESS GATES
    nettool  1/1    Running  0         23h  10.1.0.68  <имя_узла>  <none>          <none>
    
  4. Узнайте IP-адрес пода, на котором развернут NodeLocal DNS:

    kubectl get pod -o wide -n kube-system | grep 'node-local.*<имя_узла>'
    

    Результат:

    node-local-dns-gv68c  1/1  Running  0  26m  <IP-адрес_пода>  <имя_узла>  <none>  <none>
    

Проверьте работу NodeLocal DNSПроверьте работу NodeLocal DNS

Для проверки работы локального DNS с пода nettool будут выполнены несколько DNS-запросов. При этом будут изменяться метрики количества DNS-запросов на поде, обслуживающем NodeLocal DNS.

  1. Узнайте значение метрик для DNS-запросов до начала проверки:

    kubectl exec -ti nettool -- curl http://<IP-адрес_пода>:9253/metrics | grep coredns_dns_requests_total
    

    Результат:

    # HELP coredns_dns_requests_total Counter of DNS requests made per zone, protocol and family.
    # TYPE coredns_dns_requests_total counter
    coredns_dns_requests_total{family="1",proto="udp",server="dns://0.0.0.0:53",type="other",zone="."} 1
    coredns_dns_requests_total{family="1",proto="udp",server="dns://0.0.0.0:53",type="other",zone="cluster.local."} 1
    coredns_dns_requests_total{family="1",proto="udp",server="dns://0.0.0.0:53",type="other",zone="in-addr.arpa."} 1
    coredns_dns_requests_total{family="1",proto="udp",server="dns://0.0.0.0:53",type="other",zone="ip6.arpa."} 1
    
  2. Выполните DNS-запросы:

    kubectl exec -ti nettool -- nslookup kubernetes && \
    kubectl exec -ti nettool -- nslookup kubernetes.default && \
    kubectl exec -ti nettool -- nslookup ya.ru
    

    Результат (IP-адреса могут отличаться):

    Name:   kubernetes.default.svc.cluster.local
    Address: 10.2.0.1
    
    Server:         10.2.0.2
    Address:        10.2.0.2#53
    
    Name:   kubernetes.default.svc.cluster.local
    Address: 10.2.0.1
    
    Server:         10.2.0.2
    Address:        10.2.0.2#53
    
    Non-authoritative answer:
    Name:   ya.ru
    Address: 87.250.250.242
    Name:   ya.ru
    Address: 2a02:6b8::2:242
    
  3. Убедитесь, что значения метрик увеличились:

    kubectl exec -ti nettool -- curl http://<IP-адрес_пода>:9253/metrics | grep coredns_dns_requests_total
    

    Результат:

    # HELP coredns_dns_requests_total Counter of DNS requests made per zone, protocol and family.
    # TYPE coredns_dns_requests_total counter
    coredns_dns_requests_total{family="1",proto="udp",server="dns://0.0.0.0:53",type="A",zone="."} 3
    coredns_dns_requests_total{family="1",proto="udp",server="dns://0.0.0.0:53",type="A",zone="cluster.local."} 6
    coredns_dns_requests_total{family="1",proto="udp",server="dns://0.0.0.0:53",type="AAAA",zone="."} 1
    coredns_dns_requests_total{family="1",proto="udp",server="dns://0.0.0.0:53",type="AAAA",zone="cluster.local."} 2
    ...
    

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

Удалите ресурсы, которые вы больше не будете использовать, чтобы за них не списывалась плата:

  1. Удалите кластер Managed Service for Kubernetes.
  2. Если для доступа к кластеру Managed Service for Kubernetes или узлам использовались статические публичные IP-адреса, освободите и удалите их.

Была ли статья полезна?

Предыдущая
Настройка контроллера сетевых политик Cilium
Следующая
Создание сетевого балансировщика с помощью Ingress-контроллера NGINX
Проект Яндекса
© 2025 ООО «Яндекс.Облако»