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

3

使用相同的TCP端口号5672用于Rabbitmq,并基于主机路由将传输请求转发到不同的命名空间/ 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消息使用哪种协议?我看到有一些选项 - moonkotte
1个回答

1

一些理论

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

TCP 协议工作在传输层,它有源IP、目标IP和端口,但没有任何主机信息。而 HTTP 协议工作在应用层,位于 TCP 上面,它有关于请求要发送到哪个主机的信息。

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

此外,quora 上有一个很好的回答,介绍了 HTTP 和 TCP 协议的区别

答案

在这一点上,您有两个选择:

  1. 使用 ingress 在应用层工作,并让它根据 请求体 中呈现的主机将流量定向到服务。所有流量都应通过 ingress 端点(通常是暴露在集群外部的负载均衡器)。

请查看以下示例:

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

根据您的示例,它看起来像:

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
        ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接