Предоставление конечной точки службы 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 соединения.