通过 wireshark 快速排查客户现场微服务环境部署问题-案例分享

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: 通过 wireshark 快速排查客户现场微服务环境部署问题-案例分享

通过 wireshark 快速排查客户现场微服务环境部署问题-案例分享

1 前言-关于tcp/ip数据包与wireshark

  • 在网络世界里,所有的应用层协议(http/https,ssh/telnet,ftp,dns,kerberos,smb,dubbo/grpc/netty 等),其底层都是IP数据包以及IP数据包之上的TCP/UDP数据包(ip packet, tcp segment, udp datagram)。
  • 一些常见的包嗅探和包分析工具,如 tcpdump/wireshark/tshark等,可以让我们清晰地看到网络通信在底层数据包层面的交互情况,为排查复杂环境的网络故障,网络性能,甚至应用性能,提供帮助。
  • 本文分享一个通过wireshark快速排查客户现场微服务环境部署问题的案例,希望对大家有所帮助。

2 客户现场微服务部署问题概述

  • 某应用系统采用微服务架构,基于 docker/k8s/helm 采用容器化方式进行开发和部署。
  • 在公司内部容器平台上经开发测试验证后,所有功能一切正常,于是部署到了客户现场的容器管理平台并进行测试。但是验证发现客户现场所有功能都不能正常使用。
  • 相关同学初步排查,发现k8s的deployment以及底层的Pod都是启动成功的(客户的容器管理平台和k8s pod 的相关event和日志都印证了这点),telnet测试宿主机和容器之间网络端口的连通性没有问题,排查业务日志发现微服务注册是成功的也收到了前段发起的请求,但前段响应异常。
  • 客户现场容器管理平台上,业务应用对应的deployment页面如下:

640.png


  • 长时间排查无果后,相关同学联系了更多技术专家包括笔者协助排查问题,并提供了相关pcap数据包。

3 通过 wireshark 分析数据包发现问题

3.1 数据包总览

通过 wireshark 打开现场同学提供的pcap数据包,查看专家信息(expert information),并没有发现严重的丢包和重传等问题,但是有大量Malformed数据包:

640.png


笔者不太清楚微服务之间的调用关系,为快速排查问题,直接以k8s deployment涉及的ip端口过滤数据包并跟踪tcp流进行排查,如下图所示(tcp.port eq 60270, then follow tcp stream):

640.png


3.2 端口60279问题

直接以k8s deployment涉及的60279端口过滤数据包并跟踪tcp流进行排查,发现60279端口上有HTTP请求和HTTP响应,其HTTP数据如下:

HEAD / HTTP/1.0
HTTP/1.1 426 Upgrade Required
date: Mon, 19 Jun 2023 08:10:11 GMT
server: istio-envoy
connection: close
  • 进一步了解发现,Istio使用Envoy作为数据面转发HTTP请求,而Envoy默认要求使用HTTP/1.1或HTTP/2,当客户端使用HTTP/1.0时就会返回426 Upgrade Required,而使用nginx进行proxy_pass反向代理时默认会用 HTTP/1.0,所以可能需要修改nginx的配置文件nginx.conf,显示指定代理proxy_http_version为1.1;

640.png


640.png

3.3 端口60270问题

直接以k8s deployment涉及的60270端口过滤数据包并跟踪tcp流进行排查,发现60270端口上相关数据如下:

y..y3=2.5=32.30=nginx_test_0AAEC680#5.31=xo5vVuS9ZKreq514M2E5uGTdF01n0pTn+yFvhHa7SK4i1z5NfK1g/tprfXmz41YaJXw=.62=hsiar_nginx.HTTP/1.1 400 Bad Request
content-length: 11
content-type: text/plain
date: Mon, 19 Jun 2023 08:10:01 GMT
server: istio-envoy
connection: close
Bad Request
  • tcp三次握手完毕后,客户端并没有发起http请求(仅仅Push了nginx_test_0AAEC680 tcp 数据包),但服务端却响应了HTTP/1.1 400 Bad Request并关闭了http连接,随后tcp挥手关闭了连接:

640.png

4 问题汇总分析与解决

通过使用wireshark对数据包进行分析可以发现,网络通信在数据包层面都是联通的是正常的,但使用具体协议解析TCP数据包时有问题而引起了报错(比如不支持http1.0,比如错将非http协议当作http协议进行解析),且这些报错都来自 istio-envoy,向业务人员进一步了解发现,我们公司内部部署微服务时没有集成使用istio,但客户这里的容器平台集成了istio,至此问题清晰,问题应该是在微服务跟istion的集成上:

  • 客户这里的容器平台使用了istion 服务网格,Istio 从逻辑上分为数据平面和控制平面, 数据平面由一组智能代理(Envoy 4)组成, 这些代理负责协调和控制微服务之间的所有网络通信;
  • istio支持http/http2/https/tcp/grpc等通信协议,具体使用的协议可以自动推导也可以显示指定(Automatic protocol selection or Explicit protocol selection);
  • 由于istio自己推导协议容易错误(比如我们这里dump文件中将非http请求数据包当作http数据报解析出错,返回了bad request),最好在 pod 中显示指定协议:

640.png


  • 将以上问题反馈后,修改pod显示指定协议,问题解决;
  • 使用ISTIO时,有 sidecar 和 gateway 两种方式,两者对协议自动推导的支持不同,具体见官网:
- https://istio.io/latest/docs/ops/configuration/traffic-management/protocol-selection/
- Istio supports proxying any TCP traffic. This includes HTTP, HTTPS, gRPC, as well as raw TCP protocols. In order to provide additional capabilities, such as routing and rich metrics, the protocol must be determined. This can be done automatically or explicitly specified.
- Istio can automatically detect HTTP and HTTP/2 traffic. If the protocol cannot automatically be determined, traffic will be treated as plain TCP traffic.
- Protocols can be specified manually in the Service definition.This can be configured in two ways:By the name of the port: name: <protocol>[-<suffix>];In Kubernetes 1.18+, by the appProtocol field: appProtocol: <protocol>.
- HTTP gateway protocol selection:Unlike sidecars, gateways are by default unable to automatically detect the specific HTTP protocol to use when forwarding requests to backend services. Therefore, unless explicit protocol selection is used to specify HTTP/1.1 (http) or HTTP/2 (http2 or grpc), gateways will forward all incoming HTTP requests using HTTP/1.1.
-HTTP gateway protocol selection:Instead of using explicit protocol selection, you can instruct gateways to forward requests using the same protocol as the incoming request by setting the useClientProtocol option for a Service.


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
407 102
|
3月前
|
jenkins Java 持续交付
使用 Jenkins 和 Spring Cloud 自动化微服务部署
随着单体应用逐渐被微服务架构取代,企业对快速发布、可扩展性和高可用性的需求日益增长。Jenkins 作为领先的持续集成与部署工具,结合 Spring Cloud 提供的云原生解决方案,能够有效简化微服务的开发、测试与部署流程。本文介绍了如何通过 Jenkins 实现微服务的自动化构建与部署,并结合 Spring Cloud 的配置管理、服务发现等功能,打造高效、稳定的微服务交付流程。
421 0
使用 Jenkins 和 Spring Cloud 自动化微服务部署
|
5月前
|
存储 监控 Shell
SkyWalking微服务监控部署与优化全攻略
综上所述,虽然SkyWalking的初始部署流程相对复杂,但通过一步步的准备和配置,可以充分发挥其作为可观测平台的强大功能,实现对微服务架构的高效监控和治理。尽管未亲临,心已向往。将一件事做到极致,便是天分的展现。
|
10月前
|
Shell Go 开发工具
【环境】Rocky8使用gvm配置Go多版本管理的微服务开发环境(go-zero)
通过本文的介绍,我们详细讲解了如何在Rocky8上使用gvm来管理多个Go版本,并配置go-zero框架的开发环境。通过gvm的灵活管理,开发者可以轻松切换不同的Go版本,以适应不同项目的需求。同时,go-zero框架的使用进一步提升了微服务开发的效率和质量。希望本文能帮助开发者构建高效的Go语言开发环境,提高项目开发的灵活性和稳定性。
305 63
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
563 60
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
监控 安全 持续交付
构建高效的微服务架构:从设计到部署
构建高效的微服务架构:从设计到部署
146 1
|
存储 监控 Docker
探索微服务架构下的容器化部署
本文旨在深入探讨微服务架构下容器化部署的关键技术与实践,通过分析Docker容器技术如何促进微服务的灵活部署和高效管理,揭示其在现代软件开发中的重要性。文章将重点讨论容器化技术的优势、面临的挑战以及最佳实践策略,为读者提供一套完整的理论与实践相结合的指导方案。
|
安全 持续交付 Docker
微服务架构和 Docker 容器化部署的优点是什么?
微服务架构和 Docker 容器化部署的优点是什么?
|
Docker 微服务 容器
使用Docker Compose实现微服务架构的快速部署
使用Docker Compose实现微服务架构的快速部署
330 1

热门文章

最新文章