如何在除了HTTP或HTTPS之外K8中创建服务(AMQP)和入口资源?
我们有一个要求,我们的java-spring-bot应用程序需要通过443/80端口发送请求,我们需要在端口443/80上接收该请求,并将其重定向到我们的rabbitmq pod,它运行在amqp协议上,而不是http/https上。
我不知道到目前为止这是可能的或不可能的,但我们已经创建了入口资源,用它来重定向请求到我们的rabbitmq部署/pod。
下面是入口资源定义。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ing-rabbitmq-amqp
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- http:
paths:
- path: /amqp
pathType: Prefix
backend:
service:
name: rabbitmq-amqp
port:
number: 5671
但是我们正在通过这个配置使java应用程序连接到rabbitmq,我们收到了错误消息。
从我们的Java应用程序
2023-02-03 07:13:51.031 INFO 1 --- [ main] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 'taskScheduler'
2023-02-03 07:13:51.106 INFO 1 --- [ main] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [10.25.119.247/amqp:80]
2023-02-03 07:13:51.125 INFO 1 --- [ main] o.s.a.r.l.SimpleMessageListenerContainer : Broker not available; cannot force queue declarations during start: java.net.UnknownHostException: 10.25.119.247/amqp
Usually our app throws this messages for successful connection with rabbitmq on port 5671
2023-02-03 07:15:44.087 INFO 1 --- [ main] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 'taskScheduler'
2023-02-03 07:15:44.150 INFO 1 --- [ main] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [10.25.119.247:5671]
2023-02-03 07:15:46.182 INFO 1 --- [ main] o.s.a.r.c.CachingConnectionFactory : Created new connection: rabbitConnectionFactory#2f01783a:0/SimpleConnection@5b202a3a [delegate=amqp://test_bot_user@10.25.119.247:5671/test, localPort= 58840]
当nginx-ingress-controller pod抛出以下错误消息时。
2023/02/03 07:20:08 [error] 4299#4299: *209766772 recv() failed (104: Connection reset by peer) while proxying and reading from upstream, client: 10.25.119.247, server: 0.0.0.0:5671, upstream: "192.168.52.60:5671", bytes from/to client:5467/6570, bytes from/to upstream:6570/5467
[5.161.119.202] [03/Feb/2023:07:20:08 +0000] TCP 200 6570 5467 263.959
This is our serverIP: 10.25.119.247
This is rabbitmq-pod IP which is coming in that log: 192.168.52.60
那么首先,是否有可能在其他协议(如amqp)上创建k8s服务和入口资源?
其次,如果第一个问题的答案为否,我们无法在协议http/https上的k8中创建这些资源,即使我们可以创建,但我无法实现此场景,那么如何实现客户端位于代理后面的场景(Cisco-WSA/12.5.2 - 007)希望使用我们的java-springboot应用程序(它在AMQP协议上与rabbitmq连接)只通过https端口与我们的rabbitmq-pod连接,并且不愿意在他的出站请求中打开rabbitmqtls端口5671?
如果有任何疑问,请告诉我?
1条答案
按热度按时间cgfeq70w1#
我认为这将是不可能的Nginx入口就像这样,因为它支持HTTP****协议。
Nginx ingress controller doc
尽管amqp使用TCP作为传输协议,但在Nginx入口控制器上实现tcp_passthrough配置可能会成功。
入口不支持TCP或UDP服务。因此,此入口控制器使用标志
--tcp-services-configmap
因此,您可以在入口控制器上公开一个端口,并使用它访问TCP****服务。
在ingress-nginx名称空间中创建配置Map
使用arg按原样更新nginx部署,而不进行任何更改
最后,在nginx入口的部署中添加端口配置,如文档所示。
https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/