跳转至

外部服务无法访问排障

在配置服务网格的外部服务访问时,可能会遇到服务无法正常连通外部服务的情况。 为了帮助您快速定位和解决问题,以下是详细的故障排除步骤。

背景说明

在使用服务网格进行微服务治理时,Sidecar 容器会接管服务的所有入站(Inbound)和出站(Outbound)流量请求。 这意味着,当应用程序需要访问非网格纳管的集群内 API、数据库等外部服务时,流量都会经过 Sidecar 代理进行处理。

为此,服务网格提供了 多种出口流量转发策略 的能力, 参考如何选择出口流量策略 ,即可以选择合适的出口流量策略。

如果在配置后,出现了服务无法正常访问外部服务的情况,可以按照以下步骤进行排查。

1. 检查外部服务本身是否正常

首先,确认外部服务是否正常运行。

验证方法:

  • 在不经过服务网格的情况下,直接从集群内的其他服务或节点访问外部服务,确认其可用性。
  • 使用工具如 curltelnet 或数据库客户端直接连接外部服务,查看是否可以正常响应。

2. 检查未注入 Sidecar 时是否正常

接着,确认问题是否由于 Sidecar 代理引起。

  • 验证方法:
    • 在网格实例的边车管理中,找到对应的工作负载,然后临时禁用 Sidecar 注入。
    • 然后观察未注入 Sidecar 的服务是否可以正常访问外部服务。
  • 分析: 如果未注入 Sidecar 时,服务可以正常访问外部服务,说明问题可能出在 Sidecar 代理或者网格配置上。

3. 检查出口流量策略的配置

确保已经正确配置了外部流量策略,网格实例创建后默认为注册服务,仅允许访问在网格注册过的服务。

如果服务未注册到网格或者是集群外部服务,可以根据出口网络策略的管理规范进行调整。

  • 的确需要使用注册服务的转发模式,可以通过创建 服务目录(ServiceEntry) 通过白名单的形式开放
  • 也可以调整为全部服务的转发模式,这样后续非注册到网格的服务也可以开放网络访问,减少运维成本和故障

4. 检查服务端口协议

确保服务端口的协议配置正确,尤其是在 ServiceEntry 和 VirtualService 中。

  • 检查内容:
    • 确认端口协议(如 HTTP、TCP、TLS)与外部服务实际使用的协议一致。
    • 对于使用非 HTTP 协议的服务,如 MySQL、Redis,应该使用适当的协议类型。
  • 验证方法:
    • 查看 ServiceEntry 配置,确认 ports 字段中的 protocol 是否正确。
    • 检查是否需要启用 透传模式(Pass-Through) ,以便绕过 Sidecar 代理。

5. 查看 Sidecar 日志和监控

通过查看 Sidecar 代理的日志,可以获取更多的故障信息。

  • 验证方法:

    • 使用 kubectl logs 命令查看 Sidecar 容器(通常为 istio-proxy)的日志:

      kubectl logs [pod-name] -c 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 的影响、配置的正确性,到网络策略和安全设置,最终找到问题的根源并加以解决。

评论