因此,我正在从事一个涉及在k8s集群中管理许多postgres实例的项目。使用Stateful Set
和Service
进行网络通信来管理每个实例。我需要通过端口5432上的DNS将每个Service
暴露给公共互联网。
这里最自然的方法是使用k8s Load Balancer
资源和类似external dns之类的东西将DNS名称动态映射到负载均衡器端点。这对许多类型的服务都非常有用,但是对于数据库而言,存在一个巨大的局限性:idle connection timeout。 AWS ELB的最大空闲超时限制为4000秒。有许多长时间运行的分析查询/事务很容易超过该时间量,更不用说诸如pg_restore
之类的可能长时间运行的操作了。
因此,我需要某种解决方案,使我能够解决负载均衡器的局限性。 Node IPs
是不可能的,因为我需要为群集中的每个postgres实例公开端口5432
。 Ingress
似乎也不理想,因为它是仅支持HTTP / HTTPS的第7层代理。我已经看到nginx-ingress的变通办法涉及一些configmap的骗子,但我有点担心要对大型项目进行此类黑客攻击。 ExternalName
很有趣,但是即使我可以找到更好的文档,我也认为它最终可能具有与NodeIP
类似的局限性。
任何建议将不胜感激。
答案 0 :(得分:2)
来自Heptio的Kubernetes入口控制器实现Contour可以proxy TCP
streams封装在TLS
中。使用SNI
握手消息将连接定向到正确的后端服务是必需的。
轮廓可以处理ingresses
,但还引入了一个新的入口API IngressRoute,该API通过CRD
实现。 TLS连接可以是terminated at your backend服务。 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
答案 1 :(得分:0)
ha代理支持tcp负载平衡。您可以将ha-proxy视为postgres数据库的代理和负载平衡器。它可以同时支持tls和非tls连接。