开启Istio Sidecar注入的K8s集群Liveness与Readiness探针失败求助
问题原因
- 探针配置被自动修改是Istio默认的HTTP探针重写机制导致:当集群开启Istio Sidecar自动注入时,Istio默认会重写应用容器的HTTP类型存活、就绪探针,将路径、端口替换为Sidecar的健康检查代理端点(端口15020,路径格式为
/app-health/<应用名>/<livez/readyz>),由istio-proxy代理转发请求到你原始配置的应用探针地址,避免kubelet直接访问应用时因mTLS策略、Sidecar未完成初始化导致探针误判失败。 - 报错的核心原因是你在探针配置中显式指定了
host: localhost:Istio的探针重写逻辑对显式设置了host字段的HTTP探针适配存在问题,会导致重写后的代理端点无法正常转发请求,甚至istio-proxy的15020端口还未完成初始化就开始检测,最终出现连接拒绝报错。另外15021端口是istio-proxy自身的就绪探针端口,该端口报错说明Sidecar本身启动异常,也会导致应用探针的代理端点不可用。
解决方法
你可以选择以下任意一种方案修复:
方案1:移除探针配置中的host: localhost字段
Kubernetes的HTTP探针默认就是向Pod的IP发送请求,不需要显式指定host为localhost,移除该字段后Istio的探针重写逻辑就能正常工作,代理会正确转发请求到你配置的9080端口的健康路径。
修改后的Helm Chart探针配置示例:
{{- if .Values.endpoint.liveness }} livenessProbe: httpGet: path: {{ .Values.endpoint.liveness | quote }} port: 9080 initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }} periodSeconds: 5 {{- end }} {{- if .Values.endpoint.readiness }} readinessProbe: httpGet: path: {{ .Values.endpoint.readiness | quote }} port: 9080 initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }} periodSeconds: 60 {{- end }}
方案2:显式关闭Istio的探针重写功能
如果你不需要Istio代理探针请求,可以在Deployment的Pod模板注解中关闭当前应用的探针重写:
在spec.template.metadata.annotations中添加以下配置:
sidecar.istio.io/rewriteAppHTTPProbers: "false"
关闭后Istio不会修改你的原始探针配置,kubelet会直接访问应用的9080端口进行健康检查,需要注意保证kubelet到Pod 9080端口的网络策略放行、mTLS策略不会拦截kubelet的请求。
方案3:调整Sidecar初始化顺序
如果Sidecar本身启动慢导致探针失败,可以添加注解让istio-proxy优先于应用容器启动:
proxy.istio.io/config: '{ "holdApplicationUntilProxyStarts": true }'
该配置会让应用容器等待Sidecar完全启动后再启动,避免探针检测时Sidecar端口未就绪的问题。
内容的提问来源于stack exchange,提问作者Uma Mahiswari
相关产品推荐
相关产品推荐

