Облачная платформаВсе платформы

Конфигурация 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:

nameservernameserver 10.247.x.x
searchsearch default.svc.cluster.local svc.cluster.local cluster.local
optionsoptions single-request-reopen timeout:2 ndots:5

Параметры конфигурации

  • nameserver: список IP‑адресов name‑сервера, к которому будет обращаться резольвер. Если этот параметр установлен в 10.247.x.x, резольвер будет обращаться к kube-dns/CoreDNS. Если параметр установлен на другой IP‑адрес, резольвер будет обращаться к облачному или локальному DNS‑серверу.
  • search: список поиска для разрешения имён хостов. Когда доменное имя не может быть разрешено, DNS‑запросы будут выполняться, комбинируя доменное имя с каждым доменом из списка поиска последовательно, пока не будет найдено совпадение или пока не будут испробованы все домены. Для кластеров CCE список поиска в текущий момент ограничен тремя доменами на контейнер. При попытке разрешить несуществующее доменное имя будет инициировано восемь DNS‑запросов, поскольку каждое доменное имя (включая домены из списка поиска) будет запрошено дважды — один раз для IPv4 и один раз для IPvIPv6.
  • options: параметры, позволяющие изменять некоторые внутренние переменные резольвера. Распространённые параметры включают timeout и ndots.

    Значение 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‑запросов при доступе к внешним доменным именам, что указывает на явные возможности для оптимизации.

Note

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

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

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

  1. Войдите в CCE console и щёлкните название кластера, чтобы открыть консоль кластера.
  2. В навигационной панели выберите Рабочие нагрузки. В правом верхнем углу щёлкните Создать рабочую нагрузку.
  3. Настройте базовую информацию о рабочей нагрузке. Подробнее см. Creating a Workload.
  4. В Расширенные настройки раздел, щёлкните DNS вкладку и установите следующие параметры по необходимости:

    • Политика DNS: Политики DNS, предоставляемые в консоли, соответствуют dnsPolicy полю в YAML‑файле. Подробнее см. Table 1.
      • Дополнить значения по умолчанию: соответствует dnsPolicy=ClusterFirst. Контейнеры могут разрешать как внутренние доменные имена кластера, зарегистрированные Service, так и внешние доменные имена, доступные в публичных сетях.
      • Заменить значения по умолчанию: соответствует dnsPolicy=None. Необходимо настроить IP‑адрес и Поисковый домен. Контейнеры используют только пользовательские настройки IP‑адреса и поискового домена для разрешения имён.
      • Наследовать значения по умолчанию: соответствует dnsPolicy=Default. Контейнеры используют конфигурацию разрешения доменных имён узла, на котором работают pod, и не могут разрешать внутренние доменные имена кластера.
    • Дополнительные объекты: Параметры options в dnsConfig field. Каждый объект может иметь свойство name (обязательно) и свойство value (необязательно). После задания свойств щёлкните подтвердить добавление.
      • timeout: интервал тайм‑аута в секундах.
      • ndots: количество точек (.), которые должны присутствовать в доменном имени. Если у доменного имени меньше точек, чем это значение, операционная система будет искать имя в поисковом домене. Если нет, имя считается полностью квалифицированным доменным именем (FQDN) и будет использовано в первую очередь как абсолютное имя.
    • IP‑адрес DNS‑сервера: nameservers in dnsConfig. Вы можете настроить DNS‑сервер для собственного доменного имени. Значение представляет собой один или несколько IP‑адресов DNS.
    • Поисковый домен: searches in the dnsConfig. Список DNS‑поисковых доменов для разрешения имён хостов в pod. Это свойство является необязательным. При указании предоставленный список будет объединён со списком поисковых доменов, сформированным выбранной политикой DNS в dnsPolicy. Дублирующиеся доменные имена удаляются.
    • Псевдоним хоста: Добавьте сопоставление доменных имён и IP‑адресов в локальный конфигурационный файл /etc/hosts pod для упрощённого локального разрешения доменных имён. Подробнее см. Adding entries to Pod /etc/hosts with HostAliases

  5. Щёлкните Создать рабочую нагрузку.

Настройка 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 dnsPolicy: None
dnsConfig: dnsConfig:
options: options:
- name: ndots
value: '5'
- name: timeout
value: '3'
nameservers: nameservers:
- 10.2.3.4
searches: searches:
- my.dns.search.suffix

  • dnsPolicy

    Поле dnsPolicy используется для настройки политики DNS для приложения. Значение по умолчанию — ClusterFirst. Ниже представлена таблица, в которой перечислены dnsPolicy конфигурации.

    Table 1 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‑запросы.

    ...
    spec:
    containers:
    - image: nginx:latest
    imagePullPolicy: IfNotPresent
    name: container-1
    restartPolicy: Always
    hostNetwork: truehostNetwork: true
    dnsPolicy: ClusterFirstWithHostNetClusterFirstWithHostNet

    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.

    Note

    If the dnsPolicy field is not specified, the default value is ClusterFirst instead of Default.

  • dnsConfig

    Поле dnsConfig используется для настройки параметров DNS для рабочих нагрузок. Настроенные параметры объединяются с файлом конфигурации DNS, созданным в соответствии с dnsPolicy. If dnsPolicy is set to None, файл конфигурации DNS рабочей нагрузки задаётся полем dnsConfig field. If dnsPolicy is not set to None, параметры DNS, настроенные в dnsConfig добавляются к файлу конфигурации DNS, созданному в соответствии с .

    Table 2 dnsConfig

    Параметр

    Описание

    Необязательный список объектов, где каждый объект может иметь свойство 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 контейнера.

    • If dnsPolicy is set to ClusterFirst and the cluster uses CoreDNS, можно добавить два пользовательских DNS‑адреса вдобавок к адресу CoreDNS. Избыточные DNS‑адреса недействительны.
    • If dnsPolicy is set to ClusterFirst and the cluster uses CoreDNS and NodeLocal DNSCache, можно добавить один пользовательский DNS‑адрес вдобавок к адресам CoreDNS и NodeLocal DNSCache. Избыточные DNS‑адреса недействительны.

    searches

    Список DNS‑поисковых доменов для разрешения имён хостов в pod. Это свойство необязательно. При указании предоставленный список будет объединён с именами поисковых доменов, сформированными выбранной политикой DNS в dnsPolicy. Дублирующие доменные имена удаляются. Kubernetes допускает не более 6 поисковых доменов.

Примеры конфигураций

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

  • Use Case 1: Using Kube-DNS/CoreDNS Built in Kubernetes Clusters

    Сценарий

    Kube-DNS/CoreDNS в кластере Kubernetes может разрешать только внутренние доменные имена кластера, либо и внутренние, и внешние доменные имена. Это DNS по умолчанию для рабочих нагрузок.

    Пример:

    apiVersion: v1
    kind: Pod
    metadata:
    namespace: default
    name: dns-example
    spec:
    containers:
    - name: test
    image: nginx:alpine
    dnsPolicy: ClusterFirstdnsPolicy: 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
  • Use Case 2: Using a Cloud DNS

    Сценарий

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

    Пример:

    apiVersion: v1
    kind: Pod
    metadata:
    namespace: default
    name: dns-example
    spec:
    containers:
    - name: test
    image: nginx:alpine
    dnsPolicy: 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.x
    options timeout:2 single-request-reopen
  • Use Case 3: Using Kube-DNS/CoreDNS for Workloads Running with hostNetwork

    Сценарий

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

    Пример:

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

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

    nameserver 10.247.3.1010.247.3.10
    search default.svc.cluster.local svc.cluster.local cluster.localdefault.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5 single-request-reopen timeout:2
  • Use Case 4: Customizing Application's DNS Configuration

    Сценарий

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

    Example 1: Using Your On-Premises DNS

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

    apiVersion: v1
    kind: Pod
    metadata:
    namespace: default
    name: dns-example
    spec:
    containers:
    - name: test
    image: nginx:alpine
    dnsPolicy: "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 DNS
    searches: searches:
    - ns1.svc.cluster.local - ns1.svc.cluster.local
    - my.dns.search.suffix - my.dns.search.suffix
    options: options:
    - name: ndots - name: ndots
    value: "2" value: "2"
    - name: timeout - name: timeout
    value: "3" value: "3"
    imagePullSecrets:
    - name: default-secret

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

    nameserver 10.2.3.410.2.3.4
    search ns1.svc.cluster.local my.dns.search.suffixns1.svc.cluster.local my.dns.search.suffix
    options 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: 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-secretContainer's DNS configuration file:Container's DNS configuration file:nameserver 10.247.3.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:2 single-request-reopen timeout:2nameserver 10.247.3.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:2 single-request-reopen timeout:2
    Example 3: Using Multiple DNSs in Serial Sequence

    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: nameservers:
    - 10.2.3.4 # IP address of your on-premises DNS - 10.2.3.4 # IP address of your on-premises DNS
    imagePullSecrets:
    - name: default-secret
    Note

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

    • If dnsPolicy is set to ClusterFirst and the cluster uses CoreDNS, можно добавить два пользовательских DNS‑адреса вдобавок к адресу CoreDNS. Избыточные DNS‑адреса недействительны.
    • If dnsPolicy is set to ClusterFirst and the cluster uses CoreDNS and NodeLocal DNSCache, можно добавить один пользовательский DNS‑адрес вдобавок к адресам CoreDNS и NodeLocal DNSCache. Избыточные DNS‑адреса недействительны.

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

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