Настройка 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-имени во время полета.
Создайте файл с именем
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-сервер должен иметь возможность разрешать новое доменное имя.
Создайте ConfigMap с помощью
kubectl apply configmap
команды и укажите имя манифеста YAML.kubectl apply -f corednsms.yaml
Убедитесь, что настройки применены с помощью
kubectl get configmaps
идентификатора coredns-custom ConfigMap.kubectl get configmaps --namespace=kube-system coredns-custom -o yaml
Чтобы перезагрузить ConfigMap и включить планировщик Kubernetes для перезапуска CoreDNS без простоя, выполните последовательный перезапуск с помощью
kubectl rollout restart
.kubectl -n kube-system rollout restart deployment coredns
Пользовательский сервер пересылки
Если вам нужно указать сервер пересылки для сетевого трафика, создайте ConfigMap для настройки DNS.
Создайте файл с именем
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 }
Создайте ConfigMap с помощью
kubectl apply configmap
команды и укажите имя манифеста YAML.kubectl apply -f corednsms.yaml
Чтобы перезагрузить ConfigMap и включить планировщик Kubernetes для перезапуска CoreDNS без простоя, выполните последовательный перезапуск с помощью
kubectl rollout restart
.kubectl -n kube-system rollout restart deployment coredns
Использование личных доменов
Возможно, вы хотите использовать личные домены и разрешать их только внутри сети. Например, вы можете использовать личный домен puglife.local, который не может быть допустимым доменом верхнего уровня. Без ConfigMap для этого личного домена кластер AKS не сможет разрешить такой адрес.
Создайте файл с именем
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 }
Создайте ConfigMap с помощью
kubectl apply configmap
команды и укажите имя манифеста YAML.kubectl apply -f corednsms.yaml
Чтобы перезагрузить ConfigMap и включить планировщик Kubernetes для перезапуска CoreDNS без простоя, выполните последовательный перезапуск с помощью
kubectl rollout restart
.kubectl -n kube-system rollout restart deployment coredns
Домены-заглушки
Кроме того, CoreDNS позволяет настроить домены-заглушки.
Создайте файл с именем
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 }
Создайте ConfigMap с помощью
kubectl apply configmap
команды и укажите имя манифеста YAML.kubectl apply -f corednsms.yaml
Чтобы перезагрузить ConfigMap и включить планировщик Kubernetes для перезапуска CoreDNS без простоя, выполните последовательный перезапуск с помощью
kubectl rollout restart
.kubectl -n kube-system rollout restart deployment coredns
Подключаемый модуль узлов
Поддерживаются все встроенные подключаемые модули, поэтому подключаемый модуль CoreDNS также доступен для настройки /etc/hosts.
Создайте файл с именем
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 }
Создайте ConfigMap с помощью
kubectl apply configmap
команды и укажите имя манифеста YAML.kubectl apply -f corednsms.yaml
Чтобы перезагрузить 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 меток)
- Эта конфигурация позволяет разрешить разрешение виртуальных машин по имени узла по-прежнему успешно. Например, CoreDNS отправляет
Этот блок реализуется в блоке сервера по умолчанию в Corefile для кластера. При необходимости эту конфигурацию отклонения можно отключить, создав настраиваемые блоки сервера для соответствующего домена с включенным подключаемым модулем пересылки:
Создайте файл с именем
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 }
Создайте ConfigMap с помощью
kubectl apply configmap
команды и укажите имя манифеста YAML.kubectl apply -f corednsms.yaml
Чтобы перезагрузить 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
Добавьте следующую конфигурацию в 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
Примените изменения конфигурации и принудительно настройте CoreDNS для перезагрузки ConfigMap с помощью следующих команд:
# Apply configuration changes kubectl apply -f corednsms.yaml # Force CoreDNS to reload the ConfigMap kubectl -n kube-system rollout restart deployment coredns
Просмотрите ведение журнала отладки CoreDNS с помощью
kubectl logs
команды.kubectl logs --namespace kube-system -l k8s-app=kube-dns
Следующие шаги
В этой статье представлены несколько примеров сценариев для настройки CoreDNS. Сведения о проекте CoreDNS см. на странице вышестоящего проекта CoreDNS.
Дополнительные сведения см. в статье Основные понятия сети для приложений в AKS.
Azure Kubernetes Service