必须验证三件事:容器状态为running且ready为true、日志显示监听15001/15090端口、tcpdump抓包命中15001或15006端口;go需监听0.0.0.0,调用须用fqdn,http/grpc须透传trace header。

确认 istio-proxy 是否真正注入并生效
很多人看到 kubectl get pod 显示 2/2 就以为 sidecar 已就绪,其实只是容器启动了,不等于流量被劫持。必须验证三件事:
- 执行
kubectl describe pod <pod-name></pod-name>,检查istio-proxy容器的State是Running,且Ready为true,无CrashLoopBackOff或OOMKilled - 运行
kubectl logs <pod-name> -c istio-proxy | grep "started"</pod-name>,应看到类似transport: listening on 15001和admin: listening on 15090的输出 - 最关键的验证:用
kubectl exec -it <pod-name> -c istio-proxy -- tcpdump -i any port 15001 or port 15006 -c 2</pod-name>抓包,再从另一 Pod 发起curl请求;若没抓到包,说明流量根本没进 proxy
Go 服务监听地址必须是 0.0.0.0,不能是 127.0.0.1
Envoy 只能拦截发往 Pod IP 的流量,对 localhost 或 127.0.0.1 的请求完全无视——这是最常被忽略的失联原因。
- 错误写法:
http.ListenAndServe("127.0.0.1:8080", handler)→ 上线后 inbound 请求全部 503 - 正确写法:
http.ListenAndServe("0.0.0.0:"+os.Getenv("PORT"), handler),默认 fallback 到"8080" - Kubernetes
Service的targetPort必须与 Go 实际监听端口一致;若 Go 启在8081而targetPort: 8080,Envoy 会转发失败 - 健康检查探针(
liveness/readiness)可放心用http://127.0.0.1:8080/healthz,这是 Istio 显式放行的例外路径
出向调用必须用 FQDN,不能用 localhost 或硬编码 IP
Go 代码里直接调用 http.Get("http://other-svc:8000/api") 是 OK 的,但前提是 DNS 解析和流量劫持都走通;否则你会看到 dial tcp: lookup other-svc on 10.96.0.10:53: no such host 或连接超时——这通常不是 DNS 故障,而是 outbound 流量没进 istio-proxy。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 务必使用 Kubernetes FQDN 格式,如
http://user-service.default.svc.cluster.local:8000,避免只写user-service(可能跨 namespace 失效) - 不要在 Go 中用
http.DefaultClient直连127.0.0.1或 Pod IP;sidecar 不处理这类地址 - 若启用 mTLS,Go 的 HTTP client 一般无需手动配证书,但需确保
http.Transport没禁用 TLS 协商(比如没设InsecureSkipVerify: true)
透传 trace header 是可观测性的前提
Istio 的 Jaeger 或 Zipkin 追踪链路里如果只有 istio-proxy 的 span,没有你的 handler,大概率是 Go 没透传上下文。
- HTTP 请求中必须保留并转发
x-request-id、x-b3-traceid、x-b3-spanid等 header - 用
gin、echo等框架时,别在中间件里覆盖req.Header;用req.Header.Clone()或显式 copy - gRPC 场景下,需用
metadata.MD传递 context,或借助otelgrpc自动注入 - 日志里建议打印
r.Header.Get("x-b3-traceid"),方便关联 proxy 日志与业务日志
实际部署时最容易卡在「监听地址」和「FQDN 调用」这两处。Istio 的透明性是假象——它只对符合约定的流量生效,而 Go 代码本身几乎不需要改,但网络行为必须严格对齐 Envoy 的劫持模型。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










