Каждый кластер 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:
nameserver 10.247.x.xsearch default.svc.cluster.local svc.cluster.local cluster.localoptions single-request-reopen timeout:2 ndots:5
Параметры конфигурации
Значение 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.
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: NonednsConfig:options:- name: ndotsvalue: '5'- name: timeoutvalue: '3'nameservers:- 10.2.3.4searches:- my.dns.search.suffix
Этот dnsPolicy поле используется для настройки политики DNS для приложения. Значение по умолчанию ClusterFirst. Следующая таблица содержит dnsPolicy конфигурации.
Параметр | Описание |
|---|---|
ClusterFirst (значение по умолчанию) | Пользовательская конфигурация DNS добавлена к конфигурации DNS по умолчанию. По умолчанию приложение подключается к CoreDNS (CoreDNS кластера CCE по умолчанию подключается к DNS в облаке). Пользовательская dnsConfig будет добавлена к параметрам DNS по умолчанию. Контейнеры могут разрешать как внутренние доменные имена кластера, зарегистрированные сервисом, так и внешние доменные имена, доступные в публичных сетях. Список поиска (search опция) и 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‑запросы.
|
По умолчанию | Конфигурация DNS узла, на котором находится pod, наследуется, и пользовательская конфигурация DNS добавляется к наследуемой конфигурации. Файл конфигурации DNS контейнера является файлом конфигурации DNS, который использует kubelet --resolv-conf флаг указывает на. В этом случае для кластеров CCE используется облачный DNS. Оба search и опции поля оставлены неуказанными. Эта конфигурация может разрешать только внешние доменные имена, зарегистрированные в Интернете, и не может разрешать внутренние доменные имена кластера. Эта конфигурация свободна от проблемы недействительных DNS‑запросов. |
Нет | Конфигурация DNS по умолчанию заменяется пользовательской конфигурацией DNS, и используется только пользовательская конфигурация DNS. Если dnsPolicy установлен в Отсутствует, dnsConfig поле должно быть указано, потому что все настройки DNS должны предоставляться с использованием dnsConfig поле. |
Если dnsPolicy поле не указано, значение по умолчанию равно ClusterFirst вместо Default.
Поле dnsConfig поле используется для настройки параметров DNS для нагрузок. Настроенные параметры объединяются в файл конфигурации DNS, сгенерированный согласно dnsPolicy. Если dnsPolicy установлен в None, файл конфигурации DNS рабочей нагрузки задаётся dnsConfig поле. Если dnsPolicy не установлен в None, параметры DNS, настроенные в dnsConfig добавляются в файл конфигурации DNS, сгенерированный в соответствии с dnsPolicy.
Параметр | Описание |
|---|---|
опции | Необязательный список объектов, каждый из которых может иметь свойство name (обязательно) и свойство value (необязательно). Содержимое этого свойства будет объединено с опциями, генерируемыми из указанной DNS‑политики в dnsPolicy. Повторяющиеся записи удаляются. |
nameservers | Список IP‑адресов, которые будут использоваться в качестве DNS‑серверов. Если у нагрузки dnsPolicy установлен в None, список должен содержать как минимум один IP‑адрес, в противном случае это свойство является необязательным. Перечисленные серверы будут объединены с nameservers, сгенерированными из указанной DNS‑policy в dnsPolicy с удалёнными дублирующими адресами. ПРИМЕЧАНИЕ: Можно настроить максимум три DNS‑адреса для nameserver в файле конфигурации DNS контейнера.
|
поисковые запросы | Список доменов поиска 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 в Нет чтобы файл конфигурации 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 в значение, отличное от Нет чтобы параметры 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
Для сервера имён в файле конфигурации DNS контейнера можно настроить максимум три адреса 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