Назад | Перейти на главную страницу

Разрешение DNS под Kubernetes

В настоящее время можно разрешить все службы по 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

или просто используйте>, чтобы экспортировать его в файл.