K8s中通过Tailscale Funnel无法访问HTTP应用问题排查
问题诊断与解决方案
核心问题
日志里的http: proxy error: tls: first record does not look like a TLS handshake是关键线索:Tailscale Ingress代理尝试通过TLS协议连接你的后端Service,但你的Rust应用只提供HTTP服务,没有配置TLS,导致握手失败,最终返回空响应。
为什么会出现这个问题?
你将Service的port设为443,Tailscale Ingress默认会认为后端服务是HTTPS类型,因此会用TLS协议发起连接,但你的容器实际运行的是HTTP服务(监听3000端口),两者协议不匹配,导致握手失败。
而kubectl port-forward能正常工作,是因为它直接将本地请求转发到容器的HTTP端口,跳过了Tailscale代理的TLS握手环节。
修复方案
方案1:调整Service与Ingress的端口映射(推荐)
将Service的端口改为标准HTTP端口(如80),明确告诉Tailscale代理后端是HTTP服务:
- 更新Service配置:
spec: type: ClusterIP ports: - port: 80 targetPort: http protocol: TCP name: http
- 同步更新Ingress配置中的服务端口:
backend: service: name: mysvc port: number: 80
方案2:保留Service 443端口,添加Tailscale注解
如果需要保留Service的443端口,在Ingress的metadata.annotations中添加注解,强制Tailscale代理用HTTP协议连接后端:
metadata: name: ingress annotations: tailscale.com/funnel: "true" tailscale.com/backend-protocol: "http" # 添加这一行
验证修复
应用配置更新后,重新访问curl -v subroute.tailnetname.ts.net/health(无需指定443端口,因为Tailscale Funnel默认处理HTTPS的443端口),应该能正常返回"Ok"。
内容的提问来源于stack exchange,提问作者Vana
相关产品推荐
相关产品推荐

