繁体   English   中英

Nginx 入口:TCP 端口上基于主机的路由

[英]Nginx ingress : Host based routing on TCP port

为 Rabbitmq 5672 使用相同的 TCP 端口,并根据基于主机的路由将请求传输到不同的命名空间/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"

错误:无法呈现图表:退出状态 1:错误:无法从发布清单构建 kubernetes 对象:错误验证“”:错误验证数据:[ValidationError(Service.spec.ports[3].port):io 类型无效.k8s.api.core.v1.ServicePort.port:得到“字符串”,预期为“整数”,ValidationError(Service.spec.ports[4].port):io.k8s.api.core.v1 的无效类型。 ServicePort.port:得到“字符串”,应为“整数”]

最终的 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;
}

一点理论

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

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

请熟悉适用于这些级别的 OSI 模型和协议 这将有助于避免任何混淆为什么以这种方式工作而不是其他方式。

在 quora 上也有一个关于 HTTP 和 TCP 协议之间差异很好的答案

回答

此时你有两个选择:

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

请查找示例

  1. 使用 ingress 在传输层上工作并为每个服务/客户公开单独的 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
        ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM