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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
云解析 DNS,旗舰版 1个月
简介: 通过 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.


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
28天前
|
Kubernetes 持续交付 Docker
利用 Docker 和 Kubernetes 实现微服务部署
【10月更文挑战第2天】利用 Docker 和 Kubernetes 实现微服务部署
|
2月前
|
运维 Kubernetes Cloud Native
云原生时代下,如何高效构建与部署微服务
【9月更文挑战第8天】随着云计算技术的飞速发展,云原生已成为现代软件架构的重要趋势。本文将深入浅出地介绍云原生概念、微服务架构的优势以及如何在云平台上高效构建和部署微服务。我们将通过实际的代码示例,展示在Kubernetes集群上部署一个简单的微服务应用的过程,帮助读者理解云原生环境下的微服务开发和运维实践。
|
3月前
|
负载均衡 应用服务中间件 持续交付
微服务架构下的Web服务器部署
【8月更文第28天】随着互联网应用的不断发展,传统的单体应用架构逐渐显露出其局限性,特别是在可扩展性和维护性方面。为了解决这些问题,微服务架构应运而生。微服务架构通过将应用程序分解成一系列小型、独立的服务来提高系统的灵活性和可维护性。本文将探讨如何在微服务架构中有效部署和管理Web服务器实例,并提供一些实际的代码示例。
102 0
|
2天前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
25 4
|
2月前
|
Dubbo Java 应用服务中间件
微服务框架Dubbo环境部署实战
微服务框架Dubbo环境部署的实战指南,涵盖了Dubbo的概述、服务部署、以及Dubbo web管理页面的部署,旨在指导读者如何搭建和使用Dubbo框架。
203 17
微服务框架Dubbo环境部署实战
|
1月前
|
Kubernetes Docker 微服务
微服务实践k8s&dapr开发部署实验(1)服务调用(一)
微服务实践k8s&dapr开发部署实验(1)服务调用(一)
45 2
|
30天前
|
Kubernetes Docker 微服务
微服务实践k8s&dapr开发部署实验(1)服务调用(二)
微服务实践k8s&dapr开发部署实验(1)服务调用(二)
47 0
|
2月前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
164 3
|
2月前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
68 2
|
2月前
|
缓存 负载均衡 数据管理
深入探索微服务架构的核心要素与实践策略在当今软件开发领域,微服务架构以其独特的优势和灵活性,已成为众多企业和开发者的首选。本文将深入探讨微服务架构的核心要素,包括服务拆分、通信机制、数据管理等,并结合实际案例分析其在不同场景下的应用策略,旨在为读者提供一套全面、深入的微服务架构实践指南。**
**微服务架构作为软件开发领域的热门话题,正引领着一场技术革新。本文从微服务架构的核心要素出发,详细阐述了服务拆分的原则与方法、通信机制的选择与优化、数据管理的策略与挑战等内容。同时,结合具体案例,分析了微服务架构在不同场景下的应用策略,为读者提供了实用的指导和建议。

热门文章

最新文章