簡體   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