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

简介: 通过 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.


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
1天前
|
Kubernetes 安全 Docker
微服务中的部署方法。
# 微服务 # 部署 # 去 # 开发运营
53 0
|
1天前
|
Java Docker 微服务
如何使用Docker和Docker Compose部署微服务
【2月更文挑战第12天】
315 0
|
1天前
|
Linux Nacos 数据库
【微服务】生产部署nacos集群(三个节点)
【微服务】生产部署nacos集群(三个节点)
26 1
|
1天前
|
Linux API Docker
Docker下部署微服务实践踩坑总结
Docker下部署微服务实践踩坑总结
94 0
|
1天前
|
弹性计算 监控 Cloud Native
云原生最佳实践系列 4:基于 MSE 和 SAE 的微服务部署与压测
通过MSE(微服务引擎)、SAE(Serverless应用引擎)、ARMS(应用监控服务)、PTS(性能测试服务)等产品,实现微服务的无服务化部署、监控和弹性伸缩。
|
1天前
|
监控 持续交付 Docker
深入浅出:基于Docker的微服务部署实践
【2月更文挑战第26天】在当前软件开发领域,微服务架构与容器化技术成为提升应用可伸缩性、可靠性和开发效率的关键手段。本文将深入探讨如何利用Docker容器技术实现微服务的快速部署与管理,涵盖环境搭建、服务打包、网络配置及持续集成等核心话题。通过实例演示,旨在为开发者提供一套行之有效的微服务部署解决方案。
|
1天前
|
Kubernetes 测试技术 持续交付
探索微服务架构下的持续集成与部署最佳实践
本文将深入探讨在微服务架构下实施持续集成与部署的最佳实践,介绍如何利用现代化工具和流程来实现自动化测试、持续集成、灰度发布等关键环节,帮助开发团队提升交付效率和质量。
|
1天前
|
缓存 应用服务中间件 数据库
微服务多机房部署
【2月更文挑战第13天】微服务一般要部署在多个机房,保证有一个机房因为各种不可抗力因素导致不可用时,可以把流量切换到其他可用机房来避免故障。
|
1天前
|
云计算 开发者 Docker
深入浅出:使用Docker部署微服务架构
在当今快速迭代的软件开发环境中,微服务架构凭借其灵活性和可扩展性成为了热门趋势。本文将探讨如何利用Docker这一强大的容器化技术,简化和加速微服务应用的部署与管理过程。我们将从微服务的基本概念出发,逐步深入到Docker的核心功能,最后通过一个实际案例演示整个部署流程。文章旨在为开发者提供一个清晰、实用的指南,帮助他们有效地利用Docker在微服务架构下的应用部署。
28 0
|
1天前
|
持续交付 开发者 Docker
深入浅出:使用Docker简化微服务部署
在当今快速发展的软件开发领域,微服务架构因其高度的模块化和可伸缩性而受到广泛欢迎。然而,微服务的部署与管理往往是一个挑战,尤其是在多环境下维护一致性时。本文将探讨如何使用Docker容器技术来简化微服务的部署流程,从而实现快速、一致且可复制的部署策略。我们将通过一个示例项目演示如何构建、容器化及部署微服务,并讨论Docker在解决微服务架构中常见问题(如服务隔离、环境一致性和自动化部署)方面的优势。本文旨在为开发人员提供一种更加高效和可靠的微服务部署方法,帮助团队更好地利用Docker的强大功能,优化开发流程。
21 2
http://www.vxiaotou.com