如何配置Traefik Ingress暴露K3s中RabbitMQ的多个服务端口
配置失效的核心问题
- API版本过时:
networking.k8s.io/v1beta1版本的Ingress在Kubernetes 1.19及以上版本已正式废弃,当前主流K3s版本默认使用networking.k8s.io/v1版本API,版本不兼容会直接导致配置无法被集群识别。 - 路径规则冲突:两条转发规则都使用了
path: /,同域名下相同路径无法同时转发到两个不同的服务端口,冲突的规则会被Ingress控制器直接忽略。 - 协议不匹配:Ingress是专门用于HTTP/HTTPS七层流量转发的资源,而5672端口对应的AMQP服务是TCP协议的二进制流量,完全不兼容HTTP协议,不可能通过HTTP路径规则转发。
正确配置方案
你需要分开处理两个端口的暴露需求,提供两种常用实现方案:
方案一:Ingress(管理后台)+ Traefik TCP路由(AMQP服务)
适合需要用域名访问管理后台、不需要修改端口访问的场景,K3s默认集成的Traefik支持TCP路由CRD。
1. 管理后台Ingress配置(15672端口)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: rabbitmq-admin-ingress namespace: rabbits annotations: kubernetes.io/ingress.class: "traefik" spec: rules: # 可自定义主机名,提前将该域名解析到K3s节点IP即可 - host: rabbitmq-manager.example.com http: paths: - path: / pathType: Prefix backend: service: name: rabbitmq port: number: 15672
2. AMQP服务TCP路由配置(5672端口)
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRouteTCP metadata: name: rabbitmq-amqp-tcp namespace: rabbits spec: entryPoints: # 可使用Traefik默认的websecure入口,也可单独为AMQP新增5672入口 - websecure routes: # 若配置了TLS证书可填写对应的域名,无TLS则填*匹配所有请求 - match: HostSNI(`*`) services: - name: rabbitmq port: 5672
方案二:直接使用NodePort Service暴露
配置更简单,不需要额外调整Ingress控制器配置,适合快速测试场景:
apiVersion: v1 kind: Service metadata: name: rabbitmq-external namespace: rabbits spec: type: NodePort selector: app.kubernetes.io/name: rabbitmq ports: # AMQP服务:访问K3s节点IP+30672即可连接 - name: amqp port: 5672 targetPort: 5672 nodePort: 30672 # 管理后台:访问K3s节点IP+31672即可打开页面 - name: management port: 15672 targetPort: 15672 nodePort: 31672
nodePort取值范围为30000-32767,可根据需要自行调整未被占用的端口。
内容的提问来源于stack exchange,提问作者Ahmet Cetin
相关产品推荐
相关产品推荐

