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

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

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

В этой статье показано, как с помощью объектов ConfigMap выполнить базовую настройку CoreDNS в AKS. Этот подход отличается от настройки CoreDNS в других контекстах, например, с помощью CoreFile. Проверьте используемую версию CoreDNS, так как значения конфигурации могут быть разными в различных версиях.

Примечание

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

Перед началом

В этой статье предполагается, что у вас есть кластер AKS. Если вам нужен кластер AKS, см. краткое руководство AKS по использованию Azure CLI, Azure PowerShell или портала Azure.

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

Поддерживаемые и неподдерживаемые подключаемые модули

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

Перезапись DNS

Один из возможных сценариев — вам нужно "на лету" выполнять перезапись DNS-имен. В следующем примере замените <domain to be written> собственным полным доменным именем. Создайте файл с именем corednsms.yaml и вставьте в него следующий пример конфигурации:

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 {
    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-сервер должен иметь возможность разрешать новое доменное имя.

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

kubectl apply -f corednsms.yaml

Чтобы убедиться, что настройки применены правильно, выполните команду kubectl get configmaps и укажите нужный файл ConfigMap coredns-custom:

kubectl get configmaps --namespace=kube-system coredns-custom -o yaml

Теперь дайте CoreDNS команду для принудительной перезагрузки ConfigMap. Команда kubectl delete pod не приводит к невосстановимым изменениям или простоям. Она отвечает только за удаление объектов pod kube-dns, а Планировщик Kubernetes их восстанавливает. Заново созданные объекты pod будут содержать новое значение TTL.

kubectl delete pod --namespace kube-system -l k8s-app=kube-dns

Примечание

Приведенная выше команда не содержит ошибок. Хотя мы изменяем coredns, метка развертывания — kube-dns.

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

Если вам нужно указать сервер пересылки для сетевого трафика, создайте ConfigMap для настройки DNS. В следующем примере замените адрес и имя forward реальными значениями для вашей среды. Создайте файл с именем corednsms.yaml и вставьте в него следующий пример конфигурации:

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
    }

Как и в предыдущем примере, создайте ConfigMap с помощью команды kubectl apply configmap и укажите имя манифеста YAML: Затем дайте CoreDNS команду kubectl delete pod, чтобы планировщик Kubernetes воссоздал pod. Это инициирует принудительную перезагрузку ConfigMap.

kubectl apply -f corednsms.yaml
kubectl delete pod --namespace kube-system --selector k8s-app=kube-dns

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

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

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

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
    }

Как и в предыдущем примере, создайте ConfigMap с помощью команды kubectl apply configmap и укажите имя манифеста YAML: Затем дайте CoreDNS команду kubectl delete pod, чтобы планировщик Kubernetes воссоздал pod. Это инициирует принудительную перезагрузку ConfigMap.

kubectl apply -f corednsms.yaml
kubectl delete pod --namespace kube-system --selector k8s-app=kube-dns

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

Кроме того, CoreDNS позволяет настроить домены-заглушки. В следующем примере замените значения личного домена и IP-адреса реальными значениями для вашей среды. Создайте файл с именем corednsms.yaml и вставьте в него следующий пример конфигурации:

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
    }

Как и в предыдущем примере, создайте ConfigMap с помощью команды kubectl apply configmap и укажите имя манифеста YAML: Затем дайте CoreDNS команду kubectl delete pod, чтобы планировщик Kubernetes воссоздал pod. Это инициирует принудительную перезагрузку ConfigMap.

kubectl apply -f corednsms.yaml
kubectl delete pod --namespace kube-system --selector k8s-app=kube-dns

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

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

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
          }

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

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

Включите ведение журнала запросов DNS, применив следующую конфигурацию в ConfigMap coredns-custom:

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

После применения изменений конфигурации используйте команду kubectl logs для просмотра журнала отладки CoreDNS. Пример:

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

Дальнейшие действия

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

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