一、服务网格概述:什么是服务网格、为什么需要服务网格、服务网格与Kubernetes的关系
1.1 什么是服务网格?
服务网格这个概念,说白了就是微服务之间通信的基础设施层。
我刚开始接触这个名词时,也觉得挺玄乎的。后来在项目中真正用上了,才明白它到底解决了什么问题。
你想想看,微服务架构下,服务A要调用服务B。这中间涉及多少事?
- 服务发现:A怎么找到B在哪?
- 负载均衡:多个B实例,选哪个?
- 重试与超时:B挂了怎么办?
- 熔断:B一直慢,要不要切断?
- 可观测性:调用链路怎么追踪?
- 安全:通信要不要加密?
传统做法是把这些逻辑写在业务代码里。每个服务都得自己实现一遍。嗯,这其实很痛苦。
服务网格的做法是:把这些能力从业务代码中抽出来,放到一个独立的代理层里。这个代理层以Sidecar模式部署,跟业务容器跑在同一个Pod里。
核心定义:服务网格是一个专门处理服务间通信的基础设施层。它负责可靠地传递请求,而业务代码只需要关注业务逻辑。
我个人习惯把服务网格理解为「微服务的TCP/IP」。就像TCP/IP帮应用屏蔽了底层网络细节一样,服务网格帮微服务屏蔽了通信的复杂性。
1.2 为什么需要服务网格?
我在项目中遇到过这样一个场景:
一个电商系统,拆了三十多个微服务。刚开始还好,服务少,通信逻辑直接在代码里写。后来服务越来越多,问题就来了。
痛点一:重复代码
每个服务都要实现熔断、重试、超时控制。不同团队写的实现还不一样。出问题的时候,排查起来特别费劲。
痛点二:升级困难
想升级一下负载均衡策略?好,所有服务都得改代码、重新部署。这工作量,想想都头大。
痛点三:可观测性不足
服务间调用链路过长,出了问题根本不知道是哪个环节慢了。日志、指标、追踪,各搞各的,数据对不上。
痛点四:安全管控难
服务间通信要不要加密?要不要做身份认证?每个服务自己实现,很容易出现遗漏。
避坑指南:我曾经在一个项目里,因为服务间通信没有统一做mTLS加密,结果被安全审计抓了个正着。后来引入服务网格,这些问题才彻底解决。
服务网格的价值,就是把这些问题统一解决了。它提供了一个标准化的通信层,所有服务都通过它来交互。
说白了,服务网格让开发者可以专注于业务代码,而不用操心那些「通信琐事」。
1.3 服务网格与Kubernetes的关系
很多人问我:服务网格是不是必须跟Kubernetes一起用?
其实不是。服务网格可以跑在任何容器编排平台甚至虚拟机环境里。但现实中,绝大多数服务网格都部署在Kubernetes上。
为什么会这样?
因为Kubernetes提供了服务网格需要的「基础设施」:
| Kubernetes能力 | 服务网格如何使用 |
|---|---|
| Pod | Sidecar代理以容器形式运行在Pod中 |
| Service | 作为服务发现的基础,网格在此基础上做更精细的路由 |
| Namespace | 用于隔离不同环境或租户的网格配置 |
| CRD | 用于扩展Kubernetes API,定义网格的配置资源 |
| Ingress | 与网格的入口网关配合,管理南北向流量 |
我举个例子你就明白了:
在Kubernetes里,每个Pod可以跑多个容器。服务网格的Sidecar代理就是利用这个特性,跟业务容器共享网络命名空间。这样代理就能拦截所有进出业务容器的流量。
如果没有Kubernetes,你得手动在每个服务实例旁边部署一个代理。维护起来非常麻烦。
关键理解:Kubernetes解决了「如何部署和管理Sidecar」的问题,而服务网格解决了「Sidecar之间如何协同工作」的问题。两者是互补关系。
我记得刚开始用Istio时,有个同事问:Kubernetes Service已经能做负载均衡了,为什么还要服务网格?
答案是:Kubernetes Service的负载均衡是四层的,基于IP和端口。而服务网格能做七层的负载均衡,基于HTTP头、Cookie、甚至请求内容。你想想看,灰度发布、A/B测试这些场景,四层负载均衡根本搞不定。
所以,服务网格不是替代Kubernetes,而是在Kubernetes之上做了一层「精细化流量管理」。
1.4 服务网格的核心组件
一个典型的服务网格,包含两个核心部分:
数据平面(Data Plane)
- 由一组Sidecar代理组成
- 负责实际的流量转发、策略执行
- 常见实现:Envoy、Linkerd-proxy
控制平面(Control Plane)
- 负责管理和配置数据平面
- 下发路由规则、安全策略
- 收集遥测数据
- 常见实现:Istiod、Consul
数据平面和控制平面各司其职。数据平面要快,控制平面要稳。
个人经验:我在生产环境部署Istio时,控制平面我习惯用3个副本做高可用。数据平面则每个业务Pod一个Sidecar,资源开销大概在50-100MB内存,这个量级是可以接受的。
1.5 什么时候该用服务网格?
不是所有场景都需要服务网格。我建议你考虑以下几点:
- 微服务数量超过10个:服务少的时候,通信逻辑写在代码里反而更简单
- 需要精细的流量管理:比如灰度发布、流量镜像、故障注入
- 对可观测性要求高:需要统一的指标、日志、追踪
- 安全合规要求严格:需要服务间通信加密、身份认证
- 团队有运维能力:服务网格本身也是需要维护的组件
如果你只是两三个服务在跑,用服务网格反而增加了复杂度。嗯,这个要权衡。
注意事项:引入服务网格会增加资源开销和运维复杂度。我建议先在非核心业务上试点,跑一段时间再决定是否全面推广。
1.6 小结
这一章我们聊了服务网格是什么、为什么需要它、以及它跟Kubernetes的关系。
核心就三句话:
- 服务网格把通信能力从业务代码中抽离出来
- 它解决了微服务通信的通用问题:服务发现、负载均衡、熔断、可观测性、安全
- Kubernetes提供了部署和管理Sidecar的基础,两者配合使用效果最佳
下一章,我们会深入Istio的架构,看看控制平面和数据平面到底是怎么工作的。