В настоящее время можно разрешить все службы по IP-адресам и телнету и пинговать их. Невозможно преобразовать пакеты в IP-адреса. Хотя можно искать IP-адреса модулей с помощью kubectl и telnet и пинговать их. Как мне нужно настроить DNS для разрешения подов в Kubernetes 1.9.6, dns-controller: 1.9.1.
Вы можете создать тестовый модуль с busybox
чтобы проверить функцию разрешения DNS и отладить проблему:
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
Проверьте /etc/resolv.conf
файл на busybox
Под:
kubectl exec busybox cat /etc/resolv.conf
Контент должен быть таким:
search default.svc.cluster.local svc.cluster.local cluster.local .....
nameserver 10.0.0.10
options ndots:5
Сделайте запрос поиска к целевому модулю в вашем кластере:
kubectl exec -ti busybox -- nslookup XXX-XX-XX-XX.default.pod.cluster.local
Если вам не удалось разрешить DNS-имя Pods, вы можете проверить журналы компонентов DNS с помощьюkubectl logs
команда:
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c kubedns
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c dnsmasq
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c healthz
Ответ @mk_sta немного проще для работы, вы можете запустить этот лайнер, чтобы проверить свой DNS:
kubectl run busybox --image=busybox --rm --attach --command -- sh -c "cat /etc/resolv.conf; nslookup $POD.$NAMESPACE.pod.cluster.local"
Пример вывода:
If you don't see a command prompt, try pressing enter.
Server: 100.64.0.10
Address: 100.64.0.10:53
*** Can't find $POD.$NAMESPACE.pod.cluster.local: No answer
deployment.apps "busybox" deleted
Бонус в том, что он удаляет развертывание / модули после запуска.
Для меня проблема заключалась в том, что мои поды находятся в наборе с отслеживанием состояния, и поэтому разрешение Pod DNS немного другое. Вы должны использовать (например):
web-{0..N-1}.nginx.default.svc.cluster.local
pod-N.$GOVERNING_STATEFULSET.$NAMESPACE.svc.cluster.local
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
Это единственное, что может пойти не так. Возможно, вы захотите предоставить дополнительную информацию о вашем конкретном случае.
Лучший способ, который я видел для решения этой проблемы, - это создание Jump Pod.
Шаг 1. Создайте модуль с файлом спецификации.
cat << ENDL >> jumpod.yml
apiVersion: v1
kind: Pod
metadata:
name: jumpod
namespace: default
spec:
containers:
- name: busybox
image: busybox:1.28
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
ENDL
Шаг 2. Ether примените или создайте модуль в кластере и на узле. Обратите внимание, что он будет расположен в пространстве имен по умолчанию.
kubectl apply -f jumpod.yml
Теперь вы можете использовать этот модуль для получения DNS модуля или службы.
Например:
Под nslookup Шаг 3. Получите IP-адрес модуля, который вы ищете.
kubectl get pods -o wide
Шаг 4. Используйте Jump Pod, чтобы выполнить nslookup.
kubectl exec -it jumpod ping 10.244.0.149
Сервис nslookup Шаг 5. Найдите IP-адрес службы, который вы можете использовать.
kubectl get services --all-namespaces
Шаг 6. Теперь используйте модуль перехода, чтобы выполнить nslookup по IP-адресу службы.
kubectl exec -it jumpod nslookup 10.245.150.103
Ниже приведен пример того, как основной кластер, использующий nslookup, не будет работать и как будет работать busybox (также известный как модуль перехода).
$ kubectl exec -it jumpod nslookup 10.245.150.103
Server: 10.245.0.10
Address 1: 10.245.0.10 kube-dns.kube-system.svc.cluster.local
Name: 10.245.150.103
Address 1: 10.245.150.103 hello.develop.svc.cluster.local
$ nslookup 10.245.150.103
Server: 8.8.8.8
Address: 8.8.8.8#53
** server can't find 103.150.245.10.in-addr.arpa: NXDOMAIN
Надеюсь это поможет!
P.S Если случайно вам нужно экспортировать DNS-файл, который вы создали в модуле, вы можете использовать его.
kubectl cp default/POD_NAME:bin/FILE_NAME /Users/username/FILE_NAME
или просто используйте>, чтобы экспортировать его в файл.