В настоящее время могу разрешить все службы в IP-адреса и telnet и пинговать их. Не могу разрешить pods в IP-адреса. Хотя могу искать IP-адреса pod с помощью kubectl и telnet и пинговать их. Как мне настроить DNS для разрешения pods в Kubernetes 1.9.6, dns-controller:1.9.1.
решение1
С ответом @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 находятся в statefulset и поэтому разрешение DNS Pod немного отличается. Вам нужно использовать (например):
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/
Это то, что может пойти не так. Возможно, вам захочется предоставить больше информации о вашем конкретном случае.
решение2
Вы можете создать тестовый Pod, 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
Pod:
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
Сделайте запрос на поиск целевого Pod в вашем кластере:
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
решение3
Лучший способ решения этой проблемы, который я видел, — это создание 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. Эфир примените или создайте pod в кластере и на узле. Обратите внимание, что он будет расположен в пространстве имен по умолчанию.
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. Теперь используйте Jump Pod, чтобы выполнить nslookup по IP-адресу службы.
kubectl exec -it jumpod nslookup 10.245.150.103
Ниже приведен пример того, как основной кластер, использующий nslookup, не будет работать и как будет работать busybox (он же jump pod).
$ 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
или просто используйте >, чтобы экспортировать его в файл.