В каждом кластере Kubernetes есть встроенный аддон DNS (Kube-DNS или CoreDNS), обеспечивающий разрешение доменных имён для рабочих нагрузок в кластере. При обработке большого количества одновременных DNS‑запросов Kube-DNS/CoreDNS может столкнуться с узким местом производительности, то есть время от времени может не выполнять DNS‑запросы. Рабочие нагрузки Kubernetes иногда генерируют ненужные DNS‑запросы, что может перегрузить систему DNS в периоды высокой одновременной нагрузки запросов. Настройка конфигурации DNS для рабочих нагрузок снизит риск отказов DNS‑запросов в некоторой степени.
Для получения дополнительной информации о DNS см. CoreDNS.
Выполните команду cat /etc/resolv.conf на узле Linux или в контейнере, чтобы просмотреть файл конфигурации DNS‑резольвера. Ниже приведён пример конфигурации DNS‑резольвера контейнера в кластере Kubernetes:
Параметры конфигурации Значение ndots:5 означает, что если в доменном имени менее пяти точек (.), DNS‑запросы будут выполняться путём последовательного комбинирования доменного имени с каждым доменом из списка поиска. Если после проверки всех доменов списка поиска совпадение не найдено, доменное имя будет использовано для DNS‑запросов. Если в доменном имени пять и более точек, оно будет использовано в первую очередь для 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 см. в https://man7.org/linux/man-pages/man5/resolv.conf.5.html.
Kubernetes предоставляет параметры конфигурации, связанные с DNS, для приложений. Использование DNS‑конфигурации приложения может эффективно уменьшить количество ненужных DNS‑запросов в определённых сценариях и повысить конкурентность сервиса. В следующей процедуре в качестве примера используется приложение Nginx, чтобы описать, как добавить DNS‑конфигурацию для рабочей нагрузки в консоли.
При создании рабочей нагрузки с помощью YAML‑файла вы можете настроить параметры DNS в YAML. Ниже приведён пример для приложения Nginx:
Поле dnsPolicy используется для настройки политики DNS для приложения. Значение по умолчанию — ClusterFirst. В следующей таблице перечислены конфигурации dnsPolicy.
Параметр | Описание |
|---|---|
ClusterFirst (значение по умолчанию) | Пользовательская конфигурация DNS добавляется к конфигурации DNS по умолчанию. По умолчанию приложение подключается к CoreDNS (CoreDNS кластера CCE по умолчанию подключается к DNS в облаке). Пользовательский dnsConfig будет добавлен к параметрам DNS по умолчанию. Контейнеры могут разрешать как внутренние доменные имена кластера, зарегистрированные Service, так и внешние доменные имена, доступные в публичных сетях. Список поиска (search option) и ndots: 5 присутствуют в файле конфигурации DNS. Поэтому при обращении к внешнему доменному имени и к длинному внутреннему доменному имени кластера (например, kubernetes.default.svc.cluster.local) список поиска обычно обрабатывается первым, что приводит к минимум шести недействительным DNS‑запросам. Проблема недействительных DNS‑запросов исчезает только при обращении к короткому внутреннему доменному имени кластера (например, kubernetes). |
ClusterFirstWithHostNet | По умолчанию приложения, настроенные с host network, соединяются с конфигурацией DNS узла, на котором расположен pod. Конфигурация DNS указывается в DNS‑файле, на который указывает параметр kubelet --resolv-conf. В этом случае кластер CCE использует DNS в облаке. Чтобы соединиться с Kubernetes DNS или CoreDNS кластера, установите dnsPolicy в значение ClusterFirstWithHostNet. В этом случае конфигурация файла разрешения имён доменов контейнера совпадает с конфигурацией ClusterFirst, и возникают недействительные DNS‑запросы. |
Default | Конфигурация DNS узла, на котором расположен pod, наследуется, а пользовательская конфигурация DNS добавляется к наследованной конфигурации. Файл конфигурации DNS контейнера — это файл DNS, на который указывает флаг kubelet --resolv-conf. В этом случае для кластеров CCE используется облачный DNS. Параметры search и options оставлены неопределёнными. Такая конфигурация может разрешать только внешние доменные имена, зарегистрированные в Интернете, и не может разрешать внутренние доменные имена кластера. Эта конфигурация не имеет проблемы недействительных DNS‑запросов. |
None | Конфигурация DNS по умолчанию заменяется пользовательской конфигурацией DNS, и используется только пользовательская конфигурация DNS. Если dnsPolicy установлен в None, необходимо указать поле dnsConfig, поскольку все параметры DNS должны быть заданы с помощью поля dnsConfig. |
Если поле dnsPolicy не указано, значение по умолчанию будет ClusterFirst, а не Default.
Поле dnsConfig используется для настройки параметров DNS для рабочих нагрузок. Настроенные параметры объединяются в файл конфигурации DNS, созданный в соответствии с dnsPolicy. Если dnsPolicy установлена в None, файл конфигурации DNS рабочей нагрузки указывается полем dnsConfig. Если dnsPolicy не установлена в None, параметры DNS, настроенные в dnsConfig, добавляются в файл конфигурации DNS, созданный в соответствии с dnsPolicy.
Параметр | Описание |
|---|---|
options | Необязательный список объектов, каждый из которых может иметь свойство name (обязательно) и свойство value (необязательно). Содержимое этого свойства будет объединено с параметрами options, сгенерированными из указанной DNS‑политики в dnsPolicy. Дублирующие записи удаляются. |
nameservers | Список IP‑адресов, которые будут использоваться в качестве DNS‑серверов. Если dnsPolicy рабочей нагрузки установлена в None, список должен содержать как минимум один IP‑адрес, в противном случае это свойство является необязательным. Перечисленные серверы будут объединены с nameservers, сгенерированными из указанной DNS‑политики в dnsPolicy, при этом дублирующие адреса удаляются. ПРИМЕЧАНИЕ: Для nameserver в файле конфигурации DNS контейнера можно настроить не более трёх DNS‑адресов.
|
searches | Список доменов поиска DNS для разрешения имён хостов в pod. Это свойство является необязательным. При указании предоставленный список будет объединён с именами доменов поиска, сгенерированными из выбранной DNS‑политики в dnsPolicy. Дублирующие имена доменов удаляются. Kubernetes допускает не более 6 доменов поиска. |
В следующем примере описывается, как настроить DNS для рабочих нагрузок.
Сценарий
Kubernetes in-cluster Kube-DNS/CoreDNS может разрешать только внутренние для кластера доменные имена или как внутренние, так и внешние доменные имена. Это 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
Сценарий
Этот тип 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
Сценарий
По умолчанию для рабочих нагрузок, работающих с hostNetwork, используется DNS. Если рабочим нагрузкам необходимо использовать 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
Сценарий
Вы можете гибко настраивать файл конфигурации 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-secret
Для nameserver в файле конфигурации DNS контейнера можно настроить не более трёх DNS‑адресов.
Container's файл конфигурации 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