外部服务无法访问排障¶
在配置服务网格的外部服务访问时,可能会遇到服务无法正常连通外部服务的情况。 为了帮助您快速定位和解决问题,以下是详细的故障排除步骤。
背景说明¶
在使用服务网格进行微服务治理时,Sidecar 容器会接管服务的所有入站(Inbound)和出站(Outbound)流量请求。 这意味着,当应用程序需要访问非网格纳管的集群内 API、数据库等外部服务时,流量都会经过 Sidecar 代理进行处理。
为此,服务网格提供了 多种出口流量转发策略 的能力, 参考如何选择出口流量策略 ,即可以选择合适的出口流量策略。
如果在配置后,出现了服务无法正常访问外部服务的情况,可以按照以下步骤进行排查。
1. 检查外部服务本身是否正常¶
首先,确认外部服务是否正常运行。
验证方法:
- 在不经过服务网格的情况下,直接从集群内的其他服务或节点访问外部服务,确认其可用性。
- 使用工具如
curl
、telnet
或数据库客户端直接连接外部服务,查看是否可以正常响应。
2. 检查未注入 Sidecar 时是否正常¶
接着,确认问题是否由于 Sidecar 代理引起。
- 验证方法:
- 在网格实例的边车管理中,找到对应的工作负载,然后临时禁用 Sidecar 注入。
- 然后观察未注入 Sidecar 的服务是否可以正常访问外部服务。
- 分析: 如果未注入 Sidecar 时,服务可以正常访问外部服务,说明问题可能出在 Sidecar 代理或者网格配置上。
3. 检查出口流量策略的配置¶
确保已经正确配置了外部流量策略,网格实例创建后默认为注册服务,仅允许访问在网格注册过的服务。
如果服务未注册到网格或者是集群外部服务,可以根据出口网络策略的管理规范进行调整。
- 的确需要使用注册服务的转发模式,可以通过创建 服务目录(ServiceEntry) 通过白名单的形式开放
- 也可以调整为全部服务的转发模式,这样后续非注册到网格的服务也可以开放网络访问,减少运维成本和故障
4. 检查服务端口协议¶
确保服务端口的协议配置正确,尤其是在 ServiceEntry 和 VirtualService 中。
- 检查内容:
- 确认端口协议(如 HTTP、TCP、TLS)与外部服务实际使用的协议一致。
- 对于使用非 HTTP 协议的服务,如 MySQL、Redis,应该使用适当的协议类型。
- 验证方法:
- 查看 ServiceEntry 配置,确认
ports
字段中的protocol
是否正确。 - 检查是否需要启用 透传模式(Pass-Through) ,以便绕过 Sidecar 代理。
- 查看 ServiceEntry 配置,确认
5. 查看 Sidecar 日志和监控¶
通过查看 Sidecar 代理的日志,可以获取更多的故障信息。
-
验证方法:
-
使用
kubectl logs
命令查看 Sidecar 容器(通常为istio-proxy
)的日志: -
观察是否有连接被拒绝、超时等错误信息。
-
6. 检查网络策略和防火墙¶
在某些情况下,集群网络策略或防火墙可能会阻止出站流量。
验证方法:
- 检查 Kubernetes 的 NetworkPolicy 配置,确认是否允许出站流量到外部服务。
- 检查云提供商或物理防火墙的配置,确保未阻止相关端口和协议。
7. 确认 TLS 和证书配置¶
如果外部服务需要 TLS 加密,需要确认证书和加密设置正确。
验证方法:
- 检查是否需要配置 DestinationRule ,指定正确的 TLS 模式。
- 确认证书是否有效,是否被信任。
- 在 Sidecar 中配置适当的证书信任配置,如
TLSContext
。
专业术语解释¶
- ServiceEntry: Istio 中用于将外部服务纳入服务网格控制的配置对象,允许对外部服务应用 Istio 的流量管理和策略控制。
- External Traffic Policy: 用于控制网格中服务对外部服务的出站流量策略,决定了服务如何处理来自外部或发送到外部的流量。
- Sidecar: 与应用程序容器共同驻留的代理容器,通常是 Envoy 代理。 在服务网格中用于拦截和处理服务的入站和出站流量,实现负载均衡、服务发现和安全等功能。
- Deployment/Pod: Kubernetes 中的工作负载对象,Deployment 管理一组 Pod 的部署和生命周期, Pod 是 Kubernetes 中最小的可部署单元,包含一个或多个容器。
总结¶
通过上述故障排除步骤,您可以系统地排查服务无法访问外部服务的问题。关键在于逐步验证各个可能的原因, 从外部服务的可用性、Sidecar 的影响、配置的正确性,到网络策略和安全设置,最终找到问题的根源并加以解决。