从同一入口暴露TCP和UDP



在kubernetes中,我有以下服务:

apiVersion: v1
kind: Service
metadata:
name: test-service
namespace: default
spec:
ports:
- name: tcp
protocol: TCP
port: 5555
targetPort: 5555    
- name: udp
protocol: UDP
port: 5556
targetPort: 5556
selector:
tt: test

它公开了两个端口,5555用于TCP,5556用于UDP。如何使用相同的入口从外部暴露这些端口?我试着用nginx做如下的事情,但它不起作用。它抱怨不支持混合端口。

apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
data:
5555: "default/test-service:5555"
---
apiVersion: v1
kind: ConfigMap
metadata:
name: udp-services
namespace: ingress-nginx
data:
5556: "default/test-service:5556"
---
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: tcp
port: 5555
targetPort: 5555
protocol: TCP
- name: udp
port: 5556
targetPort: 5556
protocol: UDP
args:
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx

有办法做到这一点吗?

大多数云提供商不支持UDP负载平衡或混合协议,并且可能有特定于云的方法来绕过此问题。

DigitalOcean CPI不支持服务中的混合协议定义,它只接受用于负载平衡器服务的TCP。是的可以请求具有服务注释的HTTP(S(和HTTP2端口。

摘要:DO CPI是当前的瓶颈,其仅限于TCP。只要有这个功能的实现对DO账单没有影响。

查看更多信息:执行混合协议。

一个可能解决问题的简单解决方案是创建一个反向独立服务器上的代理系统-使用Nginx并路由UDP和TCP流量直接到您的Kubernetes服务。

遵循以下两个步骤:

1.创建NodePort服务应用程序

2.创建一个小型服务器实例,运行带有LB配置的Nginx

使用NodePort类型的服务,它将在集群节点上公开您的应用程序,并使它们可以通过静态端口上的节点IP访问。这种类型支持多协议服务。点击此处阅读有关服务的更多信息。

apiVersion: v1
kind: Service
metadata:
name: test-service
namespace: default
spec:
type: NodePort
ports:
- name: tcp
protocol: TCP
port: 5555
targetPort: 5555
nodePort: 30010    
- name: udp
protocol: UDP
port: 5556
targetPort: 5556
nodePort: 30011
selector:
tt: test

例如,此服务使用TCP协议公开testpod的端口5555到nodeIP:30010,使用UDP公开端口5556到nodeIP:30011。请根据您的需要调整端口,这只是一个例子。

然后创建一个小型服务器实例,并使用LB config运行Nginx

对于这一步,您可以从任何云提供商那里获得一个小型服务器。一旦你有了服务器,ssh在里面,并运行以下程序来安装Nginx:

$ sudo yum install nginx

在下一步中,您将需要您的节点IP地址,您可以通过运行来获得这些地址

$ kubectl get nodes -o wide.

注意:如果您的节点没有外部访问权限,则必须为此设置入口点(例如NAT网关(。

然后,您必须将以下内容添加到nginx.conf中(运行命令$ sudo vi /etc/nginx/nginx.conf(:

worker_processes 1;  
events {  
worker_connections  1024;  
}  
stream {  
upstream tcp_backend {  
server <node ip 1>:30010;  
server <node ip 2>:30010;  
server <node ip 3>:30010;  
...  
}  
upstream udp_backend {  
server <node ip 1>:30011;  
server <node ip 2>:30011;  
server <node ip 3>:30011;  
...  
}  
server {  
listen 5555;  
proxy_pass tcp_backend;  
proxy_timeout 1s; }  
server {  
listen 5556 udp;  
proxy_pass udp_backend;  
proxy_timeout 1s;  
}  
}

现在您可以使用以下命令启动Nginx服务器:

$ sudo /etc/init.d/nginx start

如果在对配置文件进行更改之前已经启动了Nginx服务器,则必须重新启动它-执行以下命令:

$ sudo netstat -tulpn    # Get the PID of nginx.conf program  
$ sudo kill -2 <PID of nginx.conf>  
$ sudo service nginx restart

现在您有了UDP/TCP LoadBalancer,可以通过<server IP>:<nodePort>访问它。

查看更多:tcp-udp负载均衡器。

您可以启用功能门MixedProtocolLBService。有关如何启用功能门的说明,请参阅下文。

  • 如何在K8s中启用功能门

启用Ingress控制器以使设置生效后,重新启动(删除并重新创建(Ingress控制器。

MixedProtocolLBService是Kubernetes 1.20之后的测试版功能。它是稳定还是去预制还有待观察。

相关内容

  • 没有找到相关文章

最新更新