Можем ли мы настроить пустой матовый сервер k8s для запуска DNS-сервера Bind (именованного) и иметь доступ к нему снаружи через порт 53? - PullRequest
0 голосов
/ 12 апреля 2020

Я настроил кластер k8s, используя 2 голых металлических сервера (1 мастер и 1 рабочий), используя kubespray с настройками по умолчанию (kube_proxy_mode: iptables и dns_mode: coredns ) и я хотел бы запустить BIND DNS-сервер внутри для управления парой доменных имен .

Я развернул с помощью helm 3 веб-приложение helloworld для тестирование. Все работает как чудо (HTTP, HTTP, Let's Encrypt, подумал cert-manager).

kubectl version
Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.4", GitCommit:"8d8aa39598534325ad77120c120a22b3a990b5ea", GitTreeState:"clean", BuildDate:"2020-03-12T21:03:42Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.7", GitCommit:"be3d344ed06bff7a4fc60656200a93c74f31f9a4", GitTreeState:"clean", BuildDate:"2020-02-11T19:24:46Z", GoVersion:"go1.13.6", Compiler:"gc", Platform:"linux/amd64"}

kubectl get nodes
NAME        STATUS   ROLES    AGE   VERSION
k8smaster   Ready    master   22d   v1.16.7
k8sslave    Ready    <none>   21d   v1.16.7

Я развернул с Helm 3 диаграмму изображения моего BIND DNS-сервера (named) в пространстве имен по умолчанию; со службой, предоставляющей порт 53 контейнера приложения bind.

Я проверил разрешение DNS с помощью модуля pod и службы связывания; это работает хорошо. Вот тест службы bind k8s от главного узла:

kubectl -n default get svc bind -o wide
NAME   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE    SELECTOR
bind   ClusterIP   10.233.31.255   <none>        53/TCP,53/UDP   4m5s   app=bind,release=bind

kubectl get endpoints bind
NAME   ENDPOINTS                                                        AGE
bind   10.233.75.239:53,10.233.93.245:53,10.233.75.239:53 + 1 more...   4m12s

export SERVICE_IP=`kubectl get services bind -o go-template='{{.spec.clusterIP}}{{"\n"}}'`
nslookup www.example.com ${SERVICE_IP}
Server:     10.233.31.255
Address:    10.233.31.255#53

Name:   www.example.com
Address: 176.31.XXX.XXX

Итак, приложение bind DNS развернуто и работает нормально через службу bind k8s .

для следующего шага; Я следовал документации https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/ для настройки Nginx Ingress Controller (как configmap, так и службы) на обработку tcp / udp запросов на порт 53 и на перенаправьте их в приложение bind DNS.

Когда я проверяю разрешение имен с внешнего компьютера, оно не работает:

nslookup www.example.com <IP of the k8s master>
;; connection timed out; no servers could be reached

Я копаюсь в конфигурации k8s, журналах и т. д. c , и я нашел предупреждение в журналах kube-proxy :

ps auxw | grep kube-proxy
root     19984  0.0  0.2 141160 41848 ?        Ssl  Mar26  19:39 /usr/local/bin/kube-proxy --config=/var/lib/kube-proxy/config.conf --hostname-override=k8smaster

journalctl --since "2 days ago" | grep kube-proxy
<NOTHING RETURNED>

KUBEPROXY_FIRST_POD=`kubectl get pods -n kube-system -l k8s-app=kube-proxy -o go-template='{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}' | head -n 1`
kubectl logs -n kube-system ${KUBEPROXY_FIRST_POD}

I0326 22:26:03.491900       1 node.go:135] Successfully retrieved node IP: 91.121.XXX.XXX
I0326 22:26:03.491957       1 server_others.go:150] Using iptables Proxier.
I0326 22:26:03.492453       1 server.go:529] Version: v1.16.7
I0326 22:26:03.493179       1 conntrack.go:52] Setting nf_conntrack_max to 262144
I0326 22:26:03.493647       1 config.go:131] Starting endpoints config controller
I0326 22:26:03.493663       1 config.go:313] Starting service config controller
I0326 22:26:03.493669       1 shared_informer.go:197] Waiting for caches to sync for endpoints config
I0326 22:26:03.493679       1 shared_informer.go:197] Waiting for caches to sync for service config
I0326 22:26:03.593986       1 shared_informer.go:204] Caches are synced for endpoints config 
I0326 22:26:03.593992       1 shared_informer.go:204] Caches are synced for service config 
E0411 17:02:48.113935       1 proxier.go:927] can't open "externalIP for ingress-nginx/ingress-nginx:bind-udp" (91.121.XXX.XXX:53/udp), skipping this externalIP: listen udp 91.121.XXX.XXX:53: bind: address already in use
E0411 17:02:48.119378       1 proxier.go:927] can't open "externalIP for ingress-nginx/ingress-nginx:bind-tcp" (91.121.XXX.XXX:53/tcp), skipping this externalIP: listen tcp 91.121.XXX.XXX:53: bind: address already in use

Затем я ищу, кто уже использовал порт 53 ...

netstat -lpnt | grep 53
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      1682/systemd-resolv 
tcp        0      0 87.98.XXX.XXX:53        0.0.0.0:*               LISTEN      19984/kube-proxy    
tcp        0      0 169.254.25.10:53        0.0.0.0:*               LISTEN      14448/node-cache    
tcp6       0      0 :::9253                 :::*                    LISTEN      14448/node-cache    
tcp6       0      0 :::9353                 :::*                    LISTEN      14448/node-cache

Посмотрите на pro c 14448 / node-cache:

cat /proc/14448/cmdline 
/node-cache-localip169.254.25.10-conf/etc/coredns/Corefile-upstreamsvccoredns

Так что coredns уже обрабатывает порт 53, который является нормальным, потому что это внутренняя служба DNS k8s.

В документации по cornns (https://github.com/coredns/coredns/blob/master/README.md) они говорят о опции -dns.port для использования отдельного порта ... но когда я смотрю на kubespray (который имеет 3 шаблона jinja https://github.com/kubernetes-sigs/kubespray/tree/release-2.12/roles/kubernetes-apps/ansible/templates для создания карты конфигурации coredns, services et c. Аналогично https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/#coredns) все жестко запрограммировано с портом 53.

Итак, мой вопрос: есть ли Конфигурация / обходные пути для кластера k8s, чтобы я мог запустить свой собственный DNS-сервер и подключить его к порту 53?

Может быть?

  • Настроить каналы для использования порта, отличного от 53? Кажется сложным, и я действительно не уверен, что это имеет смысл!
  • Я могу настроить службу bind k8s для предоставления порта 5353 и настроить входной контроллер nginx для обработки этого порта 5353 и перенаправления на порт приложения 53 , Но для этого потребуется настроить iptables для маршрутизации внешних запросов DSN *, полученных через порт 53, на службу bind k8s через порт 5353? Какой будет конфигурация iptables (INPUT / PREROUTING или FORWARD)? Разве такая конфигурация сети сломала бы сердечки?

С уважением,

Крис

1 Ответ

0 голосов
/ 12 апреля 2020

Полагаю, ваш nginx адрес не работает должным образом. Вам нужен поставщик Load Balancer, такой как MetalLB , к вашему голому металлическому кластеру k8s для получения внешних соединений через порты, подобные 53. И вам не нужно nginx -адрес для использования с bind, просто измените * Введите 1003 * Service от ClusterIP до LoadBalancer и убедитесь, что вы получили внешний IP-адрес в этой службе. Ваша карта руля может помочь переключиться на LoadBalancer.

...