如何通过一个负载均衡器暴露多个 TCP Server
How to expose multiple TCP Servers through one load balancer
我有多个部署 运行 pods 运行 TCP 服务器。这些 TCP 服务器全部监听端口 9999
目前每个部署都有自己的负载均衡器服务,这导致每个部署都有不同的 IP。
不过我希望有一个 IP 地址来公开部署,并且只通过端口区分。
例如:
<public-ip>:9001 -> deployment 1
<public-ip>:9002 -> deployment 2
<public-ip>:9003 -> deployment 3
我读过有关 Ingress 的内容,但 docs 声明
An Ingress does not expose arbitrary ports or protocols. Exposing services other than HTTP and HTTPS to the internet typically uses a service of type Service.Type=NodePort or Service.Type=LoadBalancer.
所以这似乎不是一个选择。
对于上下文,kubernetes 托管在 vnet 中的 azure 中,只需要从该 vnet 中访问。
功能入口取决于您使用的控制器实现。例如,nginx 入口控制器支持 TCP/UDP 代理,如记录 here
下一个示例显示如何使用端口 9000
在端口 8080
的命名空间 default 中公开服务 example-go 运行
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
data:
9000: "default/example-go:8080"
如果使用 TCP/UDP 代理支持,则需要在为 Ingress 定义的服务中公开这些端口。
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
- name: proxied-tcp-9000
port: 9000
targetPort: 9000
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
解决方案:
- 为每个部署创建一个 NodePort 类型的服务:在这种情况下,每个部署都可以使用 <任何 k8s 节点 ip>:<特定端口> 从集群外部访问
- 设置一个指向所有 k8s 节点的外部 reverse-proxy/loadbalancer(在 kubernetes 集群之外)并将其配置为接受来自端口 9001、9002 和 9003 的流量并将其转发到 k8s 节点
现在,您可以使用 :900[1,2,3] 访问您的应用程序
我有多个部署 运行 pods 运行 TCP 服务器。这些 TCP 服务器全部监听端口 9999
目前每个部署都有自己的负载均衡器服务,这导致每个部署都有不同的 IP。
不过我希望有一个 IP 地址来公开部署,并且只通过端口区分。
例如:
<public-ip>:9001 -> deployment 1
<public-ip>:9002 -> deployment 2
<public-ip>:9003 -> deployment 3
我读过有关 Ingress 的内容,但 docs 声明
An Ingress does not expose arbitrary ports or protocols. Exposing services other than HTTP and HTTPS to the internet typically uses a service of type Service.Type=NodePort or Service.Type=LoadBalancer.
所以这似乎不是一个选择。
对于上下文,kubernetes 托管在 vnet 中的 azure 中,只需要从该 vnet 中访问。
功能入口取决于您使用的控制器实现。例如,nginx 入口控制器支持 TCP/UDP 代理,如记录 here
下一个示例显示如何使用端口 9000
8080
的命名空间 default 中公开服务 example-go 运行
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
data:
9000: "default/example-go:8080"
如果使用 TCP/UDP 代理支持,则需要在为 Ingress 定义的服务中公开这些端口。
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
- name: proxied-tcp-9000
port: 9000
targetPort: 9000
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
解决方案:
- 为每个部署创建一个 NodePort 类型的服务:在这种情况下,每个部署都可以使用 <任何 k8s 节点 ip>:<特定端口> 从集群外部访问
- 设置一个指向所有 k8s 节点的外部 reverse-proxy/loadbalancer(在 kubernetes 集群之外)并将其配置为接受来自端口 9001、9002 和 9003 的流量并将其转发到 k8s 节点
现在,您可以使用