[英]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 協議之間差異的很好的答案。
此時你有兩個選擇:
request body
中呈現的主機將流量引導到服務。 所有流量都應該通過入口端點(通常是暴露在集群外部的負載均衡器)。請查找示例
根據您的示例,它將如下所示:
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.