Envoy数据平面容器启动失败:Startup探针失败、gRPC错误及xDS连接失败
问题概述
在Kubernetes集群中安装Envoy Gateway(1.6.2),控制平面运行正常(对应Service和Endpoints存在),但数据平面Pod仅shutdown manager容器健康,envoy容器未就绪,启动探针报错:
Warning Unhealthy 34s (x25 over 4m34s) kubelet Startup probe failed: Get "http://X.X.X.X:19003/ready": dial tcp X.X.X.X:19003: connect: connection refused
数据平面日志显示:DNS解析虽最终成功,但连接控制平面envoy-gateway.envoy-gateway-system.svc.cluster.local:18000超时,无法建立XDS gRPC连接,导致Envoy未完成初始化。
排查与修复步骤
1. 验证控制平面18000端口的可达性
数据平面需连接控制平面的18000端口(XDS gRPC服务端口),从数据平面Pod内部测试连通性:
# 进入健康的shutdown manager容器 kubectl exec -it <数据平面Pod名称> -c shutdown-manager -- /bin/sh # 测试控制平面Service的端口连通性 nc -zv envoy-gateway.envoy-gateway-system.svc.cluster.local 18000 # 直接测试控制平面Pod IP的端口 nc -zv <控制平面Pod IP> 18000
若连接失败,排查以下点:
- 检查控制平面命名空间的网络策略,确认允许数据平面命名空间访问18000端口
- 检查集群CNI插件(如Calico、Cilium)是否有跨命名空间流量限制规则
- 确认控制平面Pod的18000端口正常监听:
kubectl exec -it <控制平面Pod名称> -- netstat -tulpn | grep 18000
2. 检查控制平面XDS服务配置
确认控制平面Service正确暴露18000端口:
kubectl get svc envoy-gateway -n envoy-gateway-system -o yaml
查看spec.ports是否包含正确配置:
- name: xds port: 18000 protocol: TCP targetPort: 18000
若targetPort配置错误,修改Service后重新部署。
3. 调整数据平面连接超时与探针配置
日志显示连接超时为5秒,可调大相关参数:
- 编辑数据平面的Deployment/DaemonSet,修改envoy容器的启动探针配置:
startupProbe: httpGet: path: /ready port: 19003 initialDelaySeconds: 30 periodSeconds: 5 failureThreshold: 20 livenessProbe: httpGet: path: /ready port: 19003 initialDelaySeconds: 40 timeoutSeconds: 10
- 调整数据平面Envoy bootstrap配置中XDS集群的连接超时:
clusters: - name: xds_cluster connect_timeout: 15s # 其余配置保持不变
4. 优化DNS解析稳定性
日志中出现短暂DNS解析异常,可优化相关配置:
- 检查集群CoreDNS Pod运行状态与日志,确认DNS服务无异常
- 在数据平面Envoy bootstrap的DNS resolver配置中增加重试次数与超时:
dns_resolvers: - address: "<集群DNS IP>:53" timeout: 5s retry_count: 3
5. 确认版本兼容性
确保Envoy Gateway控制平面与数据平面Envoy版本兼容:1.6.2版本的Envoy Gateway对应Envoy v1.29.x,检查数据平面Envoy镜像版本:
kubectl get pods <数据平面Pod名称> -o jsonpath='{.spec.containers[?(@.name=="envoy")].image}'
若版本不匹配,替换为官方推荐的兼容镜像。
内容的提问来源于stack exchange,提问作者CoderClown

