Kubernetes生态中的服务网格长期由Istio和Linkerd主导,它们都采用Sidecar代理模型,在每个应用Pod旁边注入一个代理容器来接管流量。Cilium项目从网络插件起家,后来借助eBPF技术发展出一套无Sidecar的服务网格方案,将流量治理逻辑下沉到Linux内核,显著降低了资源开销和网络延迟。这种架构变化对中小集群特别有吸引力,因为不需要为每个微服务额外运行一个完整的代理进程。

为什么需要无Sidecar的服务网格
传统的Sidecar模式虽然功能强大,但存在明显的成本问题。每个Pod都需要注入一个Envoy代理容器,这个容器本身要消耗50到100MB的内存,并且处理每个请求都会经过用户态网络协议栈,导致额外的上下文切换和延迟。当集群中有上千个Pod时,仅Sidecar代理占用的总内存就可能达到数十GB,这对于资源敏感的环境来说是一个沉重负担。
eBPF提供了一种在内核中安全运行沙箱程序的能力,可以在不修改内核源码的前提下,将自定义逻辑挂载到网络数据路径上。Cilium利用eBPF直接在socket层和网络设备层拦截数据包,完成负载均衡、访问控制和流量转发,省去了数据包从内核态到用户态再回到内核态的多次复制。这种数据面更短、更快,而且不会为每个Pod引入独立的代理进程。
无Sidecar架构并非没有挑战。L7层协议解析(例如HTTP头部匹配、gRPC路由)需要完整的应用层处理能力,而eBPF程序本身不适合做复杂的协议解析。Cilium的策略是把L4层处理完全交给eBPF,L7层处理则交给每个节点上运行的共享Envoy实例,这个实例被多个Pod复用,从而在保留七层治理能力的同时避免每个Pod的代理开销。
Cilium Service Mesh的核心组件与工作流程
Cilium Service Mesh的数据平面由两部分组成:内核中的eBPF程序和节点级的Envoy代理。eBPF程序负责高效地处理L3/L4层的流量,例如根据Service和Endpoint信息做负载均衡、根据NetworkPolicy做包过滤,以及实现透明加密。当一个Pod发起HTTP请求时,数据包首先被eBPF程序捕获,如果请求需要做L7层策略判断(比如根据URL路径路由到不同版本),eBPF会将数据包交给本节点的Envoy实例,由Envoy完成HTTP解析和转发决策,然后再通过eBPF程序发送到目标Pod。
控制平面方面,Cilium Agent运行在每个节点上,通过Kubernetes API监听Service、Endpoints、CiliumNetworkPolicy等资源的变化,并将这些信息转换为eBPF程序需要的Map数据结构和Envoy配置。Cilium还引入了身份概念,每个Pod在创建时会被分配一个基于标签的安全身份,这个身份用于在eBPF层执行认证和授权,避免依赖IP地址这种易变标识。
在mTLS方面,Cilium Service Mesh支持基于SPIFFE标准的身份证书,Cilium Agent负责为Pod申请和轮换证书。节点级的Envoy代理使用这些证书完成双向TLS握手,而eBPF程序则保证只有经过授权的Pod才能访问特定服务。此外,Cilium还可以启用IPsec或WireGuard进行节点间的透明加密,用于保护数据平面流量的机密性,这两种机制与L7 mTLS可以按需组合。
L7流量管理与安全策略实践
下面展示一个基于HTTP路径进行流量拆分的CiliumNetworkPolicy示例。该策略允许来自前端应用的请求访问后端服务,但只允许GET方法,并且将路径以/api/v1开头的请求路由到版本v1,其他请求路由到版本v2。这种策略在Istio中通常需要VirtualService和DestinationRule配合实现,而Cilium用统一的策略资源即可完成。
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: http-route-split
spec:
endpointSelector:
matchLabels:
app: backend
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
- method: GET
path: "/api/v1/.*"
headers:
- "X-Version: v1"
- method: GET
path: "/api/.*"
headers:
- "X-Version: v2"
上述策略由Cilium Agent解析后,L4层的放行规则会被编译成eBPF程序,直接在内核中执行。对于匹配到HTTP规则的流量,eBPF程序会将数据包重定向到节点级Envoy,Envoy根据路径和Header信息选择正确的目标Pod。这种设计让L7策略的执行只发生在需要做七层判断的流量上,纯L4流量仍然走快速路径,整体性能优于所有流量都经过Sidecar代理的模式。
除了HTTP路由,Cilium Service Mesh还支持基于gRPC和Kafka协议的L7策略。例如可以限制某个Topic只允许特定身份的生产者写入,或者对gRPC方法做细粒度授权。这些能力在微服务安全治理中非常实用,而且策略本身使用Kubernetes原生CRD表达,不需要额外部署复杂的控制平面组件。
可观测性与性能评估
Cilium内置的Hubble组件可以提供服务网格级别的可观测性。Hubble通过eBPF程序采集每个数据包的元数据,包括源Pod、目标Pod、协议、端口、L7请求路径、响应码和延迟等信息,并将这些数据汇聚成流日志。用户可以使用Hubble CLI实时查看流量拓扑,或者将数据导出到Prometheus、Grafana等监控系统。与Istio的Kiali相比,Hubble的优势在于它直接利用eBPF数据,不需要Sidecar代理额外上报,因此观测开销更低。
从性能角度看,无Sidecar架构在延迟和资源占用上都有明显优势。根据公开测试,Cilium的eBPF数据路径在L4负载均衡场景下比传统kube-proxy模式快得多,而引入节点级Envoy处理L7流量后,虽然增加了少量延迟,但仍低于每个Pod一个Sidecar代理的方案。在资源占用方面,一个节点只需要运行一个共享Envoy实例,而不是几十个,这大幅减少了内存碎片和调度压力。
不过Cilium Service Mesh也存在一些限制。首先,它对Linux内核版本有要求,通常需要5.10以上才能获得完整的eBPF特性支持,老版本内核可能无法使用某些功能。其次,虽然Cilium支持L7流量管理和安全策略,但在高级流量治理(如故障注入、熔断配置的细粒度控制)上相比Istio还略显薄弱。最后,无Sidecar模式下的L7处理集中在节点级Envoy,如果一个节点上的某个恶意Pod发起大量L7请求,可能会影响同节点其他Pod的代理性能,需要配合资源限制和优先级配置来缓解。
总体而言,Cilium Service Mesh适合那些希望降低服务网格资源开销、同时保留核心L7治理能力的团队。如果你的集群已经使用Cilium作为CNI插件,开启Service Mesh功能几乎不需要额外部署组件,维护成本非常低。对于追求极致性能或者不想管理大量Sidecar的环境,这套方案值得作为Istio的替代选项进行评估。
CiliumService MesheBPF修改时间:2026-08-24 11:57:40