Я настроил кластер 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)? Разве такая конфигурация сети сломала бы сердечки?
С уважением,
Крис