Как получить 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 в пространстве имен Kubernetes bar, Модуль работает в пространстве имен 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 установлен на Сервисе.

Надеюсь, это объясняет достаточно.

Другие вопросы по тегам