Advanced
Тема интерфейса

Конфигурация DNS

Эта статья полезна?
Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Каждый кластер 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.x
search default.svc.cluster.local svc.cluster.local cluster.local
options 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 рабочей нагрузки есть возможности для улучшения.

Note

Для получения дополнительной информации о параметрах конфигурации в файле конфигурации резольвера, используемом в операционных системах Linux, посетите http://man7.org/linux/man-pages/man5/resolv.conf.5.html.

Настройка DNS для рабочей нагрузки через консоль

Kubernetes предоставляет параметры конфигурации, связанные с DNS, для приложений. Использование DNS‑конфигурации приложения может эффективно снизить количество лишних DNS‑запросов в определённых сценариях и повысить конкурентность сервисов. В следующей процедуре в качестве примера используется приложение Nginx, чтобы описать, как добавить DNS‑конфигурацию для рабочей нагрузки через консоль.

  1. Войдите в консоль CCE, откройте консоль кластера, выберите Рабочие нагрузки в навигационной панели и нажмите Создать рабочую нагрузку в правом верхнем углу.
  2. Настройте базовую информацию о рабочей нагрузке. Подробности см. Создание рабочей нагрузки.
  3. В Расширенные настройки области, нажмите 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

  4. Нажмите Создать нагрузку.

Настройка DNS с помощью YAML нагрузки

При создании нагрузки с использованием YAML‑файла вы можете настроить параметры DNS в YAML. Ниже приводится пример для приложения Nginx:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: container-1
image: nginx:latest
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: default-secret
dnsPolicy: None
dnsConfig:
options:
- name: ndots
value: '5'
- name: timeout
value: '3'
nameservers:
- 10.2.3.4
searches:
- 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:latest
    imagePullPolicy: IfNotPresent
    name: container-1
    restartPolicy: Always
    hostNetwork: true
    dnsPolicy: 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: v1
    kind: Pod
    metadata:
    namespace: default
    name: dns-example
    spec:
    containers:
    - name: test
    image: nginx:alpine
    dnsPolicy: ClusterFirst
    imagePullSecrets:
    - name: default-secret

    Файл конфигурации DNS контейнера:

    nameserver 10.247.3.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options timeout:2 single-request-reopen ndots:5
  • Сценарий 2: Использование облачного DNS

    Сценарий

    DNS не может разрешать внутренно‑кластерные доменные имена, поэтому применяется в сценарии, когда нагрузки обращаются только к внешним доменным именам, зарегистрированным в Интернете.

    Пример:

    apiVersion: v1
    kind: Pod
    metadata:
    namespace: default
    name: dns-example
    spec:
    containers:
    - name: test
    image: nginx:alpine
    dnsPolicy: 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.x
    options timeout:2 single-request-reopen
  • Сценарий 3: Использование Kube-DNS/CoreDNS для нагрузок, работающих с hostNetwork

    Сценарий

    По умолчанию DNS используется для нагрузок, работающих с hostNetwork. Если нагрузкам необходимо использовать Kube-DNS/CoreDNS, установите dnsPolicy на ClusterFirstWithHostNet.

    Пример:

    apiVersion: v1
    kind: Pod
    metadata:
    name: nginx
    spec:
    hostNetwork: true
    dnsPolicy: ClusterFirstWithHostNet
    containers:
    - name: nginx
    image: nginx:alpine
    ports:
    - containerPort: 80
    imagePullSecrets:
    - name: default-secret

    Файл конфигурации DNS контейнера:

    nameserver 10.247.3.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5 single-request-reopen timeout:2
  • Сценарий 4: Настройка DNS-конфигурации приложения

    Сценарий

    Вы можете гибко настраивать файл конфигурации DNS для приложений. С помощью dnsPolicy и dnsConfig вместе могут покрыть почти все сценарии, включая сценарии, когда будет использоваться локальный DNS, будет каскадировано несколько DNS и будут изменены параметры конфигурации DNS.

    Пример 1: Использование вашего локального DNS

    Установите dnsPolicy на None чтобы файл конфигурации DNS приложения генерировался на основе dnsConfig.

    apiVersion: v1
    kind: Pod
    metadata:
    namespace: default
    name: dns-example
    spec:
    containers:
    - name: test
    image: nginx:alpine
    dnsPolicy: "None"
    dnsConfig:
    nameservers:
    - 10.2.3.4 # IP address of your on-premises DNS
    searches:
    - ns1.svc.cluster.local
    - my.dns.search.suffix
    options:
    - name: ndots
    value: "2"
    - name: timeout
    value: "3"
    imagePullSecrets:
    - name: default-secret

    Файл конфигурации DNS контейнера:

    nameserver 10.2.3.4
    search ns1.svc.cluster.local my.dns.search.suffix
    options timeout:3 ndots:2 single-request-reopen

    Пример 2: Изменение параметра ndots в файле конфигурации DNS для снижения количества неверных DNS‑запросов

    Установите dnsPolicy в значение, отличное от None чтобы параметры DNS, настроенные в dnsConfig были добавлены в файл конфигурации DNS, сгенерированный на основе dnsPolicy.

    apiVersion: v1
    kind: Pod
    metadata:
    namespace: default
    name: dns-example
    spec:
    containers:
    - name: test
    image: nginx:alpine
    dnsPolicy: "ClusterFirst"
    dnsConfig:
    options:
    - name: ndots
    value: "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.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:2 single-request-reopen timeout:2

    Пример 3: Использование нескольких DNS последовательно

    apiVersion: v1
    kind: Pod
    metadata:
    namespace: default
    name: dns-example
    spec:
    containers:
    - name: test
    image: nginx:alpine
    dnsPolicy: ClusterFirst # Added DNS configuration. The cluster connects to CoreDNS by default.
    dnsConfig:
    nameservers:
    - 10.2.3.4 # IP address of your on-premises DNS
    imagePullSecrets:
    - name: default-secret
    Note

    Для nameserver в файле конфигурации DNS контейнера можно настроить максимум три DNS‑адреса.

    • Если dnsPolicy установлен в ClusterFirst и кластер использует CoreDNS, вы можете добавить два пользовательских DNS‑адреса в дополнение к адресу CoreDNS. Избыточные DNS‑адреса недействительны.
    • Если dnsPolicy установлен в ClusterFirst и кластер использует CoreDNS и NodeLocal DNSCache, вы можете добавить один пользовательский DNS‑адрес в дополнение к адресам CoreDNS и NodeLocal DNSCache. Избыточные DNS‑адреса недействительны.

    Файл конфигурации DNS контейнера:

    nameserver 10.247.3.10
    nameserver 10.2.3.4
    search default.svc.cluster.local svc.cluster.local cluster.local
    options timeout:2 single-request-reopen ndots:5