DNS сервер в кубернетах для перевода хостов LAN

Я использую baremetal-кластер из 1 главного и 2 узлов в своей домашней лаборатории с istio, metallb и calico.

Я хочу создать DNS-сервер в кубернетах, который переводит IP-адреса для хостов в локальной сети.

Можно ли использовать coreDNS, уже установленный в k8s?


person rbr86    schedule 07.07.2021    source источник


Ответы (1)


Да, это возможно, но при этом следует учитывать некоторые моменты. Большинство из них описано в ответе на Stackoverflow ниже:

Например: DNS-сервер будет разрешать запросы, которые являются внутренними для кластера Kubernetes (например, nslookup kubernetes.default.svc.cluster.local).


Я включил пример того, как вы можете открыть свой CoreDNS внешним источникам и добавить Service, который будет указывать на какой-то IP-адрес.

Шаги:

  • Измените CoreDNS Service, чтобы он был доступен снаружи.
  • Modify the configMap of your CoreDNS accordingly to:
  • Создайте Service, указывающий на внешнее устройство.
  • Контрольная работа

Измените CoreDNS Service, чтобы он был доступен снаружи.

Поскольку вы новичок в Kubernetes, вы, вероятно, знаете, как Services работает и что можно сделать доступным извне. Вам нужно будет изменить свой CoreDNS Service с ClusterIP на NodePort или LoadBalancer (я бы подумал, что LoadBalancer было бы лучше, учитывая, что metallb используется, и вы получите доступ к DNS серверу через порт: 53)

  • $ kubectl edit --namespace=kube-system service/coredns (or kube-dns)

Примечание!

CoreDNS использует TCP и UDP одновременно, это может быть проблемой при создании LoadBalancer. Здесь вы можете найти больше информации об этом:


Измените configMap вашего CoreDNS

Если вы хотите разрешить домен, например: example.org, вам нужно будет отредактировать configMap из CoreDNS следующим образом:

  • $ kubectl edit configmap --namespace=kube-system coredns

Добавьте строку в Corefile:

        k8s_external example.org

Этот плагин позволяет дополнительной зоне разрешать внешний IP-адрес (а) службы Kubernetes. Этот плагин полезен, только если также загружен плагин kubernetes.

Плагин использует внешнюю зону для разрешения IP-адресов в кластере. Он обрабатывает только запросы для записей A, AAAA и SRV; все остальные приводят к ответам NODATA. Чтобы сделать его правильной зоной DNS, он обрабатывает запросы SOA и NS для вершины зоны.

- CoreDNS.io: плагины: K8s_external


Создайте Service, указывающий на внешнее устройство.

Следуя приведенной мной ссылке, теперь вы можете создать Service, который будет указывать на IP-адрес:

apiVersion: v1
kind: Service
metadata:
 name: test
 namespace: default
spec:
 clusterIP: None
 externalIPs:
 - 192.168.200.123
 type: ClusterIP

Контрольная работа

Я использовал minikube с --driver=dockerNodePort), но полагаю, вы можете использовать ExternalIP своего LoadBalancer, чтобы проверить это:

  • dig @192.168.49.2 test.default.example.org -p 32261 +short
192.168.200.123

где:

  • @192.168.49.2 - IP-адрес minikube
  • test.default.example.org - имя-службы.namespace.k8s_external_domain
  • -p 32261 - NodePort порт
  • +short - для ограничения вывода

Дополнительные ресурсы:

person Dawid Kruk    schedule 08.07.2021
comment
Отличный ответ, большое спасибо - person rbr86; 09.07.2021
comment
Как я могу добавить записи A, CNAME ...? Как test.example.com - person rbr86; 09.07.2021
comment
@ rbr86 плагин, который я включил в вопрос, указывает на своей странице документации, что: It only handles queries for A, AAAA and SRV records; all others result in NODATA responses.. - person Dawid Kruk; 13.07.2021