【问题标题】:How do I expose non-HTTP, TCP services in Kubernetes?如何在 Kubernetes 中公开非 HTTP、TCP 服务?
【发布时间】:2020-02-09 00:24:13
【问题描述】:

我在公共云(Azure/AWS/Google Cloud)中运行 Kubernetes 集群,并且我想向用户公开一些非 HTTP 服务。

对于 HTTP 服务,我通常会使用 Ingress 资源通过可寻址的 DNS 条目公开该服务。

对于非 HTTP、基于 TCP 的服务(例如,PostgreSQL 等数据库),我应该如何公开这些服务以供公众使用?

我考虑使用NodePort 服务,但这要求节点本身可以​​公开访问(依靠kube-proxy 路由到适当的节点)。如果可能的话,我宁愿避免这种情况。

LoadBalancer 服务似乎是另一种选择,尽管我不想为我想要公开的每个 TCP 服务创建一个专用的云负载均衡器。

我知道NGINX Ingress controller supports exposing TCP and UDP services,但这似乎需要对您要公开的服务进行静态定义。对于我的用例,这些服务是动态创建和销毁的,因此无法在静态 ConfigMap 中预先定义这些服务映射。

【问题讨论】:

    标签: networking kubernetes tcp cloud


    【解决方案1】:

    也许这个工作流程可以提供帮助:

    (我假设云提供商是 AWS)

    • AWS 控制台: 创建一个隔离的 VPC 并创建您的 Kubernetes ec2 实例(或自动扩展组),禁用公共 IP 的创建。这使得无法从 Internet 访问实例,您仍然可以通过 Site 2 Site VPN 或通过具有公共 IP 的同一 VPC 中的辅助 ec2 实例通过私有 IP(例如 172.30.1.10)访问。

    • Kubernetes:使用固定 NodePort 创建服务(例如 Postgres 为 35432)。

    • AWS 控制台: 在节点的同一 VPC 内创建一个 Classic o 第 4 层负载平衡器,在“侦听器”选项卡中打开指向的端口 35432(以及您可能需要的其他端口)通过“目标组”您的一个或所有节点。端口数量不收费。

    此时,我不知道如何自动更新负载均衡器目标组中的当前活动节点,这可能是自动缩放功能的问题,如果有的话......也许是一个 Cron 作业bash 脚本从 AWS API 中提取信息并更新目标组?

    【讨论】:

    • 谢谢 - 这很有帮助。尽管显然这不是任何 Kubernetes 环境的通用解决方案,并且与选择的云提供商紧密相关。也许Operator 可能非常适合隐藏所选云提供商详细信息的解决方案?
    【解决方案2】:

    对于非 HTTP、基于 TCP 的服务(例如,PostgreSQL 等数据库),我应该如何公开这些服务以供公众使用?

    嗯,这取决于您希望最终用户如何处理这些服务?正如您所指出的,使用 Ingress,可以使用虚拟主机将所有请求路由到同一个 Ingress 控制器,然后使用 Host: 标头在集群内调度。

    对于 TCP 服务,例如 PostgreSQL,没有这样的标头。因此,您必须要么拥有基于 IP 的机制,要么在面向 Internet 的 IP 上为每个人分配一个专用端口

    如果您的客户能够识别 IPv6,那么为每个服务分配一个专用 IP 地址是绝对合理的,因为 IPv6 提供了绝对巨大的 IP 空间。但除此之外,您需要转动两个旋钮:IP 和端口。

    从那里开始,您如何将集群内的这些连接路由到正确的服务将取决于您如何解决第一个问题

    【讨论】:

    • 感谢您的回答。我了解每个服务都公开了自己独特的端口。我的问题是当前的 Kubernetes 服务类型似乎不适合我的用例。 NodePorts 需要公开打开节点上的端口,从安全角度来看这并不理想。每个服务的 LoadBalancer 很昂贵。假设我可以正确路由到主机,我应该使用哪个 Kubernetes 服务来使这些服务可公开连接,尤其是在动态启动和关闭这些服务时?
    猜你喜欢
    • 2021-01-21
    • 2019-01-10
    • 1970-01-01
    • 2020-04-07
    • 2020-03-19
    • 2021-12-21
    • 2019-01-04
    • 2018-08-19
    • 2019-09-26
    相关资源
    最近更新 更多