Каждый кластер 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:
nameservernameserver 10.247.x.xsearchsearch default.svc.cluster.local svc.cluster.local cluster.localoptionsoptions single-request-reopen timeout:2 ndots:5
Параметры конфигурации
Значение ndots:5 означает, что если у доменного имени меньше 5 точек (.), DNS‑запросы будут выполняться, комбинируя доменное имя с каждым доменом из списка поиска последовательно. Если после перебора всех доменов из списка поиска совпадение не найдено, доменное имя будет использовано для DNS‑запросов. Если у доменного имени 5 или более точек, оно будет использовано в первую очередь для DNS‑запросов. В случае, когда доменное имя не может быть разрешено, DNS‑запросы будут выполнятьcя, комбинируя доменное имя с каждым доменом из списка поиска последовательно.
Например, доменное имя 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:
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 dnsPolicy: NonednsConfig: dnsConfig:options: options:- name: ndotsvalue: '5'- name: timeoutvalue: '3'nameservers: nameservers:- 10.2.3.4searches: searches:- my.dns.search.suffix
Поле 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 to ClusterFirstWithHostNet. В этом случае конфигурация файла разрешения доменных имён контейнера совпадает с конфигурацией ClusterFirst, и присутствуют неверные DNS‑запросы.
|
Default | Конфигурация DNS узла, на котором расположен pod, наследуется, а пользовательская конфигурация DNS добавляется к наследуемой конфигурации. Файл конфигурации DNS контейнера — это файл DNS, на который указывает --resolv-conf флаг указывает. В этом случае для кластеров CCE используется облачный DNS. И search и options поля оставлены неопределёнными. Такая конфигурация может разрешать только внешние доменные имена, зарегистрированные в интернете, и не может решать внутренние доменные имена кластера. Эта конфигурация избавлена от проблемы неверных DNS‑запросов. |
None | Конфигурация DNS по умолчанию заменяется пользовательской конфигурацией DNS, и используется только пользовательская конфигурация DNS. Если dnsPolicy is set to None, the dnsConfig поле должно быть указано, поскольку все настройки DNS должны предоставляться с помощью dnsConfig field. |
If the dnsPolicy field is not specified, the default value is ClusterFirst instead of Default.
Поле dnsConfig используется для настройки параметров DNS для рабочих нагрузок. Настроенные параметры объединяются с файлом конфигурации DNS, созданным в соответствии с dnsPolicy. If dnsPolicy is set to None, файл конфигурации DNS рабочей нагрузки задаётся полем dnsConfig field. If dnsPolicy is not set to None, параметры DNS, настроенные в dnsConfig добавляются к файлу конфигурации DNS, созданному в соответствии с .
Параметр | |
|---|---|
Описание | Необязательный список объектов, где каждый объект может иметь свойство name (обязательно) и свойство value (необязательно). Содержимое этого свойства будет объединено с параметрами options, полученными из указанной политики DNS в options. Дублирующие записи удаляются. |
A list of IP addresses that will be used as DNS servers. If workload's dnsPolicy is set to None, список должен содержать минимум один IP‑адрес, иначе это свойство является необязательным. Перечисленные серверы будут объединены с nameservers, сгенерированными из указанной политики DNS в dnsPolicy с удалением дублирующихся адресов. NOTE: Допускается настройка максимум трёх DNS‑адресов для nameserver в файле конфигурации DNS контейнера.
| |
searches | Список DNS‑поисковых доменов для разрешения имён хостов в pod. Это свойство необязательно. При указании предоставленный список будет объединён с именами поисковых доменов, сформированными выбранной политикой DNS в dnsPolicy. Дублирующие доменные имена удаляются. Kubernetes допускает не более 6 поисковых доменов. |
Следующий пример описывает, как настроить DNS для рабочих нагрузок.
Сценарий
Kube-DNS/CoreDNS в кластере Kubernetes может разрешать только внутренние доменные имена кластера, либо и внутренние, и внешние доменные имена. Это DNS по умолчанию для рабочих нагрузок.
Пример:
apiVersion: v1kind: Podmetadata:namespace: defaultname: dns-examplespec:containers:- name: testimage: nginx:alpinednsPolicy: ClusterFirstdnsPolicy: 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: DefaultdnsPolicy: Default # The DNS configuration file that the kubelet --resolv-conf--resolv-conf параметр указывает. В этом случае кластер CCE использует облачный DNS.imagePullSecrets:- name: default-secret
Файл конфигурации DNS контейнера выглядит следующим образом: (100.125.x.x — DNS‑адрес подсети узла.)
nameserver 100.125.x.x100.125.x.xoptions timeout:2 single-request-reopen
Сценарий
По умолчанию DNS используется для рабочих нагрузок, работающих с hostNetwork. Если рабочим нагрузкам необходимо использовать Kube-DNS/CoreDNS, задайте dnsPolicy to ClusterFirstWithHostNet.
Пример:
apiVersion: v1kind: Podmetadata:name: nginxspec:hostNetwork: truehostNetwork: truednsPolicy: ClusterFirstWithHostNet dnsPolicy: ClusterFirstWithHostNetcontainers:- name: nginximage: nginx:alpineports:- containerPort: 80imagePullSecrets:- name: default-secret
Файл конфигурации DNS контейнера:
nameserver 10.247.3.1010.247.3.10search default.svc.cluster.local svc.cluster.local cluster.localdefault.svc.cluster.local svc.cluster.local cluster.localoptions ndots:5 single-request-reopen timeout:2
Сценарий
Вы можете гибко настраивать файл конфигурации DNS для приложений. Используя dnsPolicy and dnsConfig совместно позволяют решить почти все сценарии, включая случаи, когда будет использоваться локальный DNS, несколько DNS‑ов будут каскадироваться, а параметры конфигурации DNS будут изменены.
Example 1: Using Your On-Premises DNS
Задайте dnsPolicy to None так файл конфигурации DNS приложения будет сгенерирован на основе dnsConfig.
apiVersion: v1kind: Podmetadata:namespace: defaultname: dns-examplespec:containers:- name: testimage: nginx:alpinednsPolicy: "None"dnsConfig:nameservers: nameservers:- 10.2.3.4 # IP address of your on-premises DNS - 10.2.3.4 # IP address of your on-premises DNSsearches: searches:- ns1.svc.cluster.local - ns1.svc.cluster.local- my.dns.search.suffix - my.dns.search.suffixoptions: options:- name: ndots - name: ndotsvalue: "2" value: "2"- name: timeout - name: timeoutvalue: "3" value: "3"imagePullSecrets:- name: default-secret
Файл конфигурации DNS контейнера:
nameserver 10.2.3.410.2.3.4search ns1.svc.cluster.local my.dns.search.suffixns1.svc.cluster.local my.dns.search.suffixoptions timeout:3 ndots:2timeout:3 ndots:2 single-request-reopen
Example 2: Modifying the ndots Option in the DNS Configuration File to Reduce Invalid DNS Queries
Задайте 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-secretContainer's DNS configuration file:Container's DNS configuration file:nameserver 10.247.3.10search default.svc.cluster.local svc.cluster.local cluster.localoptions ndots:2 single-request-reopen timeout:2nameserver 10.247.3.10search default.svc.cluster.local svc.cluster.local cluster.localoptions ndots:2 single-request-reopen timeout:2Example 3: Using Multiple DNSs in Serial Sequence
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: nameservers:- 10.2.3.4 # IP address of your on-premises DNS - 10.2.3.4 # IP address of your on-premises DNSimagePullSecrets:- name: default-secret
Для nameserver в файле конфигурации DNS контейнера можно настроить не более трёх DNS‑адресов.
Файл конфигурации DNS контейнера:
nameserver 10.247.3.10nameserver 10.2.3.410.2.3.4search default.svc.cluster.local svc.cluster.local cluster.localoptions timeout:2 single-request-reopen ndots:5