virtualservice 的 hosts 字段必须与请求 host 头严格匹配,否则导致 404;对外暴露需与 gateway 的 servers.hosts 一致(如 ["api.example.com"]),对内调用则应设为目标 service 的 fqdn(如 go-service.default.svc.cluster.local)。

VirtualService 的 hosts 字段必须匹配请求 Host 头
这是最常见的 404 根源:你写了 hosts: ["go-service"],但客户端实际发的是 Host: api.example.com。Istio 不会按 Service 名匹配,只认 HTTP 请求头里的 Host 值。
- 确保
VirtualService的hosts字段与网关(Gateway)的servers.hosts一致,比如都写成["api.example.com"] - 测试时用
curl -H "Host: api.example.com" http://$INGRESS_IP/,而不是直接访问 IP 或 Service 名 - 若走内部服务间调用(如 Go 服务 A 调 B),
VirtualService的hosts应设为 B 的 Service 名(如go-service.default.svc.cluster.local),且调用方必须用该 FQDN 发起请求
DestinationRule 必须定义 subsets 并打上 version 标签
权重路由的前提是 Istio 能区分版本实例。光靠 Deployment 的 version: v2 标签没用,必须在 DestinationRule 里显式声明 subsets,并让其 labels 与 Pod 的实际 label 完全一致。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- Pod 的 label 必须包含
version: v1和version: v2(不是appVersion或其他键名) -
DestinationRule中subsets的name(如v1)仅用于VirtualService引用,真正生效的是labels字段匹配 - 检查
kubectl get pods -l version=v2是否能查到对应实例;查不到说明 label 没生效或 Deployment 没 rollout
命名空间必须启用 istio-injection=enabled
Sidecar 注入失败,Go 服务就完全游离在 Istio 控制之外——所有流量管理配置都形同虚设。
- 执行
kubectl label namespace default istio-injection=enabled --overwrite,注意加--overwrite避免因已存在标签而静默失败 - 确认 Pod 启动后有 2 个容器:
go-app+istio-proxy;若只有 1 个,说明注入未触发 - Deployment 的
spec.template.metadata.labels必须含app: go-service(Istio 默认用这个 selector 关联DestinationRule) - 如果手动注入过,记得删掉旧 Pod 让新配置生效:
kubectl delete pod -l app=go-service
Go 代码完全不用改,但调用方式有硬约束
Istio 的透明性是有前提的:你的 Go 服务必须遵守 Kubernetes 网络约定,否则 Envoy 无法劫持和路由。
- 服务间调用必须用 Service 名(如
http://order-service:8080),不能用localhost、127.0.0.1或 Pod IP - HTTP Server 监听地址应为
:8080(绑定所有接口),而非127.0.0.1:8080;后者会导致 Envoy 无法代理入向流量 - gRPC 服务需显式设置端口名
name: grpc,且客户端 dial 地址用dns:///order-service(不是order-service:8080) - 所有端口在 Deployment 的
containers[].ports[]中必须声明name(如name: http),Envoy 依赖它识别协议类型
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










