Как настроить сервис kubernetes для случайных портов? - PullRequest
0 голосов
/ 19 октября 2018

Сценарии кажутся тупиковыми:

  • сервер прослушивает hostname:0, где имя хоста настраивается.0 означает случайный порт, который определяется после запуска программы.Приложение не позволяет устанавливать статический порт.
  • клиенты подключаются к серверу, используя hostname:actual_port

Дилемма:

Если hostname равно "localhost "или" 0.0.0.0 ", клиенты не могут подключиться, чтобы сказать:" 0.0.0.0:42187 "(приложение не позволяет настраивать адрес на стороне клиента).

Если вы создаете службу, скажем myservice, и задаете имя службы как hostname, вам необходимо указать порт pod для создания службы.Поскольку порт является случайным, вам нужно подождать после запуска модуля, чтобы получить порт.Но вам нужно установить имя хоста до запуска модуля!Если вы заранее создаете службу с определенным портом, скажем, 42131, модуль не запускается с ошибкой «не удалось привязаться к myservice / 10.100.28.248: 0», если только программа не выделяет один и тот же порт службы.


Заключение

Я думаю, что случайный порт для службы не имеет никакого смысла.Проблема с самим приложением, а не k8s.Возникла проблема с приложением на github (https://github.com/spark-jobserver/spark-jobserver/issues/1122).

1 Ответ

0 голосов
/ 19 октября 2018

Существует 3 способа обнаружения службы в Kubernetes ClusterIP , NodePort и LoadBalancer .В вашем сценарии это порт узла, где служба, работающая внутри модуля, доступна, сопоставляется с портом хоста через службу.Аналогия - это модуль, в котором работает ваш сервис, который мы назвали TargetPort, и именно там сервис перенаправляет все запросы.Сервисный порт называется просто Port.Сервис - это просто оболочка внутри узла в кластере, который имеет собственный IP-адрес.Наконец, у нас есть порт на узле, откуда мы можем получить доступ к приложению извне, который называется NodePort и имеет допустимый диапазон.По умолчанию диапазон составляет 30000-32767

my-service.yml

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  ports:
   - targetPort: 80
     port: 80
     nodePort: 32001

. Как мы можем понять из приведенного выше файла описания службы, я определил тип как NodePort и 3 порта, описанных выше.Единственный обязательный порт - это порт, т.е. порт службы port:80 в приведенном выше yml.Если вы не предоставляете targetPort, предполагается, что он совпадает с портом службы.И, если вы не предоставите NodePort, свободный порт в допустимом диапазоне (30000-32767) будет выделен автоматически.Я надеюсь, что это поможет вам решить вашу дилемму.Спасибо.

...