【问题标题】:Nginx ingress : Host based routing on TCP portNginx 入口:基于主机的 TCP 端口路由
【发布时间】:2021-12-13 11:56:34
【问题描述】:

对 Rabbitmq 5672 使用相同的 TCP 端口,并根据基于主机的路由将请求转移到不同的namespaces/rabbitmq_service

什么有效:

chart: nginx-git/ingress-nginx
version: 3.32.0
values:
  - tcp:
      5672: "cust1namespace/rabbitmq:5672"

在 nginx.conf 中反映的块:

server {
    preread_by_lua_block {
        ngx.var.proxy_upstream_name="tcp-cust1namespace-services-rabbitmq-5672";
    }
    listen                  :5672;
    proxy_pass              upstream_balancer;
}

注意:这会将所有来自端口 5672 的请求转移到 cust1namespace/rabbitmq:5672,而与客户端域名无关,并且我们希望基于域名的基于主机的路由。

预期:

chart: nginx-git/ingress-nginx
version: 3.32.0
values:
  - tcp:
      cust1domainname:5672: "cust1namespace/rabbitmq:5672"
      cust2domainname:5672: "cust2namespace/rabbitmq:5672"

错误:

Failed to render chart: exit status 1: Error: unable to build kubernetes objects from release manifest: error validating "": error validating data: [ValidationError(Service.spec.ports[3].port): invalid type for io.k8s.api.core.v1.ServicePort.port: got "string", expected "integer", ValidationError(Service.spec.ports[4].port): invalid type for io.k8s.api.core.v1.ServicePort.port: got "string", expected "integer"]

最终的 nginx.conf 应该如下所示:

server {
    preread_by_lua_block {
        ngx.var.proxy_upstream_name="tcp-cust1namespace-services-rabbitmq-5672";
    }
    listen                  cust1domainname:5672;
    proxy_pass              upstream_balancer;
}
    
server {
    preread_by_lua_block {
        ngx.var.proxy_upstream_name="tcp-cust2namespace-services-rabbitmq-5672";
    }
    listen                  cust2domainname:5672;
    proxy_pass              upstream_balancer;
}

【问题讨论】:

  • 发送到入口的rabbitmq 消息使用什么协议?我看到有some options

标签: nginx kubernetes kubernetes-helm kubernetes-ingress


【解决方案1】:

一点理论

由于网络协议实施和它们之间的差异,您尝试实施的方法是不可能的。

TCP 协议工作在传输层,它有源和目标 IP 和端口,它没有内部有任何主机信息。反过来,HTTP 协议在位于TCP 之上的应用层上工作,并且它确实具有有关此请求要发送到的主机的信息。

请熟悉OSI model and protocols which works on these levels。这将有助于避免任何混淆,为什么这种方式有效,而不是其他方式。

还有一个good answer on quora about difference between HTTP and TCP protocols

回答

此时你有两个选择:

  1. 使用入口在应用层工作,让它根据request body 中提供的主机将流量引导到服务。所有流量都应通过入口端点(通常是暴露在集群外部的负载均衡器)。

请查找示例

  1. 使用入口处理传输层并为每个服务/客户公开单独的 TCP 端口。在这种情况下,流量将通过入口直接传递到服务。

根据您的示例,它将如下所示:

chart: nginx-git/ingress-nginx
    version: 3.32.0
    values:
    - tcp:
        5672: "cust1namespace/rabbitmq:5672" # port 5672 for customer 1
        5673: "cust2namespace/rabbitmq:5672" # port 5673 for customer 2
        ...

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 2021-12-14
    • 1970-01-01
    • 2020-11-14
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    相关资源
    最近更新 更多