K3s单节点集群Pod连接外部站点SSL Socket/WebSocket被拒咨询
单节点K3s环境下恢复WebSocket/SSL Socket通信的操作步骤
前置问题澄清
当前你执行curl命令报connection refused,核心原因是请求流量没有到达应用服务层,和你“未配置网络策略、流量全放行”的预期没有冲突——全放行的网络策略只会在流量已经到达网络栈的前提下不拦截报文,不会主动帮你把流量引导到你的应用入口上。
具体操作排查与调整
- 先修正请求的基础域名解析问题
你命令里写的目标是example.com,这个域名是公网保留示例域名,默认解析到公共站点IP,流量根本不会走到你的K3s集群。执行curl的机器上需要先配置hosts映射,把example.com指向你K3s单节点的实际内网IP,确保域名解析指向集群入口。 - 核对Helm部署的应用服务暴露配置
单节点K3s所有工作负载都运行在Server节点上,外部连接被拒最常见的原因是服务没有对外暴露入口: - 检查Helm Release对应的Service配置,如果是默认的ClusterIP类型,集群外的流量没有路由可以打到Pod上,需要调整服务暴露方式:要么设置为NodePort类型直接映射节点端口,要么利用K3s内置的ServiceLB能力直接在节点上绑定对应端口,不要仅依赖集群内部DNS访问。
- 核对端口映射的匹配关系:确认Service配置的targetPort和Pod内应用实际监听的容器端口完全一致,避免流量转发到Pod上没有进程监听的端口。
- 避免端口冲突:K3s默认部署的Traefik Ingress控制器会占用节点的80/443端口,不要让应用服务直接绑定这两个端口造成端口抢占,需要通过Ingress规则配置域名路由,把对应域名的流量转发到后端Pod。
- 适配SSL Socket的协议要求
你提到需要建立SSL Socket加密连接,但当前curl用的是80端口的明文HTTP协议,和SSL加密链路的规范不匹配: - 针对需要走wss(加密WebSocket)的场景,需要在Ingress上为example.com配置对应的TLS证书,确保443端口的SSL握手流程正常。
- 验证时调整curl的请求地址为HTTPS协议的443端口,再搭配WebSocket要求的Upgrade相关请求头,不要把加密连接的请求发到没有SSL配置的80端口上。
- 网络规则的二次核对
K3s默认通过Flannel组件实现Pod网络互通,无自定义网络策略的场景下跨Pod、节点到Pod的流量是全放行的,不存在策略拦截的问题。如果之前手动部署过全局隔离类型的NetworkPolicy,需要删除这类规则,确保未匹配自定义策略的流量不会被默认拦截。
连通性验证流程
- 先在K3s Server节点本地验证:直接访问Pod的IP和对应监听端口,确认应用服务本身正常启动、端口处于LISTEN状态,排除应用启动失败的问题。
- 再按链路顺序逐段验证:先测节点上服务暴露的端口连通性,再测Ingress的80/443端口连通性,最后携带所有WebSocket升级头发送请求,返回
101 Switching Protocols即代表SSL Socket/WebSocket链路正常建立。
内容的提问来源于stack exchange,提问作者beast
相关产品推荐
相关产品推荐

