Cilium,我以为它是L7天才…但真正的核心另有他处?🧐

在Kubernetes网络世界中,Cilium(西力姆)凭借其基于eBPF技术的强大性能和功能而备受关注。特别是其Layer 7(应用层)功能,允许基于HTTP请求路径(GET /api/v1)或gRPC方法设置策略,在将Cilium塑造为“下一代CNI”方面发挥了重要作用。

然而,如果只知道“Cilium是L7 CNI”,那么您可能错过了最重要的核心。Cilium的真正力量源自何处?让我们一起深入探究其核心。🚀


🏛️ Cilium的核心数据路径:L3和L4才是真正的主角

开门见山地说,Cilium的核心数据路径直接在Linux内核中运行,其主要舞台是OSI模型的Layer 3(网络层)和Layer 4(传输层)。

1. Layer 3(网络层)🌐:所有通信的基础

  • 作用:负责基于IP地址的路由,这是Pod网络最基本的部分。
  • Cilium的作用:Cilium为每个Pod分配IP地址,并利用eBPF高效处理节点间的Pod通信路径。它在内核级别直接传输数据包,无需复杂的iptables规则或叠加网络的性能下降。这是Cilium引以为傲的高速的第一个秘诀。

2. Layer 4(传输层)🔌:服务和策略的核心

  • 作用:基于TCP/UDP端口将数据准确地传输到正确的服务(进程)。
  • Cilium的作用:Kubernetes的核心功能,即服务(Service)负载均衡和网络策略(Network Policy),正是在L4层面实现的。
  • 替代kube-proxy:Cilium使用eBPF完全替代了kube-proxy的功能。它在内核中直接处理将发送到Service的ClusterIP和端口的请求转换为实际Pod的IP和端口并进行分发的过程,从而带来了巨大的性能提升。
  • 核心网络策略:“Pod A只能通过80端口与Pod B通信”等基本网络策略都在L4层面处理。

通过这种方式,Cilium通过eBPF在L3/L4层面已经构建了一个快速高效的网络基础。大多数流量都在此阶段迅速处理。


✨ 那么,强大L7功能的真正面貌是什么?

“等等,那么Cilium引以为傲的L7策略是如何运作的呢?”

这是一个很好的问题。Cilium的L7功能确实强大,但这只是在L3/L4数据路径之上构建的“智能扩展功能”。因为在L7层面检查所有流量是低效的。

分步查看Cilium的工作方式会更清晰。

  1. 数据包到达:当数据包到达节点时,内核的eBPF程序会首先拦截它。
  2. L3/L4检查 (eBPF):eBPF会快速检查数据包的源/目的IP(L3)和端口(L4),以判断是否与网络策略匹配。
  3. 决策点 (Decision Point):
  • 没有L7策略的情况 ✅:如果该流量没有适用的L7策略,eBPF会在内核层面直接进行ALLOW或DENY处理并结束。速度非常快!
  • 有L7策略的情况 ➡️:如果存在L7策略,例如“只允许80端口传入流量中的GET /public”,eBPF会将该流量发送到用户空间(User Space)中运行的Envoy代理。
  1. L7检查 (Envoy Proxy):Envoy代理会详细分析接收到的流量的HTTP头部、路径、方法等,并根据策略决定是允许还是阻止。

也就是说,Cilium采用了一种高效的混合模型,只在必要时选择性地将流量发送到L7代理进行处理。它兼顾了L3/L4的速度和L7的深度!

📜 通过代码看L4和L7策略的关系

下面的CiliumNetworkPolicy示例可以清晰地说明这种结构。

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: api-access-policy
spec:
  endpointSelector:
    matchLabels:
      app: my-api
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: frontend
    # ⬇️ L4 Policy: 首先,允许进入80端口的TCP流量。
    toPorts:
    - ports:
      - port: "80"
        protocol: TCP
      # ⬇️ L7 Policy: 在符合上述L4规则的流量中,额外应用HTTP规则。
      rules:
        http:
        - method: "GET"
          path: "/public/.*"
        - method: "POST"
          path: "/data"

如您所见,L7规则(rules.http)定义在L4规则(toPorts)内部。这直观地证明了L7策略是在L4这个更大的框架内运作的扩展功能。


❌ “Cilium是L7 CNI”这个误解为何危险

如果将Cilium纯粹理解为L7解决方案,可能会导致以下误解:

  • 性能误解:可能会误以为所有流量都通过代理,从而担心性能下降。但实际上,大部分流量都在内核中快速处理。
  • 策略设计的低效性:可能会为在L4层面可以简单阻止的流量创建不必要的复杂L7策略。最好从L4开始作为基础。
  • 问题解决的困难:当出现通信问题时,可能只会查看L7代理(Envoy)。但很容易忽视问题根源可能在于L3/L4的基本路由或端口策略。

🎯 结论:看清全貌才能理解真相

Cilium的真正优势不仅仅在于其出色的L7功能。

一种混合架构,它以eBPF驱动的超高速L3/L4数据路径为基础,并根据需要智能地集成L7可见性和控制功能。

这正是理解Cilium的关键。它就像一座设计精良的建筑,在坚实的基础(L3/L4)之上构建了精巧的功能(L7)。现在,当您看待Cilium时,请务必记住其强大基础L3和L4的作用!✨



Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注