在没有负载均衡器的情况下将K8s TCP服务端点公开到公共Internet

时间:2019-02-21 17:19:08

标签: amazon-web-services kubernetes

因此,我正在从事一个涉及在k8s集群中管理许多postgres实例的项目。使用Stateful SetService进行网络通信来管理每个实例。我需要通过端口5432上的DNS将每个Service暴露给公共互联网。

这里最自然的方法是使用k8s Load Balancer资源和类似external dns之类的东西将DNS名称动态映射到负载均衡器端点。这对许多类型的服务都非常有用,但是对于数据库而言,存在一个巨大的局限性:idle connection timeout。 AWS ELB的最大空闲超时限制为4000秒。有许多长时间运行的分析查询/事务很容易超过该时间量,更不用说诸如pg_restore之类的可能长时间运行的操作了。

因此,我需要某种解决方案,使我能够解决负载均衡器的局限性。 Node IPs是不可能的,因为我需要为群集中的每个postgres实例公开端口5432Ingress似乎也不理想,因为它是仅支持HTTP / HTTPS的第7层代理。我已经看到nginx-ingress的变通办法涉及一些configmap的骗子,但我有点担心要对大型项目进行此类黑客攻击。 ExternalName很有趣,但是即使我可以找到更好的文档,我也认为它最终可能具有与NodeIP类似的局限性。

任何建议将不胜感激。

2 个答案:

答案 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连接。