Janus在Kubernetes中ICE连接失败,Docker环境下正常运行求助
解决Kubernetes中Janus ICE连接失败及媒体端口映射问题
核心问题分析
你的问题本质是Janus生成的SDP中携带了Pod内部IP(外部无法访问),且RTP/RTCP媒体端口未在K8s中正确暴露,导致ICE协商失败。Docker环境正常是因为端口直接映射到宿主机,Janus能自动识别宿主机公网/局域网IP,而K8s的Pod网络是隔离的,需要手动配置NAT穿透和端口范围映射。
1. 修正Janus的NAT穿透配置
仅配置nat_1_1不足以让Janus生成正确的ICE候选,需要补充以下参数到Janus的主配置文件janus.jcfg:
[nat] # 直接指定Nginx/LB的公网IP nat_1_1 = "x.x.x.x" # 用你的域名作为ICE候选的主机名(可选,优先于IP) ice_hostname = "your-domain-name.com" # 配置STUN服务器辅助ICE协商(可选但推荐) stun_server = "stun.l.google.com" stun_port = 19302 [media] # 定义Janus使用的媒体端口范围,后续K8s配置要和这个范围一致 port_range = "10000-20000"
修改后重启Janus Pod,查看日志确认ICE候选地址已替换为公网IP/域名,而非Pod内部IP。
2. Kubernetes中暴露RTP媒体端口范围
K8s支持Service的端口范围映射,无需逐个配置端口,以下两种方式任选:
方式一:NodePort Service(适合无云LB的场景)
默认NodePort范围是30000-32767,如果要映射10000-20000,需要先调整集群的kube-apiserver配置:
- 修改
kube-apiserver的启动参数,添加--service-node-port-range=10000-32767 - 重启
kube-apiserver组件
然后创建媒体流专用的NodePort Service:
apiVersion: v1 kind: Service metadata: name: janus-media spec: type: NodePort selector: app: janus # 匹配你的Janus Pod标签 ports: - name: rtp-udp-range protocol: UDP port: 10000 targetPort: 10000 nodePort: 10000 endPort: 20000
方式二:LoadBalancer Service(适合云厂商集群)
云厂商的负载均衡器(如AWS ALB、GCP LB)支持UDP端口范围映射,直接创建如下Service:
apiVersion: v1 kind: Service metadata: name: janus-media spec: type: LoadBalancer selector: app: janus # 匹配你的Janus Pod标签 ports: - name: rtp-udp-range protocol: UDP port: 10000 targetPort: 10000 endPort: 20000
创建完成后,云LB会分配一个公网IP,外部客户端的RTP流量会直接转发到Janus Pod的对应端口。
3. 架构调整说明
- Nginx仅负责代理Janus的HTTP/HTTPS API(
/janus/info等接口),无需处理UDP媒体流,媒体流直接通过上述Service暴露的端口与Janus Pod通信。 - 确保Janus配置中的
ice_hostname或nat_1_1指向的是媒体Service的公网IP/域名(如果用LB就是LB的IP,用NodePort就是节点公网IP)。
4. 验证步骤
- 查看Janus Pod日志,搜索
ICE candidate,确认输出的是公网IP/域名而非Pod IP。 - 用
kubectl exec -it <janus-pod-name> -- janus-pp命令检查Janus的配置生效情况。 - 在客户端浏览器中查看SDP内容,确认
c=字段的地址是公网可访问的IP/域名。
内容的提问来源于stack exchange,提问作者Ravi Srivastava
相关产品推荐
相关产品推荐

