Как получить IP-адрес модуля kubernetes путем запроса записей DNS srv?
Я пытаюсь создать задание kubernetes, внутри которого я буду запускать запросы "dig srv", чтобы выяснить IP-адрес всех модулей для любой конкретной службы, работающей в том же кластере.
Это достижимо?
Я хотел бы подробнее остановиться на постановке проблемы. В кластере уже запущено несколько служб. Требуется иметь инструмент, который может принимать имя службы и перечислять IP-адреса всех модулей, принадлежащих этой службе.
Я смог сделать это с помощью команд kubectl наряду с инструментами выбора и jq. Но по некоторым причинам я не могу запускать команды kubectl в этой среде.
Я хочу использовать dig srv
Запросы для разрешения IP-адресов для предоставленного имени службы.
2 ответа
Вы можете использовать автономный сервис (следовательно, нет ClusterIP и нет внутренней балансировки нагрузки). Если вы предоставите селектор, вы можете запросить записи A службы.
Смотрите: https://kubernetes.io/docs/concepts/services-networking/service/
Рассмотрим следующий пример:
Развертывание некоторых контейнеров:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16
ports:
- containerPort: 80
Для этого развертывания добавлен следующий безголовый сервис:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
Теперь это можно сделать с помощью DNS (внутри кластера).
$ kubectl run shell -i --rm --tty --restart=Never --image=busybox
# nslookup -type=A nginx
Server: 10.96.0.10
Address: 10.96.0.10:53
Name: nginx.default.svc.cluster.local
Address: 10.34.0.2
Name: nginx.default.svc.cluster.local
Address: 10.42.0.2
Name: nginx.default.svc.cluster.local
Address: 10.46.0.1
Все внутренние IP-адреса Pod возвращаются в виде записей DNS A.
Это объясняется в DNS для служб и модулей.
Каждой службе, определенной в кластере (включая сам DNS-сервер), присваивается имя DNS. По умолчанию список поиска клиентского модуля DNS включает собственное пространство имен модуля и домен кластера по умолчанию. Это лучше всего иллюстрируется примером:
Предположим, служба называется
foo
в пространстве имен Kubernetesbar
, Модуль работает в пространстве именbar
можно посмотреть этот сервис, просто выполнив запрос DNS дляfoo
, Модуль работает в пространстве именquux
можно посмотреть этот сервис, выполнив запрос DNS дляfoo.bar
,
Вот подробные документы для Обнаружения службы на основе DNS Kubernetes.
Что касается запроса POD
IP-адрес зависит, если spec.hostname
указано.
Если существует безголовая служба в том же пространстве имен, что и модуль, и с тем же именем, что и поддомен, то сервер KubeDNS кластера также возвращает запись A для полного имени хоста модуля. Например, заданный модуль с именем хоста, установленным на "
busybox-1
"И поддомен установлен на"default-subdomain
И безголовая служба под названием "default-subdomain
"В том же пространстве имен модуль будет видеть свое собственное полное доменное имя какbusybox-1.default-subdomain.my-namespace.svc.cluster.local
". DNS обслуживает запись A с этим именем, указывая на IP-адрес модуля. Обе стручкиbusybox1
" а также "busybox2
"Могут иметь свои отличные записи.Объект Endpoints может указывать
hostname
для любых адресов конечных точек, а также его IP.Примечание. Поскольку записи A не создаются для имен модулей,
hostname
требуется для создания записи модуля A. Стручок безhostname
но сsubdomain
создаст только запись A для безголового сервиса (default-subdomain.my-namespace.svc.cluster.local
), указывая на IP-адрес модуля. Кроме того, Pod должен быть готов, чтобы иметь запись, еслиpublishNotReadyAddresses=True
установлен на Сервисе.
Надеюсь, это объясняет достаточно.