Рейтинг:1

Как создать службу Kubernetes, которая направляет трафик на разные модули в зависимости от порта?

флаг ng

Я хотел бы иметь службу типа LoadBalancer, которая указывает на nginx на порту 80 и указывает на отдельный модуль sshd для порта 22. Однако я не могу маршрутизировать на основе порта с помощью одного селектора.

Вариант использования, который я собираюсь использовать, аналогичен github.com, который принимает трафик на github.com для порта 80, а также 22 для трафика ssh. Таким образом, в этом случае DNS будет указывать на набор балансировщиков нагрузки k8s, которые, как я полагаю, будут маршрутизироваться к соответствующим модулям для каждого порта.Так что, если я пойду по неправильному пути, дайте мне знать. Я открыт для других решений.

Чего я хотел бы избежать, так это настройки отдельного модуля, такого как HAProxy, который маршрутизируется для каждого порта.

Я рассматривал возможность использования Ingress, но это только для HTTP-трафика.

Ingress не предоставляет произвольные порты или протоколы. Для предоставления доступа к службам, отличным от HTTP и HTTPS, в Интернете обычно используется служба типа Service.Type=NodePort или Service.Type=LoadBalancer.

https://kubernetes.io/docs/concepts/services-networking/ingress/

mozello avatar
флаг cn
Привет, Мэтт, не могли бы вы исправить свою фразу «Однако я не могу маршрутизировать на основе порта с одним селектором»? Что такое 'ж/'?
mozello avatar
флаг cn
Знаете ли вы, что Kubernetes Ingress может открывать порты TCP, как описано [здесь] (https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/)? Как вы настроили свой кластер k8s (облачный провайдер или локальный)? Какую версию k8s вы используете?
флаг ng
@ИванМ. В настоящее время я запускаю это локально, используя вид, который находится в kubernetes v1.23.3. Чтобы заставить LoadBalancer работать, я использую metallb. Однако позвольте мне проверить эту ссылку. Я вижу, что контроллер nginx расширяет контроллер входа kubernetes по умолчанию.
Рейтинг:1
флаг cn

Чего я хотел бы избежать, так это настройки отдельного модуля, такого как HAProxy, который маршрутизируется для каждого порта.

Вам не нужно настраивать такой отдельный Pod.

Kubernetes Ingress по умолчанию не поддерживает сервисы TCP или UDP. Но, например, вход-nginx контроллер предоставляет механизм для поддержки TCP или UDP на разных портах. Вы можете открыть порты TCP или UDP, изменив ConfigMaps.

По этой причине этот контроллер Ingress использует флаги «--tcp-services-configmap» и «--udp-services-configmap», чтобы указать на существующую карту конфигурации, где ключом является используемый внешний порт, а значение указывает сервис для предоставления с использованием формата:

<пространство имен/имя службы>:<порт службы>:[ПРОКСИ]:[ПРОКСИ]

Проверить дополнительную информацию здесь.

Такой ConfigMap уже должен быть доступен перед развертывание Ingress Controller.

Итак, попробуйте:

1. Создайте ConfigMap со следующей конфигурацией службы TCP.

$ cat вход-nginx-tcp.yml
апиВерсия: v1
вид: карта конфигурации
метаданные:
  имя: вход-nginx-tcp
  пространство имен: по умолчанию  
данные:
  "22": целевое пространство имен/целевая служба: 22

2. Направьте контроллер Ingress на эту ConfigMap с помощью --tcp-сервисы-configmap флаг в конфигурации следующим образом:

$ kubectl получить развертывание ingress-nginx-controller -o yaml
apiVersion: приложения/v1
вид: развертывание
метаданные:
  имя: входной-nginx-контроллер
  пространство имен: по умолчанию
спецификация:
...
  шаблон:
...
    спецификация:
      контейнеры:
      - аргументы:
        - /nginx-вход-контроллер
        --tcp-services-configmap=$(POD_NAMESPACE)/вход-nginx-tcp
...

3. Откройте порт 22 в службе, определенной для Ingress, следующим образом:

$ kubectl получить svc ingress-nginx-controller -o yaml 
апиВерсия: v1
вид: сервис
метаданные:
  имя: входной-nginx-контроллер
  пространство имен: по умолчанию
спецификация:
  порты:
  - имя: TCP-22
    порт узла: 30957
    порт: 22
    протокол: TCP
    целевой порт: 22
...
  тип: LoadBalancer
...

Вы можете определить любое количество портов, которые могут быть открыты с помощью этого метода.

Есть еще один вариант для тех, кто использует диаграмма управления ingress-nginx. Большая часть конфигурации уже сделана, и вам просто нужно указать свои порты в TCP такой раздел:
TCP: 
  2222: "по умолчанию/пример-tcp-svc:22"

куда 2222 открытый порт и 22 является служебным портом.

Рейтинг:0
флаг ng

Благодаря @Ivan M., который указал мне правильное направление, я просто хочу добавить сюда пример кода решения:

Прежде всего, сбивает с толку то, что документация kubernetes ведет меня по неправильному пути, думая, что вы не можете использовать вход для трафика, отличного от http. Вам нужно знать, что вы можете использовать другой входной контроллер. С входным контроллером nginx вы можете проксировать произвольный трафик TCP или даже UDP.

Второе препятствие заключается в том, что для входа nginx существует два отдельных репозитория. Это:

В итоге я использовал контроллер kubernetes/ingress-nginx.

nginx-значения.yaml

контроллер:
  оказание услуг:
    включитьHttp: правда

TCP:
  "22": "другое пространство имен/имя службы: 22"

Затем у нас есть установка руля

репозиторий helm добавить ingress-nginx https://kubernetes.github.io/ingress-nginx
обновление репозитория шлема
helm -n nginx -f nginx-values.yaml установить ingress-nginx ingress-nginx/ingress-nginx

Затем я устанавливаю Ingress в k8s. Обратите внимание на ingressClassName

вход.yaml

Версия API: networking.k8s.io/v1
вид: Вход
метаданные:
  имя: мой вход
  пространство имен: nginx
спецификация:
  ingressClassName: nginx
  по умолчаниюБэкэнд:
    оказание услуг:
      имя: мой http-сервис
      порт:
        номер: 80

А потом ты убей этого плохого мальчика

kubectl применить -f ingress.yaml

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.