You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linkerd Dashboard监控Live Calls报Websocket错误解决方法

问题根因

这个Websocket error: undefined错误和你加的-enforced-host=.*参数没有直接关联,该参数仅用于放开Dashboard的Host请求头校验,不会影响WebSocket逻辑。
Live Calls功能依赖前端和Linkerd Viz后端的持久化WebSocket连接实时拉取服务调用数据,只要访问链路中任意一层(EC2安全组、服务暴露方式的转发规则、Minikube网络策略、反向代理配置)没有正确支持HTTP 101协议切换、拦截了WebSocket升级请求、或者主动断开长连接,就会抛出这个错误。

排查步骤
  • 先跳过公网暴露链路,在EC2实例本地验证服务本身是否正常:
    执行linkerd viz dashboard --port=8084 &启动本地端口转发,用curl模拟WebSocket握手请求:
    curl -i -N \
      -H "Connection: Upgrade" \
      -H "Upgrade: websocket" \
      -H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" \
      -H "Sec-WebSocket-Version: 13" \
      http://127.0.0.1:8084/api/live-calls
    
    如果返回结果包含101 Switching Protocols,说明Dashboard本身的WebSocket服务正常,问题出在公网暴露的转发链路上;如果返回4xx/5xx错误,说明是Viz组件本身的问题。
  • 本地验证失败时,优先检查Viz组件运行状态:
    执行kubectl get pods -n linkerd-viz,确认linkerd-viz-web、linkerd-viz-tap两个组件的Pod处于Running状态、READY列显示为1/1。如果Pod异常,查看对应Pod日志定位错误:
    # 查看web组件日志
    kubectl logs -n linkerd-viz deploy/linkerd-viz-web --tail=200
    # 查看tap组件日志
    kubectl logs -n linkerd-viz deploy/linkerd-viz-tap --tail=200
    
    重点排查日志中是否有RBAC权限不足、gRPC连接tap服务失败的报错。
  • 本地验证正常时,逐段排查公网暴露链路:
    • 检查EC2实例安全组、操作系统层面的firewalld/iptables规则,是否放通了你对外暴露Dashboard所用端口的入站TCP流量,是否有七层流量拦截规则截断了协议升级请求。
    • 如果你用Ingress暴露Dashboard,检查Ingress Controller的配置,是否缺少WebSocket协议升级所需的转发头,是否配置了过短的连接超时。
    • 如果你用NodePort+公网IP直接暴露,检查对应Service的配置,尝试将externalTrafficPolicy修改为Local排除SNAT带来的连接截断问题。
    • 如果你用kubectl port-forward配合第三方端口映射工具暴露公网访问,确认所用工具支持WebSocket长连接,部分云厂商Web终端自带的端口转发、简易四层转发工具会默认拦截WebSocket协议。
解决方案
  • 最稳妥、最安全的访问方式是用SSH隧道转发,不需要额外配置公网暴露规则:在你本地电脑执行ssh -N -L 8084:127.0.0.1:8084 <EC2实例登录用户>@<EC2公网IP>,之后本地浏览器访问http://127.0.0.1:8084即可正常使用所有Dashboard功能,包括Live Calls,这种方式完全走SSH加密隧道,不存在WebSocket拦截问题。
  • 如果必须公网暴露Dashboard,给反向代理/Ingress补全WebSocket支持配置,以Nginx Ingress为例,需要给对应Ingress资源添加以下注解:
    nginx.ingress.kubernetes.io/websocket-services: "linkerd-viz-web"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    
    确保底层Nginx配置包含proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection "upgrade";两个转发规则。
  • 如果是Viz组件本身配置异常,不要手动修改Deployment的args参数,重新用官方命令安装即可:
    linkerd viz install --set web.enforcedHostRegexp='.*' | kubectl apply -f -
    
    等待所有Pod重建完成后再验证功能。

内容的提问来源于stack exchange,提问作者Kesavan Ramalingam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:25:04