Каждый кластер Kubernetes имеет встроенный DNS‑дополнительный модуль (Kube‑DNS или CoreDNS), который обеспечивает разрешение доменных имён для рабочих нагрузок в кластере. При обработке большого количества одновременных DNS‑запросов Kube‑DNS/CoreDNS может столкнуться с узким местом в производительности, то есть иногда может не выполнять DNS‑запросы. Рабочие нагрузки Kubernetes иногда генерируют лишние DNS‑запросы, что может перегрузить систему DNS в периоды высокой одновременной нагрузки запросов. Настройка конфигурации DNS для рабочих нагрузок снизит риск сбоев DNS‑запросов в некоторой степени.
Для получения дополнительной информации о DNS см. CoreDNS.
Элементы конфигурации DNS
Запустите cat /etc/resolv.conf команда на узле Linux или контейнере для просмотра файла конфигурации DNS‑резольвера. Ниже приведён пример конфигурации DNS‑резольвера контейнера в кластере Kubernetes:
nameserver 10.247.x.xsearch default.svc.cluster.local svc.cluster.local cluster.localoptions single-request-reopen timeout:2 ndots:5
Параметры конфигурации
- nameserver: список IP‑адресов name server, к которому резольвер будет выполнять запросы. Если этот параметр установлен в 10.247.x.x, резольвер будет запрашивать kube‑dns/CoreDNS. Если параметр установлен на другой IP‑адрес, резольвер будет обращаться к облачному или локальному DNS‑серверу.
- search: список поиска для разрешения имён хостов. Когда доменное имя не может быть разрешено, DNS‑запросы будут выполняться, комбинируя доменное имя с каждым доменом из списка поиска последовательно, пока не будет найдено совпадение или пока не будут проверены все домены в списке. Для кластеров CCE список поиска в настоящее время ограничен тремя доменами на контейнер. При разрешении несуществующего доменного имени будет инициировано восемь DNS‑запросов, поскольку каждое доменное имя (включая имена из списка поиска) будет запрашиваться дважды: один раз для IPv4 и один раз для IPv6.
- options: параметры, позволяющие изменять некоторые внутренние переменные резольвера. Распространённые параметры включают timeout и ndots.
Значение ndots:5 означает, что если у доменного имени меньше 5 точек (.), DNS‑запросы будут выполняться, комбинируя доменное имя с каждым доменом из списка поиска последовательно. Если после проверки всех доменов из списка поиска совпадение не найдено, доменное имя будет использовано для DNS‑запроса. Если у доменного имени 5 или более точек, оно будет первым использовано для DNS‑запроса. В случае, когда доменное имя не может быть разрешено, DNS‑запросы будут снова выполняться, комбинируя доменное имя с каждым доменом из списка поиска последовательно.
Например, доменное имя www.***.com имеет только две точки (меньше значения ndots), и поэтому последовательность DNS‑запросов следующая: www.***.com.default.svc.cluster.local, www.***.com.svc.cluster.local, www.***.com.cluster.local, и www.***.com. Это означает, что будет инициировано как минимум семь DNS‑запросов, прежде чем доменное имя будет разрешено в IP‑адрес. Очевидно, что при большом количестве ненужных DNS‑запросов будет осуществляться доступ к внешнему доменному имени. В конфигурации DNS рабочей нагрузки есть возможности для улучшения.
Для получения дополнительной информации о параметрах конфигурации в файле конфигурации резольвера, используемом в операционных системах Linux, посетите http://man7.org/linux/man-pages/man5/resolv.conf.5.html.
Настройка DNS для рабочей нагрузки через консоль
Kubernetes предоставляет параметры конфигурации, связанные с DNS, для приложений. Использование DNS‑конфигурации приложения может эффективно снизить количество лишних DNS‑запросов в определённых сценариях и повысить конкурентность сервисов. В следующей процедуре в качестве примера используется приложение Nginx, чтобы описать, как добавить DNS‑конфигурацию для рабочей нагрузки через консоль.
- Войдите в консоль CCE, откройте консоль кластера, выберите Рабочие нагрузки в навигационной панели и нажмите Создать рабочую нагрузку в правом верхнем углу.
- Настройте базовую информацию о рабочей нагрузке. Подробности см. Создание рабочей нагрузки.
- В Расширенные настройки области, нажмите DNS вкладку и задайте следующие параметры по требованию:
- Политика DNS: Политики DNS, предоставляемые в консоли, соответствуют dnsPolicy полю в YAML‑файле. Подробности см. Таблица 1.
- Дополнять значения по умолчанию: соответствует dnsPolicy=ClusterFirst. Контейнеры могут разрешать как внутрикластерные доменные имена, зарегистрированные Service, так и внешние доменные имена, доступные в публичных сетях.
- Заменить значения по умолчанию: соответствует dnsPolicy=None. Необходимо настроить IP Address и Search Domain. Контейнеры используют только пользовательские конфигурации IP address и Search Domain для разрешения доменных имён.
- Унаследовать значения по умолчанию: соответствует dnsPolicy=Default. Контейнеры используют конфигурацию разрешения доменных имён узла, на котором работает pod, и не могут разрешать внутрикластерные доменные имена.
- Опциональные объекты: Параметры options в поле dnsConfig. Каждый объект может иметь свойство name (обязательно) и свойство value (необязательно). После задания свойств нажмите подтвердить добавление.
- timeout: Интервал таймаута в секундах.
- ndots: Количество точек (.) , которое должно присутствовать в доменном имени. Если в доменном имени точек меньше, чем указано, операционная система будет выполнять поиск имени в поисковом домене. Если нет, имя является полностью квалифицированным доменным именем (FQDN) и будет использоваться в первую очередь как абсолютное имя.
- IP‑адрес DNS‑сервера: серверы имён в dnsConfig. Вы можете настроить сервер доменных имён для пользовательского доменного имени. Значение представляет собой один или группу IP‑адресов DNS.
- Поисковый домен: поиски в dnsConfig. Список DNS‑поисковых доменов для поиска имени хоста в pod. Это свойство необязательно. При указании предоставленный список будет объединён с именами поисковых доменов, генерируемыми выбранной политикой DNS в dnsPolicy. Дубликаты доменных имён удаляются.
- Псевдоним хоста: Добавьте сопоставление между доменными именами и IP‑адресами в локальный файл конфигурации /etc/hosts podа для упрощённого локального разрешения доменных имён. Подробнее см. Добавление записей в Pod /etc/hosts с HostAliases
- Политика DNS: Политики DNS, предоставляемые в консоли, соответствуют dnsPolicy полю в YAML‑файле. Подробности см. Таблица 1.
- Нажмите Создать нагрузку.
Настройка DNS с помощью YAML нагрузки
При создании нагрузки с использованием YAML‑файла вы можете настроить параметры DNS в YAML. Ниже приводится пример для приложения Nginx:
apiVersion: apps/v1kind: Deploymentmetadata:name: nginxnamespace: defaultspec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: container-1image: nginx:latestimagePullPolicy: IfNotPresentimagePullSecrets:- name: default-secretdnsPolicy: NonednsConfig:options:- name: ndotsvalue: '5'- name: timeoutvalue: '3'nameservers:- 10.2.3.4searches:- my.dns.search.suffix
- dnsPolicy
Поле dnsPolicy поле используется для настройки DNS‑политики для приложения. Значение по умолчанию — ClusterFirst. В следующей таблице перечислены dnsPolicy конфигурации.
Таблица 1 dnsPolicy Параметр
Описание
ClusterFirst (значение по умолчанию)
Пользовательская конфигурация DNS, добавленная к конфигурации DNS по умолчанию. По умолчанию приложение подключается к CoreDNS (CoreDNS кластера CCE по умолчанию подключается к DNS в облаке). Пользовательский dnsConfig будет добавлен к параметрам DNS по умолчанию. Контейнеры могут разрешать как внутренние в кластере доменные имена, зарегистрированные Service, так и внешние доменные имена, доступные в публичных сетях. Список поиска (поиск опция) и ndots: 5 присутствуют в файле конфигурации DNS. Поэтому при доступе к внешнему доменному имени и к длинному внутреннему доменному имени кластера (например, kubernetes.default.svc.cluster.local), список поиска обычно будет просматриваться первым, что приводит к минимум шести недействительным DNS‑запросам. Проблема недействительных DNS‑запросов исчезает только при коротком внутреннем доменном имени кластера (например, kubernetes) доступается.
ClusterFirstWithHostNet
По умолчанию, приложения, настроенные с хост‑сеть взаимосвязаны с конфигурацией DNS узла, на котором расположен pod. Конфигурация DNS указывается в DNS‑файле, который kubelet --resolv-conf параметр указывает на. В этом случае кластер CCE использует DNS в облаке. Если нагрузкам требуется использовать Kube-DNS/CoreDNS кластера, установите dnsPolicy в ClusterFirstWithHostNet и файл конфигурации DNS контейнера такой же, как у ClusterFirst, где по‑прежнему присутствуют недействительные DNS‑запросы.
...spec:containers:- image: nginx:latestimagePullPolicy: IfNotPresentname: container-1restartPolicy: AlwayshostNetwork: truednsPolicy: ClusterFirstWithHostNetПо умолчанию
Конфигурация DNS узла, где расположен pod, наследуется, а пользовательская конфигурация DNS добавляется к наследуемой конфигурации. Файл конфигурации DNS контейнера — это файл конфигурации DNS, указанный kubelet'ом --resolv-conf флаг указывает на. В этом случае для кластеров CCE используется облачный DNS. Оба поиск и опции поля остаются неуказанными. Эта конфигурация может разрешать только внешние доменные имена, зарегистрированные в интернете, и не может разрешать внутренние доменные имена кластера. В этой конфигурации отсутствует проблема недействительных DNS‑запросов.
Отсутствует
Конфигурация DNS по умолчанию заменяется пользовательской конфигурацией DNS, и используется только пользовательская конфигурация DNS. Если dnsPolicy установлен в Отсутствует, dnsConfig поле должно быть указано, так как все параметры DNS должны предоставляться с помощью dnsConfig поле.
NoteЕсли dnsPolicy поле не указано, значение по умолчанию — ClusterFirst вместо По умолчанию.
- dnsConfig
Поле dnsConfig поле используется для настройки параметров DNS для нагрузок. Настроенные параметры объединяются с файлом конфигурации DNS, генерируемым в соответствии с dnsPolicy. Если dnsPolicy установлен в Отсутствует, файл конфигурации DNS нагрузки задаётся dnsConfig поле. Если dnsPolicy не установлен в None, параметры DNS, настроенные в dnsConfig добавляются в файл конфигурации DNS, сгенерированный согласно dnsPolicy.
Таблица 2 dnsConfig Параметр
Описание
options
Необязательный список объектов, где каждый объект может иметь свойство name (обязательно) и свойство value (необязательно). Содержимое этого свойства будет объединено с options, сгенерированными из указанной политики DNS в dnsPolicy. Дубликаты удаляются.
nameservers
Список IP‑адресов, которые будут использоваться в качестве DNS‑серверов. Если у нагрузки dnsPolicy установлен в None, список должен содержать хотя бы один IP‑адрес, иначе это свойство является необязательным. Перечисленные серверы будут объединены с nameservers, сгенерированными из указанной политики DNS в dnsPolicy с удалением дублирующих адресов.
NOTE:Для nameserver в файле конфигурации DNS контейнера можно настроить максимум три DNS‑адреса.
- Если dnsPolicy установлен в ClusterFirst и кластер использует CoreDNS, вы можете добавить два пользовательских DNS‑адреса в дополнение к адресу CoreDNS. Избыточные DNS‑адреса недействительны.
- Если dnsPolicy установлен в ClusterFirst и кластер использует CoreDNS и NodeLocal DNSCache, вы можете добавить один пользовательский DNS‑адрес в дополнение к адресам CoreDNS и NodeLocal DNSCache. Избыточные DNS‑адреса недействительны.
searches
Список доменов поиска DNS для разрешения имен хостов в pod. Это свойство необязательно. При указании предоставленный список будет объединён с именами доменов поиска, сгенерированными из выбранной политики DNS в dnsPolicy. Дубликаты доменных имен удаляются. Kubernetes допускает не более 6 доменов поиска.
Примеры конфигурации
Следующий пример описывает, как настроить DNS для рабочих нагрузок.
- Сценарий 1: Использование Kube-DNS/CoreDNS, встроенного в кластеры Kubernetes
Сценарий
Внутрикластерный Kube-DNS/CoreDNS в Kubernetes применяется только для разрешения внутренне‑кластерных доменных имён или внутренних кластерных доменных имён + внешних доменных имён. Это DNS по умолчанию для рабочих нагрузок.
Пример:
apiVersion: v1kind: Podmetadata:namespace: defaultname: dns-examplespec:containers:- name: testimage: nginx:alpinednsPolicy: ClusterFirstimagePullSecrets:- name: default-secretФайл конфигурации DNS контейнера:
nameserver 10.247.3.10search default.svc.cluster.local svc.cluster.local cluster.localoptions timeout:2 single-request-reopen ndots:5 - Сценарий 2: Использование облачного DNS
Сценарий
DNS не может разрешать внутренно‑кластерные доменные имена, поэтому применяется в сценарии, когда нагрузки обращаются только к внешним доменным именам, зарегистрированным в Интернете.
Пример:
apiVersion: v1kind: Podmetadata:namespace: defaultname: dns-examplespec:containers:- name: testimage: nginx:alpinednsPolicy: Default # The DNS configuration file that the kubelet --resolv-conf parameter points to is used. In this case, the CCE cluster uses the DNS on the cloud.imagePullSecrets:- name: default-secretФайл конфигурации DNS контейнера выглядит следующим образом: (100.125.x.x это DNS‑адрес подсети узла.)
nameserver 100.125.x.xoptions timeout:2 single-request-reopen - Сценарий 3: Использование Kube-DNS/CoreDNS для нагрузок, работающих с hostNetwork
Сценарий
По умолчанию DNS используется для нагрузок, работающих с hostNetwork. Если нагрузкам необходимо использовать Kube-DNS/CoreDNS, установите dnsPolicy на ClusterFirstWithHostNet.
Пример:
apiVersion: v1kind: Podmetadata:name: nginxspec:hostNetwork: truednsPolicy: ClusterFirstWithHostNetcontainers:- name: nginximage: nginx:alpineports:- containerPort: 80imagePullSecrets:- name: default-secretФайл конфигурации DNS контейнера:
nameserver 10.247.3.10search default.svc.cluster.local svc.cluster.local cluster.localoptions ndots:5 single-request-reopen timeout:2 - Сценарий 4: Настройка DNS-конфигурации приложения
Сценарий
Вы можете гибко настраивать файл конфигурации DNS для приложений. С помощью dnsPolicy и dnsConfig вместе могут покрыть почти все сценарии, включая сценарии, когда будет использоваться локальный DNS, будет каскадировано несколько DNS и будут изменены параметры конфигурации DNS.
Пример 1: Использование вашего локального DNS
Установите dnsPolicy на None чтобы файл конфигурации DNS приложения генерировался на основе dnsConfig.
apiVersion: v1kind: Podmetadata:namespace: defaultname: dns-examplespec:containers:- name: testimage: nginx:alpinednsPolicy: "None"dnsConfig:nameservers:- 10.2.3.4 # IP address of your on-premises DNSsearches:- ns1.svc.cluster.local- my.dns.search.suffixoptions:- name: ndotsvalue: "2"- name: timeoutvalue: "3"imagePullSecrets:- name: default-secretФайл конфигурации DNS контейнера:
nameserver 10.2.3.4search ns1.svc.cluster.local my.dns.search.suffixoptions timeout:3 ndots:2 single-request-reopenПример 2: Изменение параметра ndots в файле конфигурации DNS для снижения количества неверных DNS‑запросов
Установите dnsPolicy в значение, отличное от None чтобы параметры DNS, настроенные в dnsConfig были добавлены в файл конфигурации DNS, сгенерированный на основе dnsPolicy.
apiVersion: v1kind: Podmetadata:namespace: defaultname: dns-examplespec:containers:- name: testimage: nginx:alpinednsPolicy: "ClusterFirst"dnsConfig:options:- name: ndotsvalue: "2" # The ndots:5 option in the DNS configuration file generated based on the ClusterFirst policy is changed to ndots:2.imagePullSecrets:- name: default-secretФайл конфигурации DNS контейнера:
nameserver 10.247.3.10search default.svc.cluster.local svc.cluster.local cluster.localoptions ndots:2 single-request-reopen timeout:2Пример 3: Использование нескольких DNS последовательно
apiVersion: v1kind: Podmetadata:namespace: defaultname: dns-examplespec:containers:- name: testimage: nginx:alpinednsPolicy: ClusterFirst # Added DNS configuration. The cluster connects to CoreDNS by default.dnsConfig:nameservers:- 10.2.3.4 # IP address of your on-premises DNSimagePullSecrets:- name: default-secretNoteДля nameserver в файле конфигурации DNS контейнера можно настроить максимум три DNS‑адреса.
- Если dnsPolicy установлен в ClusterFirst и кластер использует CoreDNS, вы можете добавить два пользовательских DNS‑адреса в дополнение к адресу CoreDNS. Избыточные DNS‑адреса недействительны.
- Если dnsPolicy установлен в ClusterFirst и кластер использует CoreDNS и NodeLocal DNSCache, вы можете добавить один пользовательский DNS‑адрес в дополнение к адресам CoreDNS и NodeLocal DNSCache. Избыточные DNS‑адреса недействительны.
Файл конфигурации DNS контейнера:
nameserver 10.247.3.10nameserver 10.2.3.4search default.svc.cluster.local svc.cluster.local cluster.localoptions timeout:2 single-request-reopen ndots:5
- DNS Элементы конфигурации
- Настройка DNS для рабочей нагрузки через консоль
- Настройка DNS с использованием YAML рабочей нагрузки
- Примеры конфигурации