Поделиться через


Настройка CoreDNS с использованием Службы Azure Kubernetes

Служба Azure Kubernetes (AKS) использует проект CoreDNS для управления кластерами DNS любых версий не ниже 1.12.x и для их разрешения. Дополнительные сведения о настройке CoreDNS и Kubernetes см. в официальной вышестоящей документации.

AKS — это управляемая служба, поэтому вы не можете изменить основную конфигурацию для CoreDNS (CoreFile). Вместо этого переопределите параметры по умолчанию с помощью объекта ConfigMap, который предоставляет служба Kubernetes. Чтобы просмотреть стандартные объекты ConfigMap AKS для CoreDNS, используйте команду kubectl get configmaps --namespace=kube-system coredns -o yaml.

В этой статье показано, как использовать ConfigMaps для основных параметров настройки CoreDNS в AKS. Этот подход отличается от настройки CoreDNS в других контекстах, таких как CoreFile.

Примечание.

Ранее kube-dns использовался для управления и разрешения DNS кластера, но теперь он не рекомендуется. kube-dns предоставляет варианты настройки с помощью сопоставления конфигурации Kubernetes. CoreDNS не имеет обратной совместимости с kube-dns. Все настройки, которые вы использовали ранее, должны быть обновлены для CoreDNS.

Подготовка к работе

  • В этой статье предполагается, что у вас есть кластер AKS. Если вам нужен кластер AKS, можно создать его с помощью Azure CLI, Azure PowerShell или портал Azure.
  • Проверьте версию CoreDNS, которую вы используете. Значения конфигурации могут изменяться между версиями.
  • При создании конфигураций, таких как приведенные ниже примеры, имена в разделе данных должны заканчиваться сервером или переопределением. Это соглашение об именовании kubectl get configmaps --namespace=kube-system coredns -o yaml определяется в конфигурации ConfigMap по умолчанию AKS CoreDNS, которое можно просмотреть с помощью команды.

Поддержка подключаемого модуля

Поддерживаются все встроенные подключаемые модули CoreDNS. Не поддерживаются надстройки и подключаемые модули сторонних производителей.

Перезапись DNS

Вы можете настроить CoreDNS с AKS для выполнения перезаписи dns-имени во время полета.

  1. Создайте файл с именем corednsms.yaml и вставьте следующую конфигурацию. Обязательно замените <domain to be rewritten> собственное полное доменное имя.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: |
        <domain to be rewritten>.com:53 {
        log
        errors
        rewrite stop {
          name regex (.*)\.<domain to be rewritten>\.com {1}.default.svc.cluster.local
          answer name (.*)\.default\.svc\.cluster\.local {1}.<domain to be rewritten>.com
        }
        forward . /etc/resolv.conf # you can redirect this to a specific DNS server such as 10.0.0.10, but that server must be able to resolve the rewritten domain name
        }
    

    Внимание

    Если вы используете перенаправление на DNS-сервер, например на IP-адрес службы CoreDNS, этот DNS-сервер должен иметь возможность разрешать новое доменное имя.

  2. Создайте ConfigMap с помощью kubectl apply configmap команды и укажите имя манифеста YAML.

    kubectl apply -f corednsms.yaml
    
  3. Убедитесь, что настройки применены с помощью kubectl get configmaps идентификатора coredns-custom ConfigMap.

    kubectl get configmaps --namespace=kube-system coredns-custom -o yaml
    
  4. Чтобы перезагрузить ConfigMap и включить планировщик Kubernetes для перезапуска CoreDNS без простоя, выполните последовательный перезапуск с помощью kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Пользовательский сервер пересылки

Если вам нужно указать сервер пересылки для сетевого трафика, создайте ConfigMap для настройки DNS.

  1. Создайте файл с именем corednsms.yaml и вставьте следующую конфигурацию. Обязательно замените forward имя и адрес значениями для собственной среды.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: | # you may select any name here, but it must end with the .server file extension
        <domain to be rewritten>.com:53 {
            forward foo.com 1.1.1.1
        }
    
  2. Создайте ConfigMap с помощью kubectl apply configmap команды и укажите имя манифеста YAML.

    kubectl apply -f corednsms.yaml
    
  3. Чтобы перезагрузить ConfigMap и включить планировщик Kubernetes для перезапуска CoreDNS без простоя, выполните последовательный перезапуск с помощью kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Использование личных доменов

Возможно, вы хотите использовать личные домены и разрешать их только внутри сети. Например, вы можете использовать личный домен puglife.local, который не может быть допустимым доменом верхнего уровня. Без ConfigMap для этого личного домена кластер AKS не сможет разрешить такой адрес.

  1. Создайте файл с именем corednsms.yaml и вставьте следующую конфигурацию. Обязательно обновите личный домен и IP-адрес со значениями для собственной среды.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      puglife.server: | # you may select any name here, but it must end with the .server file extension
        puglife.local:53 {
            errors
            cache 30
            forward . 192.11.0.1  # this is my test/dev DNS server
        }
    
  2. Создайте ConfigMap с помощью kubectl apply configmap команды и укажите имя манифеста YAML.

    kubectl apply -f corednsms.yaml
    
  3. Чтобы перезагрузить ConfigMap и включить планировщик Kubernetes для перезапуска CoreDNS без простоя, выполните последовательный перезапуск с помощью kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns 
    

Домены-заглушки

Кроме того, CoreDNS позволяет настроить домены-заглушки.

  1. Создайте файл с именем corednsms.yaml и вставьте следующую конфигурацию. Обязательно обновите пользовательские домены и IP-адреса со значениями для собственной среды.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: | # you may select any name here, but it must end with the .server file extension
        abc.com:53 {
         errors
         cache 30
         forward . 1.2.3.4
        }
        my.cluster.local:53 {
            errors
            cache 30
            forward . 2.3.4.5
        }
    
    
  2. Создайте ConfigMap с помощью kubectl apply configmap команды и укажите имя манифеста YAML.

    kubectl apply -f corednsms.yaml
    
  3. Чтобы перезагрузить ConfigMap и включить планировщик Kubernetes для перезапуска CoreDNS без простоя, выполните последовательный перезапуск с помощью kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Подключаемый модуль узлов

Поддерживаются все встроенные подключаемые модули, поэтому подключаемый модуль CoreDNS также доступен для настройки /etc/hosts.

  1. Создайте файл с именем corednsms.yaml и вставьте следующую конфигурацию. Обязательно обновите IP-адреса и имена узлов со значениями для собственной среды.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom # this is the name of the configmap you can overwrite with your changes
      namespace: kube-system
    data:
        test.override: | # you may select any name here, but it must end with the .override file extension
              hosts { 
                  10.0.0.1 example1.org
                  10.0.0.2 example2.org
                  10.0.0.3 example3.org
                  fallthrough
              }
    
  2. Создайте ConfigMap с помощью kubectl apply configmap команды и укажите имя манифеста YAML.

    kubectl apply -f corednsms.yaml
    
  3. Чтобы перезагрузить ConfigMap и включить планировщик Kubernetes для перезапуска CoreDNS без простоя, выполните последовательный перезапуск с помощью kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Недопустимые завершения домена поиска для internal.cloudapp.net и reddog.microsoft.com

Azure DNS настраивает домен <vnetId>.<region>.internal.cloudapp.net поиска по умолчанию в виртуальных сетях с помощью Azure DNS и нефункциональную заглушку reddog.microsoft.com в виртуальных сетях с помощью пользовательских DNS-серверов (дополнительные сведения см . в документации по разрешениям имен для ресурсов). Kubernetes настраивает параметры DNS pod для ndots: 5 правильной поддержки разрешения имен узлов службы кластера. Эти две конфигурации объединяются в результате недопустимых запросов завершения домена поиска, которые никогда не отправляются на вышестоящий сервер имен во время системных процессов через список поиска домена. Эти недопустимые запросы вызывают задержки разрешения имен и могут размещать дополнительную нагрузку на вышестоящих DNS-серверах.

Начиная с выпуска AKS версии 20241025 AKS, AKS настраивает CoreDNS для реагирования на NXDOMAIN в следующих двух случаях, чтобы предотвратить перенаправление этих недопустимых запросов завершения домена поиска в вышестоящий DNS:

  • Любой запрос к корневому домену или поддомену reddog.microsoft.com.
  • Любой запрос на поддомен internal.cloudapp.net , имеющий семь или более меток в доменном имени.
    • Эта конфигурация позволяет разрешить разрешение виртуальных машин по имени узла по-прежнему успешно. Например, CoreDNS отправляет aks12345.myvnetid.myregion.internal.cloudapp.net (6 меток) в Azure DNS, но отклоняет mcr.microsoft.com.myvnetid.myregion.internal.cloudapp.net (8 меток)

Этот блок реализуется в блоке сервера по умолчанию в Corefile для кластера. При необходимости эту конфигурацию отклонения можно отключить, создав настраиваемые блоки сервера для соответствующего домена с включенным подключаемым модулем пересылки:

  1. Создайте файл с именем corednsms.yaml и вставьте следующую конфигурацию. Обязательно обновите IP-адреса и имена узлов со значениями для собственной среды.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom # this is the name of the configmap you can overwrite with your changes
      namespace: kube-system
    data:
        override-block.server:
           internal.cloudapp.net:53 {
               errors
               cache 30
               forward . /etc/resolv.conf
           }
           reddog.microsoft.com:53 {
               errors
               cache 30
               forward . /etc/resolv.conf
           }
    
  2. Создайте ConfigMap с помощью kubectl apply configmap команды и укажите имя манифеста YAML.

    kubectl apply -f corednsms.yaml
    
  3. Чтобы перезагрузить ConfigMap и включить планировщик Kubernetes для перезапуска CoreDNS без простоя, выполните последовательный перезапуск с помощью kubectl rollout restart.

    kubectl -n kube-system rollout restart deployment coredns
    

Устранение неполадок

Общие действия по устранению неполадок CoreDNS, например проверка конечных точек или разрешения, см. в разделе "Отладка разрешения DNS".

Настройка масштабирования pod CoreDNS

Внезапные всплески трафика DNS в кластерах AKS являются общим явлением из-за эластичности, которую AKS обеспечивает для рабочих нагрузок. Эти пики могут привести к увеличению потребления памяти модулями pod CoreDNS. В некоторых случаях это увеличение потребления памяти может привести к Out of memory проблемам. Чтобы устранить эту проблему, кластеры AKS автоматически масштабируют модули pod CoreDNS для уменьшения использования памяти для каждого модуля pod. Параметры по умолчанию для этой логики автоматического масштабирования хранятся в coredns-autoscaler ConfigMap. Однако вы можете наблюдать, что автоматическое масштабирование модулей Pod CoreDNS по умолчанию недостаточно агрессивно, чтобы предотвратить Out of memory проблемы с модулями pod CoreDNS. В этом случае можно напрямую coredns-autoscaler изменить ConfigMap. Обратите внимание, что просто увеличение числа модулей pod CoreDNS без устранения первопричин проблемы Out of memory может предоставить только временное исправление. Если в узлах, где выполняются модули pod CoreDNS, недостаточно памяти, увеличение числа модулей pod CoreDNS не поможет. Возможно, потребуется изучить дополнительные и реализовать соответствующие решения, такие как оптимизация использования ресурсов, настройка запросов ресурсов и ограничений, а также добавление дополнительной памяти на узлы.

CoreDNS использует горизонтальное автомасштабирование кластера для автоматического масштабирования pod. coredns-autoscaler ConfigMap можно изменить, чтобы настроить логику масштабирования для количества модулей pod CoreDNS. В coredns-autoscaler настоящее время ConfigMap поддерживает два разных значения ключа ConfigMap: linear и ladder которые соответствуют двум поддерживаемым режимам управления. Контроллер linear выдает ряд реплик в диапазоне [min,max], эквивалентном max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) ). Контроллер ladder вычисляет количество реплик путем консультаций с двумя разными функциями шага, одним для масштабирования ядра и другим для масштабирования узлов, что дает максимальное количество двух значений реплики. Дополнительные сведения о режимах управления и формате ConfigMap см. в вышестоящей документации.

Внимание

Рекомендуется как минимум 2 реплики pod CoreDNS на кластер. Настройка не менее 1 реплики pod CoreDNS может привести к сбоям во время операций, требующих очистки узлов, таких как операции обновления кластера.

Чтобы получить coredns-autoscaler ConfigMap, можно выполнить kubectl get configmap coredns-autoscaler -n kube-system -o yaml команду, которая вернет следующее:

apiVersion: v1
data:
  ladder: '{"coresToReplicas":[[1,2],[512,3],[1024,4],[2048,5]],"nodesToReplicas":[[1,2],[8,3],[16,4],[32,5]]}'
kind: ConfigMap
metadata:
  name: coredns-autoscaler
  namespace: kube-system
  resourceVersion: "..."
  creationTimestamp: "..."

Включение ведения журнала запросов DNS

  1. Добавьте следующую конфигурацию в configMap coredns:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      log.override: | # you may select any name here, but it must end with the .override file extension
            log
    
  2. Примените изменения конфигурации и принудительно настройте CoreDNS для перезагрузки ConfigMap с помощью следующих команд:

    # Apply configuration changes
    kubectl apply -f corednsms.yaml
    
    # Force CoreDNS to reload the ConfigMap
    kubectl -n kube-system rollout restart deployment coredns
    
  3. Просмотрите ведение журнала отладки CoreDNS с помощью kubectl logs команды.

    kubectl logs --namespace kube-system -l k8s-app=kube-dns
    

Следующие шаги

В этой статье представлены несколько примеров сценариев для настройки CoreDNS. Сведения о проекте CoreDNS см. на странице вышестоящего проекта CoreDNS.

Дополнительные сведения см. в статье Основные понятия сети для приложений в AKS.