Kubernetes использует частный DNS

Можно ли в Kubernetes использовать частный DNS? Например, приложению необходимо подключиться к внешней БД по имени хоста. Запись DNS, которая разрешает IP, хранится в частном DNS.

Мой AKS (служба Azure Kubernetes) работает на версии 1.17, которая уже использует новый coreDNS.

Моя первая попытка состояла в том, чтобы использовать этот частный DNS, как на виртуальной машине, настроив файл /etc/resolve.conf для модулей:

dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 10.76.xxx.xxx
      - 10.76.xxx.xxx
    searches:
      - az-q.example.com
    options:
      - name: ndots
        value: "2"

Затем я попытался использовать configmap для настройки coreDNS:

apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-dns
  namespace: kube-system
data:
  upstreamNameservers: |
    ["10.76.xxx.xxx", "10.76.xxx.xxx"]

Но мой под каждый раз запускается с ошибкой при развертывании:

$ sudo kubectl logs app-homepage-backend-xxxxx -n ingress-nginx
events.js:174
      throw er; // Unhandled 'error' event
      ^
Error: getaddrinfo ENOTFOUND az-q.example.com az-q.example.com:636
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)

Что мне не хватает?


person Nico Schuck    schedule 30.01.2020    source источник


Ответы (3)


Чтобы добиться того, что вам нужно, я бы пошел с определением dnsPolicy: ClusterFirst в манифестах модуля, а затем с определением зоны-заглушки (частной зоны DNS) в вашей подсистеме DNS кластера.

Для идентификации стека DNS кластера обычно проверяйте модули, работающие в пространстве имен kube-system. Скорее всего, вы найдете один из этих двух: CoreDNS или Kube-DNS.

Если DNS вашего кластера работает на CoreDNS, найдите это вид модификации в вашей coredns configmap. Если вы используете старую систему Kube-DNS, найдите это изменение в kube-dns configmap.

Важно отметить, что если вы хотите применить эту модификацию к модулям, работающим в режиме сети хоста (многие модули из пространства имен kube-system), вам необходимо изменить их манифесты с помощью строфы dnsPolicy: ClusterFirstWithHostNet.

person Bernard Halas    schedule 05.02.2020

Все зависит от dnsPolicy, установленного вами в файле конфигурации развертывания ваше приложение.

Если для параметра dnsPolicy модуля установлено значение “default”,, он наследует конфигурацию разрешения имен от узла, на котором работает модуль. Разрешение DNS модуля должно вести себя так же, как и узел.

1. Многие дистрибутивы Linux (например, Ubuntu) по умолчанию используют локальный преобразователь DNS (systemd-resolved). Systemd-resolved перемещает и заменяет /etc/resolv.conf файлом-заглушкой, который может вызвать фатальный цикл пересылки при разрешении имен на вышестоящих серверах. Это можно исправить вручную, используя флаг --resolv-conf в kubelet, чтобы указать на правильный файл resolv.conf (с systemd-resolved это /run/systemd/resolve/resolv.conf). kubeadm (> = 1.11) автоматически определяет systemd-resolved и соответствующим образом регулирует флаги kubelet.

Установки Kubernetes не настраивают файлы resolv.conf узлов на использование кластерного DNS по умолчанию, потому что этот процесс по своей сути зависит от распределения. Вероятно, в конечном итоге это должно быть реализовано.

2. libc Linux невозможно застрять (см. эту ошибку от 2005 года) с ограничениями всего 3 записями DNS-серверов и 6 записями поиска DNS. Kubernetes должен использовать 1 запись сервера имен и 3 записи поиска. Это означает, что если локальная установка уже использует 3 сервера имен или использует более 3 поисковых запросов, некоторые из этих настроек будут потеряны. В качестве частичного обходного пути узел может запустить dnsmasq, который предоставит больше записей сервера имен, но не больше записей поиска. Вы также можете использовать флаг --resolv-conf в kubelet.

3. Убедитесь, что вы не используете Alpine версии 3.3 или более ранней в качестве базового образа, в этом случае DNS может работать некорректно.

Взгляните сюда: dns-kubernetes-known -выпуски.

person Malgorzata    schedule 31.01.2020

Какое значение установлено для dnsPolicy в конфигурации развертывания приложения? Согласно этому документу:

Пользовательские вышестоящие серверы имен и заглушки не влияют на модули с dnsPolicy, установленным на «Default» или «None».

Если для параметра dnsPolicy модуля установлено значение «ClusterFirst», его разрешение имен обрабатывается по-разному, в зависимости от того, настроены ли DNS-серверы тупикового домена и вышестоящие DNS-серверы.

Посмотрите в этом документе пример и то, что происходит с пользовательскими конфигурациями.

person gears    schedule 30.01.2020