Как получить IP-адрес модуля kubernetes путем запроса записей DNS srv? - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь создать задание kubernetes, внутри которого я буду запускать запросы "dig srv", чтобы узнать IP-адрес всех модулей для любой конкретной службы, работающей в том же кластере.

Это достижимо?

Я хотел бы подробнее остановиться на постановке проблемы. В кластере уже запущено несколько служб. Требуется иметь инструмент, который может принимать имя службы и перечислять IP-адреса всех модулей, принадлежащих этой службе.

Я смог сделать это, используя команды kubectl вместе с селектором и инструментами jq. Но по некоторым причинам я не могу запускать команды kubectl в этой среде.

Я хочу использовать dig srv запросы для разрешения IP-адресов модуля для предоставленного имени службы.

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Вы можете использовать безголовый сервис (следовательно, нет ClusterIP и нет внутренней балансировки нагрузки).Если вы предоставляете селектор, вы можете запросить записи A службы.

См .: https://kubernetes.io/docs/concepts/services-networking/service/#headless-services

Рассмотрим следующий пример:

Развертывание некоторых модулей:

---
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-адреса блоков возвращаются в виде записей DNS A.

0 голосов
/ 11 июня 2019

Это объясняется внутри DNS для служб и модулей .

Каждой службе, определенной в кластере (включая сам DNS-сервер), присваивается имя DNS. По умолчанию в список поиска DNS клиентского модуля будет входить собственное пространство имен модуля и домен кластера по умолчанию. Это лучше всего иллюстрируется на примере:

Предположим, что служба с именем foo находится в пространстве имен Kubernetes bar. Модуль, работающий в пространстве имен bar, может найти эту службу, просто выполнив DNS-запрос для foo. Модуль, работающий в пространстве имен quux, может найти эту службу, выполнив DNS-запрос для foo.bar.

Вот подробные документы для Обнаружение службы Kubernetes на основе DNS .

Что касается запроса IP-адреса POD, это зависит от того, указано ли 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 не создаются для имен модулей, для создания записи модуля A требуется hostname. Модуль без hostname, но с subdomain создаст только запись A для службы без наушников (default-subdomain.my-namespace.svc.cluster.local), указывающую на IP-адрес модуля. Кроме того, Pod должен быть готов, чтобы иметь запись, если на Сервисе не установлен publishNotReadyAddresses=True.

Надеюсь, этого достаточно.

...