Вступление
Система доменных имен (DNS) - это система для связи различных типов информации, таких как IP-адреса, с легко запоминающимися именами. По умолчанию большинство кластеров Kubernetes автоматически настраивают внутреннюю службу DNS, чтобы обеспечить легкий механизм для обнаружения службы. Встроенное обнаружение служб облегчает приложениям поиск и связь друг с другом в кластерах Kubernetes, даже когда модули и службы создаются, удаляются и перемещаются между узлами.
Детали реализации службы Kubernetes DNS изменились в последних версиях Kubernetes. В этой статье мы рассмотрим обе версии службы Kubernetes DNS какkube-dns, так иCoreDNS. Мы рассмотрим, как они работают, и записи DNS, которые генерирует Kubernetes.
Чтобы получить более полное представление о DNS, прежде чем начать, прочтитеAn Introduction to DNS Terminology, Components, and Concepts. По любым темам Kubernetes, которые могут быть вам незнакомы, вы можете прочитатьAn Introduction to Kubernetes.
Что предоставляет DNS-сервис Kubernetes?
До версии Kubernetes 1.11 служба Kubernetes DNS была основана наkube-dns. Версия 1.11 представилаCoreDNS для решения некоторых проблем безопасности и стабильности с kube-dns.
Независимо от программного обеспечения, обрабатывающего фактические записи DNS, обе реализации работают одинаково:
-
Создается служба с именем
kube-dns
и один или несколько модулей. -
Сервис
kube-dns
прослушивает событияservice иendpoint от Kubernetes API и обновляет свои записи DNS по мере необходимости. Эти события запускаются при создании, обновлении или удалении служб Kubernetes и связанных с ними модулей. -
kubelet устанавливает параметр
/etc/resolv.conf
nameserver
для каждого нового модуля на IP-адрес кластера службыkube-dns
с соответствующими параметрамиsearch
, позволяющими использовать более короткие имена хостов:resolv.conf
nameserver 10.32.0.10 search namespace.svc.cluster.local svc.cluster.local cluster.local options ndots:5
-
Приложения, работающие в контейнерах, могут затем преобразовывать имена хостов, такие как
example-service.namespace
, в правильные IP-адреса кластера.
Пример записей Kubernetes DNS
Полная запись DNSA
сервиса Kubernetes будет выглядеть, как в следующем примере:
service.namespace.svc.cluster.local
Модуль будет иметь запись в этом формате, отражающую фактический IP-адрес модуля:
10.32.0.125.namespace.pod.cluster.local
Кроме того, для именованных портов службы Kubernetes создаются записиSRV
:
_port-name._protocol.service.namespace.svc.cluster.local
Результатом всего этого является встроенный механизм обнаружения служб на основе DNS, в котором ваше приложение или микросервис могут назначать простое и непротиворечивое имя хоста для доступа к другим службам или модулям в кластере.
Поиск доменов и разрешение коротких имен хостов
Из-за суффиксов поискового домена, перечисленных в файлеresolv.conf
, вам часто не нужно использовать полное имя хоста для связи с другой службой. Если вы обращаетесь к службе в том же пространстве имен, вы можете использовать только имя службы, чтобы связаться с ней:
other-service
Если служба находится в другом пространстве имен, добавьте его в запрос:
other-service.other-namespace
Если вы ориентируетесь на модуль, вам нужно будет использовать по крайней мере следующее:
pod-ip.other-namespace.pod
Как мы видели в файлеresolv.conf
по умолчанию, только суффиксы.svc
заполняются автоматически, поэтому убедитесь, что вы указали все до.pod
.
Теперь, когда мы знаем о практическом использовании службы DNS Kubernetes, давайте рассмотрим некоторые детали двух разных реализаций.
Подробности внедрения DNS в Kubernetes
Как отмечалось в предыдущем разделе, Kubernetes версии 1.11 представил новое программное обеспечение для обработки службыkube-dns
. Мотивация к изменению заключалась в повышении производительности и безопасности сервиса. Давайте сначала посмотрим на исходную реализациюkube-dns
.
Кубэ-DNS
Службаkube-dns
до Kubernetes 1.11 состояла из трех контейнеров, работающих в модулеkube-dns
в пространстве именkube-system
. Три контейнера:
-
kube-dns: контейнер, который запускаетSkyDNS, который выполняет разрешение DNS-запросов
-
dnsmasq: - популярный облегченный преобразователь DNS и кэш, который кэширует ответы от SkyDNS.
-
sidecar: - вспомогательный контейнер, который обрабатывает отчеты о метриках и отвечает на проверки работоспособности службы.
Уязвимости безопасности в Dnsmasq и проблемы с масштабированием производительности SkyDNS привели к созданию системы замены CoreDNS.
CoreDNS
Начиная с Kubernetes 1.11, новый DNS-сервис Kubernetes,CoreDNS стал общедоступным. Это означает, что он готов к производственному использованию и будет службой DNS кластера по умолчанию для многих инструментов установки и управляемых провайдеров Kubernetes.
CoreDNS - это отдельный процесс, написанный на Go, который охватывает все функции предыдущей системы. Один контейнер разрешает и кэширует DNS-запросы, отвечает на проверки работоспособности и предоставляет метрики.
В дополнение к решению проблем, связанных с производительностью и безопасностью, CoreDNS исправляет некоторые другие незначительные ошибки и добавляет некоторые новые функции:
-
Некоторые проблемы с несовместимостью между использованием stubDomains и внешними сервисами были исправлены
-
CoreDNS может улучшить циклическое распределение нагрузки на основе DNS путем рандомизации порядка, в котором он возвращает определенные записи
-
Функция под названием
autopath
может улучшить время отклика DNS при разрешении внешних имен хостов, более разумно перебирая каждый из суффиксов домена поиска, перечисленных вresolv.conf
-
С kube-dns
10.32.0.125.namespace.pod.cluster.local
всегда будет преобразовываться в10.32.0.125
, даже если пода на самом деле не существует. CoreDNS имеет режим «проверено pods», который успешно разрешается, только если существует pod с правильным IP и в правильном пространстве имен.
Для получения дополнительной информации о CoreDNS и его отличиях от kube-dns вы можете прочитатьthe Kubernetes CoreDNS GA announcement.
Дополнительные параметры конфигурации
Операторы Kubernetes часто хотят настроить, как их поды и контейнеры разрешают определенные пользовательские домены, или им нужно настроить вышестоящие серверы имен или суффиксы доменов поиска, настроенные вresolv.conf
. Вы можете сделать это с помощью параметраdnsConfig
в спецификации вашего модуля:
example_pod.yaml
apiVersion: v1
kind: Pod
metadata:
namespace: example
name: custom-dns
spec:
containers:
- name: example
image: nginx
dnsPolicy: "None"
dnsConfig:
nameservers:
- 203.0.113.44
searches:
- custom.dns.local
Обновление этой конфигурации перезапишетresolv.conf
модуля, чтобы изменения вступили в силу. Конфигурация напрямую соответствует стандартным параметрамresolv.conf
, поэтому приведенная выше конфигурация создаст файл со строкамиnameserver 203.0.113.44
иsearch custom.dns.local
.
Заключение
В этой статье мы рассмотрели основы того, что DNS-сервис Kubernetes предоставляет разработчикам, показали несколько примеров DNS-записей для сервисов и модулей, обсудили, как система реализована в различных версиях Kubernetes, и выделили некоторые дополнительные параметры конфигурации, доступные для настройки ваших модулей. разрешить DNS-запросы.
Дополнительную информацию о службе Kubernetes DNS см. Вthe official Kubernetes DNS for Services and Pods documentation.