首页 > 解决方案 > 按主机名的 Gloo TCP 代理

问题描述

使用 Gloo TCP Proxy 转发端口 27017 以便在 Kubernetes 集群中访问 MongoDB。

以下网关规范适用于将所有端口 27017 流量转发到指定的上游。

spec:
  bindAddress: '::'
  bindPort: 27017
  tcpGateway:
    tcpHosts:
      - destination:
          single:
            upstream:
              name: default-mongodb-27017
              namespace: gloo-system
        name: one
  useProxyProto: false

我想根据主机名转发 27017 流量(例如,d.db.example.com指向 Mongo 的 dev 实例并p.db.example.com指向 prod 实例)。

有没有办法指定主机名(比如在虚拟服务路由中)?

注意:这是一个教育模拟,因此不是真正的“生产”环境。这就是为什么 dev 和 prod 实例将存在于同一个 Kubernetes 集群中。这也是托管或外部 MongoDB 解决方案的原因未使用)

标签: kubernetesapi-gatewaygloo

解决方案


正如我在评论中提到的,据我所知,在网关中无法做到这一点,至少我在网关文档中找不到任何相关内容,但您可以配置虚拟服务以使其工作。

如文档中所述

VirtualService 是 Gloo 网关的根路由对象。虚拟服务描述要匹配一组域的一组路由。

它定义了: - 一组域 - 这些域的根路由集 - 服务器 TLS 终止的可选 SSL 配置 - VirtualHostOptions 将配置应用于 VirtualService 上的所有路由。

域在网关内的所有虚拟服务中必须是唯一的(即集合之间没有重叠)。

那里_

虚拟服务定义了一组路由规则,一个给定域或一组域的可选 SNI 配置。

Gloo 将根据请求的 Host 标头(在 HTTP 1.1 中)或 :authority 标头(HTTP 2.0)中指定的域选择适当的虚拟服务(路由集)。

虚拟服务支持通配符域(以 * 开头)。

如果用户不提供,Gloo 将为用户创建一个默认的虚拟服务。默认虚拟服务匹配 * 域,它将为任何不包含 Host/:authority 标头的请求或请求与另一个虚拟服务不匹配的域的请求提供路由。

为虚拟服务指定的每个域在提供给 Gloo 的所有虚拟服务集中必须是唯一的。

看看这个教程。

更具体地说,在这个示例中,他们使用 2 个域,echo.example.com 和 foxtrot.example.com,在您的情况下,这将d.db.example.comp.db.example.com

选项 2:跨域分离所有权

我们可能考虑的第一个替代方案是使用不同的域对每个服务进行建模,以便在不同的对象上管理路由。例如,如果我们的主域是 example.com,我们可以为每个子域创建一个虚拟服务:echo.example.com 和 foxtrot.example.com。

apiVersion: gateway.solo.io/v1
kind: VirtualService
metadata:
  name: echo
  namespace: echo
spec:
  virtualHost:
    domains:
      - 'echo.example.com'
    routes:
      - matchers:
          - prefix: /echo
---
apiVersion: gateway.solo.io/v1
kind: VirtualService
metadata:
  name: foxtrot
  namespace: foxtrot
spec:
  virtualHost:
    domains:
      - 'foxtrot.example.com'
...

我希望这有帮助。


推荐阅读