Как я могу предоставить не-HTTP, TCP-сервисы в Kubernetes? - PullRequest
7 голосов
/ 11 октября 2019

Я использую кластер Kubernetes в общедоступном облаке (Azure / AWS / Google Cloud) и у меня есть некоторые не-HTTP-сервисы, которые я хотел бы предоставить пользователям.

Для HTTP-сервисов,Обычно я бы использовал ресурс Ingress для публичного предоставления этой службы через адресуемую запись DNS.

Для не-HTTP, служб на основе TCP (например, для базы данных, такой как PostgreSQL), как я должен предоставлять их для общего доступапотребление?

Я подумал об использовании NodePort сервисов, но для этого необходимо, чтобы сами узлы были общедоступными (полагаясь на kube-proxy для маршрутизации на соответствующий узел). Я бы предпочел избегать этого, если это возможно.

LoadBalancer сервисы кажутся другим вариантом, хотя я не хочу создавать выделенный балансировщик нагрузки облака для каждой службы TCP, которую я хочу

Мне известно, что контроллер входа NGINX поддерживает предоставление служб TCP и UDP , но для этого требуется статическое определение служб, которые вы хотите предоставить. В моем случае использования эти службы создаются и уничтожаются динамически, поэтому невозможно заранее определить эти сопоставления служб в статическом ConfigMap.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Может быть, этот рабочий процесс может помочь:

(я предполагаю, что провайдером облака является AWS)

  • Консоль AWS: Созданиевыделите VPC и создайте свои экземпляры Kubernetes ec2 (или группу автоматического масштабирования), отключив создание общедоступных IP-адресов. Это делает невозможным доступ к экземпляру из Интернета, вы все равно можете получить доступ через частный IP (например, 172.30.1.10) через VPN сайта 2 сайта или через вторичный экземпляр ec2 в том же VPC с публичным IP.

  • Kubernetes: Создание службы с фиксированным портом узла (например, 35432 для Postgres).

  • AWSconsole: создайте Классический o Layb 4 Loadblancer внутри того же VPC ваших узлов, на вкладке Listeners откройте порт 35432 (и другие порты, которые вам могут понадобиться), указывая на один или все ваши узлы через «Целевую группу». ». В количестве портов плата не взимается.

На данный момент я не знаю, как автоматизировать обновление текущих живых узлов в целевой группе балансировщика нагрузки, возможно, это может быть проблемой с функциями автоматического масштабирования, если таковые имеются. ... Может быть, работа Cron с bash-скриптом, извлекающим информацию из AWS API и обновляющим Target Group?

0 голосов
/ 12 октября 2019

Для не-HTTP, служб на основе TCP (например, для базы данных, такой как PostgreSQL), как мне выставить их для общего пользования?

Ну, это зависит от того, как вы ожидаетеконечный пользователь адрес эти услуги? Как вы указали, с Ingress можно использовать виртуальный хостинг для маршрутизации всех запросов к одному и тому же контроллеру Ingress, а затем использовать заголовок Host: для отправки внутри кластера.

Со службой TCP, например PostgreSQL, такого заголовка нет. Таким образом, вам обязательно нужно будет использовать механизм на основе IP или назначить каждому выделенный порт на вашем IP-адресе, подключенном к Интернету

Если ваши клиенты знают IPv6, назначение каждой службы выделенного IP-адреса является абсолютно разумным. , учитывая абсолютно массивное пространство IP, которое предлагает IPv6. Но в противном случае вам нужно повернуть две ручки: IP и порт.

Оттуда то, как вы перенаправите эти соединения в пределах вашего кластера на нужную службу, будет зависеть от того, как вы решили первую проблему

...