Предоставление конечной точки службы TCP K8s общедоступному Интернету без балансировщика нагрузки

Поэтому я работаю над проектом, который включает управление многими экземплярами postgres внутри кластера k8s. Каждый экземпляр управляется с помощью Stateful Set с Service для сетевого общения. Мне нужно разоблачить каждого Service в публичный интернет через DNS через порт 5432.

Наиболее естественным подходом здесь является использование K8S Load Balancer ресурс и что-то вроде внешнего dns для динамического сопоставления DNS-имени с конечной точкой балансировщика нагрузки. Это отлично подходит для многих типов услуг, но для баз данных существует одно серьезное ограничение: время простоя соединения. Максимальное время ожидания простоя AWS ELB составляет 4000 секунд. Существует много длительных аналитических запросов / транзакций, которые легко превышают это количество времени, не говоря уже о потенциально длительных операциях, таких как pg_restore,

Поэтому мне нужно какое-то решение, которое позволило бы мне обойти ограничения балансировки нагрузки. Node IPs не может быть и речи, так как мне понадобится порт 5432 выставляется для каждого экземпляра postgres в кластере. Ingress также кажется не совсем идеальным, поскольку это прокси 7-го уровня, который поддерживает только HTTP/HTTPS. Я видел обходные пути с nginx-ingress, включающие некоторые изменения в configmap, но я немного беспокоюсь о том, чтобы совершать подобные хаки для большого проекта. ExternalName интригующе, но даже если я смогу найти лучшую документацию по нему, я думаю, что в конечном итоге он может иметь такие же ограничения, как NodeIP,

Любые предложения будут ценны.

2 ответа

Внедрение контроллера входа Kubernetes Contour от Heptio может прокси TCP потоки, когда они заключены вTLS, Это необходимо для использованияSNIсообщение рукопожатия, чтобы направить соединение к правильному бэкэнд-сервису.

Контур может справитьсяingresses, но вводит дополнительно новый входной API IngressRoute, который реализуется черезCRD, Соединение TLS может быть разорвано в вашей бэкэнд- службе. IngressRoute может выглядеть так:

apiVersion: contour.heptio.com/v1beta1
kind: IngressRoute
metadata:
  name: postgres
  namespace: postgres-one
spec:
  virtualhost:
    fqdn: postgres-one.example.com
    tls:
      passthrough: true
  tcpproxy:
    services:
    - name: postgres
      port: 5432
  routes:
  - match: /
    services:
    - name: dummy
      port: 80

Прокси -сервер поддерживает tcp балансировку нагрузки. Вы можете посмотреть на ha-proxy как прокси и балансировщик нагрузки для базы данных postgres. он может поддерживать как tls, так и non tls соединения.

Другие вопросы по тегам