Я развернул кластер Kubernetes, состоящий из мастера и двух рабочих, использующих kubeadm
и сетевой драйвер Flannel (поэтому я передал --pod-network-cidr=10.244.0.0/16
флаг kubeadm init
).
Эти узлы взаимодействуют друг с другом с помощью VPN, чтобы:
- IP-адрес главного узла - 10.0.0.170
- IP-адрес рабочего 1: 10.0.0.247
- IP-адрес рабочего 2: 10.0.0.35
Когда я создаю новый модуль и пытаюсь выполнить ping-запрос в Google, у меня возникает следующая ошибка:
/ # ping google.com
ping: bad address 'google.com'
Я выполнил инструкции на странице документации Kubernetes DNS debugging Resolution :
$ kubectl exec -ti busybox -- nslookup kubernetes.default
Server: 10.96.0.10
Address 1: 10.96.0.10
nslookup: can't resolve 'kubernetes.default'
command terminated with exit code 1
Сначала проверьте локальную конфигурацию DNS
$ kubectl exec busybox cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local invalid
options ndots:5
Проверьте, работает ли модуль DNS
$ kubectl get pods --namespace=kube-system -l k8s-app=kube-dns
NAME READY STATUS RESTARTS AGE
coredns-5c98db65d4-cqzb7 1/1 Running 0 7d18h
coredns-5c98db65d4-xc5d7 1/1 Running 0 7d18h
Проверьте наличие ошибок в модуле DNS
$ for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name); do kubectl logs --namespace=kube-system $p; done
.:53
2019-10-28T13:40:41.834Z [INFO] CoreDNS-1.3.1
2019-10-28T13:40:41.834Z [INFO] linux/amd64, go1.11.4, 6b56a9c
CoreDNS-1.3.1
linux/amd64, go1.11.4, 6b56a9c
2019-10-28T13:40:41.834Z [INFO] plugin/reload: Running configuration MD5 = 5d5369fbc12f985709b924e721217843
.:53
2019-10-28T13:40:42.870Z [INFO] CoreDNS-1.3.1
2019-10-28T13:40:42.870Z [INFO] linux/amd64, go1.11.4, 6b56a9c
CoreDNS-1.3.1
linux/amd64, go1.11.4, 6b56a9c
2019-10-28T13:40:42.870Z [INFO] plugin/reload: Running configuration MD5 = 5d5369fbc12f985709b924e721217843
Служба DNS работает?
$ kubectl get svc --namespace=kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 7d18h
Доступны ли конечные точки DNS?
$ kubectl get ep kube-dns --namespace=kube-system
NAME ENDPOINTS AGE
kube-dns 10.244.0.3:53,10.244.0.4:53,10.244.0.3:53 + 3 more... 7d18h
Принимаются / обрабатываются DNS-запросы?
Я обновил coredns ConfigMap, снова выполнил команду nslookup kubernetes.default
и вот результат:
$ for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name); do kubectl logs --namespace=kube-system $p; done
.:53
2019-10-28T13:40:41.834Z [INFO] CoreDNS-1.3.1
2019-10-28T13:40:41.834Z [INFO] linux/amd64, go1.11.4, 6b56a9c
CoreDNS-1.3.1
linux/amd64, go1.11.4, 6b56a9c
2019-10-28T13:40:41.834Z [INFO] plugin/reload: Running configuration MD5 = 5d5369fbc12f985709b924e721217843
[INFO] Reloading
2019-11-05T08:12:12.511Z [INFO] plugin/reload: Running configuration MD5 = 906291470f7b1db8bef629bdd0056cad
[INFO] Reloading complete
2019-11-05T08:12:12.608Z [INFO] 127.0.0.1:55754 - 7434 "HINFO IN 4808438627636259158.5471394156194192600. udp 57 false 512" NXDOMAIN qr,rd,ra 132 0.095189791s
.:53
2019-10-28T13:40:42.870Z [INFO] CoreDNS-1.3.1
2019-10-28T13:40:42.870Z [INFO] linux/amd64, go1.11.4, 6b56a9c
CoreDNS-1.3.1
linux/amd64, go1.11.4, 6b56a9c
2019-10-28T13:40:42.870Z [INFO] plugin/reload: Running configuration MD5 = 5d5369fbc12f985709b924e721217843
[INFO] Reloading
2019-11-05T08:12:47.988Z [INFO] plugin/reload: Running configuration MD5 = 906291470f7b1db8bef629bdd0056cad
[INFO] Reloading complete
2019-11-05T08:12:48.004Z [INFO] 127.0.0.1:51911 - 60104 "HINFO IN 4077052818408395245.3902243105088660270. udp 57 false 512" NXDOMAIN qr,rd,ra 132 0.016522153s
Похоже, что DNS-модули получают запросы.
Но у меня уже была эта ошибка!
Эта ошибка случилась со мной при первом развертывании кластера.
В то время я заметил, что kubectl get nodes -o wide
показывает общедоступный IP-адрес рабочего узла как «ВНУТРЕННИЙ-IP» вместо частного.
Заглянув дальше, я обнаружил, что на рабочих узлах kubelet отсутствовал флаг --node-ip
, поэтому я добавил его и перезапустил Kubelet, и проблема исчезла. Затем я пришел к выводу, что причиной был отсутствующий флаг, но, похоже, это не так, поскольку команда kubectl get nodes -o wide
показывает внутренние IP-адреса как «ВНУТРЕННИЙ-IP» для рабочих.
И сейчас
IP-адрес DNS-сервера 10.96.0.10 мне кажется неправильным, и я не могу пропинговать его из модуля. Модули DNS имеют IP-адреса 10.244.0.3 и 10.244.0.4, которые я тоже не могу пропинговать.
Я просто попытался удалить модули coredns, чтобы они снова были запланированы, и теперь их IP-адреса изменились, я могу пропинговать их из модуля, и kubectl exec -ti busybox -- nslookup kubernetes.default
работает:
$ kubectl exec -ti busybox -- nslookup kubernetes.default
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
Но в resolv.conf
файле все еще есть "недействительный" внутри:
$ kubectl exec busybox cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local invalid
options ndots:5
- Кто-нибудь может объяснить мне, что произошло, пожалуйста?
- А как я могу решить этот "недействительный" из
resolv.conf
файла?