Обнаружение службы Kube-dns не может обнаружить номер порта службы - PullRequest
0 голосов
/ 20 января 2019

Я использую обнаружение служб на основе DNS для обнаружения служб в кластере K8s.Из этой ссылки очень ясно, что для обнаружения службы с именем my-service мы можем выполнить поиск по имени "my-service.my-ns", и модуль сможет найти службы.

Однако в случае обнаружения порта для службы, решение, которое нужно использовать, это "_http._tcp.my-service.my-ns", где

_http относится к порту с именем http в my-service.

Но даже после использования _http._tcp.my-service он не разрешает номер порта.Ниже приведена подробная информация.

my-service, которую необходимо обнаружить

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-service
  ports:
    - name: http
      protocol: TCP
      port: 5000
      targetPort: 5000

фрагмент клиентского сервиса yaml, пытающийся обнаружить my-service и егопорт.

spec:
  containers:
  - name: client-service
    image: client-service
    imagePullPolicy: Always
    ports:
      - containerPort: 7799
    resources:
      limits:
        cpu: "100m"
        memory: "500Mi"
    env:
    - name: HOST
      value: my-service
    - name: PORT
      value: _http._tcp.my-service

Теперь, когда я делаю запрос, он терпит неудачу и регистрирует следующий запрос, который явно неверен, так как не находит номер порта.

 http://my-service:_http._tcp.my-service

Яне знаю, что я здесь не так делаю, но я следую инструкциям, упомянутым в документе.

Может кто-нибудь подсказать, что здесь не так и как мы можем обнаружить порт с помощью обнаружения службы на основе DNS?Правильно ли мое понимание здесь, что оно вернет буквальное значение порта?

Сведения о кластере

Версия кластера K8s - 1.11.5-gke.5 и Kube-dnsработает

Дополнительные сведения, пытающиеся обнаружить службу из busybox, но не удается определить значение порта 5000

kubectl exec  busybox -- nslookup my-service
Server:         10.51.240.10
Address:        10.51.240.10:53

Name:   my-service.default.svc.cluster.local
Address: 10.51.253.236

*** Can't find my-service.svc.cluster.local: No answer
*** Can't find my-service.cluster.local: No answer
*** Can't find my-service.us-east4-a.c.gdic-infinity-dev.internal: No answer
*** Can't find my-service.c.gdic-infinity-dev.internal: No answer
*** Can't find my-service.google.internal: No answer
*** Can't find my-service.default.svc.cluster.local: No answer
*** Can't find my-service.svc.cluster.local: No answer
*** Can't find my-service.cluster.local: No answer
*** Can't find my-service.us-east4-a.c.gdic-infinity-dev.internal: No answer
*** Can't find my-service.c.gdic-infinity-dev.internal: No answer
*** Can't find my-service.google.internal: No answer


kubectl exec  busybox -- nslookup _http._tcp.my-service
Server:         10.51.240.10
Address:        10.51.240.10:53

** server can't find _http._tcp.my-service: NXDOMAIN

*** Can't find _http._tcp.my-service: No answer

1 Ответ

0 голосов
/ 21 января 2019

Поскольку службы поставляются со своими собственными (внутренними по Kubernetes) IP-адресами, простой ответ здесь - не выбирать произвольные порты для служб.Измените значение port: 80 в определении службы, и клиенты смогут получить к нему доступ через порт HTTP по умолчанию.Когда вы устанавливаете переменную среды, установите

- name: PORT
  value: "80"

DNS поддерживает несколько различных типов записей;например, запись A преобразует имя хоста в его адрес IPv4, а AAAA - в адрес IPv6.В документации Kubernetes Service вы цитируете заметки (выделено мной)

вы можете выполнить DNS SRV запрос ..., чтобы узнать номер порта для "http".

Хотя SRV-записи похоже, что они решают обе половины этой проблемы (они предоставляют порт и имя хоста для службы), на практике они, похоже, используются довольно мало.На связанной странице Википедии есть список служб, которые ее используют, но «подключиться к тому, на что указывает эта запись SRV», не вариант в известных TCP-клиентах, о которых я знаю.

Вы должны иметь возможностьпроверьте это с помощью команды типа (запускает этот отладочный образ )

kubectl run debug --rm -it --image giantswarm/tiny-tools sh
# dig -t srv _http._tcp.my-service

(но обратите внимание на аргумент -t srv; это не тип записи по умолчанию.)

Большинство вещей, которые ожидают переменную окружения PORT или аналогичную, ожидают число или, если нет, имя, которое они могут найти в файле /etc/services.Синтаксис, который вы пытаетесь использовать здесь и вместо этого задаете DNS-имя SRV, вероятно, просто не будет работать, если вы не знаете, что конкретное программное обеспечение его поддерживает.

...