Istio环境下Pod不可用时请求转至Service的配置需求
解决方案:Istio TLS透传下Pod故障自动切换至Service
我们在Kubernetes集群中通过headless service实现特定Pod的内部路由,同时利用Istio Virtual Service+Gateway的TLS透传模式,将p{i}.service.domain.com这类外部请求直接路由到指定Pod(例如p0.service.domain.com对应pod-2.myservice.mynamespace),当前运行正常。现在需要实现:当目标Pod不可用时,自动将请求转发至Service地址myservice.mynamespace,直至Pod恢复可用。
核心思路
Istio的故障转移依赖于对目标端点的健康检测,直接指定Pod的FQDN时默认不会启用健康检查,因此需要通过Destination Rule为Pod配置健康检测规则,同时在Virtual Service中配置主备路由,让Istio在Pod不健康时自动切换到Service路由。
1. 配置Destination Rule(实现Pod健康检测)
创建DestinationRule,为目标Pod的FQDN定义子集,并配置健康检查规则(根据服务协议选择HTTP/TCP检查):
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: myservice-pod-dr namespace: mynamespace spec: host: pod-2.myservice.mynamespace subsets: - name: pod-subset trafficPolicy: loadBalancer: simple: ROUND_ROBIN outlierDetection: consecutive5xxErrors: 2 interval: 5s baseEjectionTime: 30s healthCheck: # 若为TCP服务,替换为healthCheck.tcp: {}即可 http: path: /healthz # 替换为你的Pod实际健康检查路径 port: 8080 interval: 5s timeout: 2s unhealthyThreshold: 2 healthyThreshold: 2
2. 修改Virtual Service(配置主备路由策略)
更新Virtual Service,添加两个路由条目:主路由指向Pod子集(权重100),备用路由指向Service(权重0)。当Pod被检测为不健康时,Istio会自动跳过主路由,将流量转发至可用的备用路由:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: myservice-vs namespace: mynamespace spec: tls: - match: - port: 8080 sniHosts: - p0.service.domain.com route: - destination: host: pod-2.myservice.mynamespace subset: pod-subset port: number: 8080 weight: 100 - destination: host: myservice.mynamespace port: number: 8080 weight: 0
关键说明
- 健康检测的作用:Destination Rule中的
healthCheck会让Istio代理定期检测Pod状态,当Pod连续失败达到阈值时,会被标记为不健康,Istio将停止向其转发流量。 - 权重配置逻辑:正常情况下流量全走权重100的Pod路由;当Pod不可用时,Istio会自动忽略该路由,将流量切换到权重为0的备用Service路由(权重0仅表示无主动流量分配,当主路由不可用时仍会被选中)。
- TLS透传兼容性:该配置完全兼容TLS透传模式,Istio仅根据SNI做路由决策,不会解密流量,健康检测直接针对Pod端口发起(若为HTTPS服务,需确保健康检查路径支持HTTPS,或单独开放HTTP健康端口)。
验证方法
- 手动停止目标Pod,查看Istio代理日志,确认流量已切换至Service。
- 恢复Pod后,等待健康检测通过,流量会自动切回原Pod。
内容的提问来源于stack exchange,提问作者kushal agrawal
相关产品推荐
相关产品推荐

