想象你是一座繁忙城市的交通主管。以前为了让每辆运输车(微服务)都能安全交谈,你给每辆车配了一位随行调度员(Sidecar 代理)。调度员坐在车门口,任何货物进出都要先在调度员那里登记、检查、开单,然后再上路。车队规模小的时候还能忍受,可当上万辆车同时出发,路上到处是调度员来回奔波的声音,原本用来送货的道路反而被调度员堵住了。Cilium 带着 eBPF 出现了:它不再给每辆车配随行人员,而是把“交通智慧”直接嵌入道路本身——在红绿灯、路口传感器和路面上安装微型智能控制模块,车辆路过时由道路自己判断方向、检查通行证、记录流量。于是,车辆不再需要绕进调度员的办公室,直接在快速路上飞驰。 这就是 Cilium 基于 eBPF 实现 Service Mesh 的核心思路:与其在业务旁边堆代理,不如让 Linux 内核这个“城市道路管理系统”直接参与流量治理。本篇文章会用这个城市交通的故事,带你理解服务网格的困境、eBPF 的技术底座、Cilium 的数据面加速、L7 流量管理、安全策略、可观测性,以及从 Sidecar 迁移到 Cilium 的实践路径。

岗位关联

掌握 eBPF 加速数据面的原理,能让你在高并发微服务场景下做出低延迟、高可观测的架构决策,也能帮助云原生网络工程师和开发平台工程师理解下一代 Service Mesh 的设计方向。

目录
  1. 可视化演示
  2. 服务网格困境:随行调度员的账本
  3. eBPF 核心技术:会读交通规则的路口传感器
  4. Cilium 数据面:内核直通的快速路
  5. L7 流量管理:认识货物内容的路口
  6. 网络策略安全:带身份徽章的通行证
  7. 可观测性:城市交通大屏
  8. 部署迁移实践:旧马路的改造工程
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

讲解Cilium如何利用eBPF技术实现高性能的Service Mesh数据面,替代传统Sidecar代理模式... 切换模式查看不同维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

eBPF技术:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现

服务网格困境:随行调度员的账本

在城市物流刚刚起步时,给每辆运输车配一位随行调度员是合理的。司机不用自己认路,调度员熟悉所有路口,还能帮忙检查货物是否合规。但调度员并不拉货,他只是坐在车上“转述信息”。随着车队从几十辆增加到几千辆,调度员的车辆本身也占用了道路。Service Mesh 里的 Sidecar 代理就是这样一位随行调度员:它和业务容器住在同一个 Pod 里,所有进出的流量都要先经过它,再由它转交给真正的业务程序或对端服务。

这个设计带来了非常清晰的延迟代价。以前一次请求可以理解为“从车厢直接走下车,穿过马路到另一辆车上”,现在却要先走进调度员的车厢、登记确认、再走下车。请求每经过一次 Sidecar,就会发生一次用户态的代理转发,涉及上下文切换、数据复制、连接管理。对于高并发的微服务调用链,这种开销会被放大。

在传统 Sidecar 模式下,一次完整调用的延迟可以写成:

这就是服务网格的第一道坎:Sidecar 给了我们灵活的流量治理能力,却让每笔业务都背上了一位“随行调度员”的开销。当城市规模继续扩大,单纯调优调度员的效率已经不够了,我们需要把治理能力从车旁搬到道路里去。

T传统=T应用+2×T边车+T网络T_{\text{传统}} = T_{\text{应用}} + 2 \times T_{\text{边车}} + T_{\text{网络}}
这个公式说明,数据不是只经过一次 Sidecar,而是客户端和服务端各经过一次,所以“2 × 边车”是无法绕开的成本。
  1. $T_{\text{应用}}$业务逻辑本身处理请求所花费的时间,这是应用代码的执行开销。
    T应用T_{\text{应用}}
  2. $T_{\text{边车}}$每次经过 Sidecar 代理的转发耗时,包括用户态网络读写和协议处理。
    T边车T_{\text{边车}}
  3. 系数 2客户端出方向经过一次 Sidecar,服务端入方向又经过一次,因此要乘以 2。
    2×T边车2 \times T_{\text{边车}}
  4. $T_{\text{网络}}$真正在物理网络或容器网络中的传输时间。
    T网络T_{\text{网络}}

eBPF 核心技术:会读交通规则的路口传感器

eBPF 的出现,就像城市管理者在道路上安装了一种“可编程交通传感器”。这些传感器不是普通铁盒子,它们是一段段经过严格审查的小程序,被嵌入到红绿灯、路面感应线圈和路口的监控杆中。它们能实时看到每一辆车经过、识别车牌、统计车速,但必须遵守一套严格的沙箱规则:不能修改道路结构,不能超过规定的内存占用,必须在极短时间内给出动作。

在 Linux 世界中,eBPF 就是这种“可编程道路传感器”。它允许我们把用户定义的程序安全地加载进内核,无需修改内核源代码,也不用冒着编写内核模块导致整个系统崩溃的风险。eBPF 程序需要经过验证器检查,确认没有非法越界、没有死循环风险,然后通过 JIT 编译成本地指令,挂载到网络栈中的各类钩子点,例如 XDP、tc、socket 等位置。程序之间通过 BPF Map 共享数据,Map 就像路侧的信息公告牌,某个传感器可以把统计结果写上去,其他模块也能读取。

一个 eBPF 程序从编写到正式工作,会经历一条确定的流水线:

有了这种“装在道路里的智能传感器”,Cilium 才有机会构建不需要随行调度员的 Service Mesh。下一节我们看看 Cilium 如何利用这些传感器改造数据面。

处理流程=加载→校验→挂载钩子→事件触发→Map读写→返回动作\text{处理流程} = \text{加载} \rightarrow \text{校验} \rightarrow \text{挂载钩子} \rightarrow \text{事件触发} \rightarrow \text{Map读写} \rightarrow \text{返回动作}
这条流水线不是数学计算,而是 eBPF 的生命周期。理解它,就能理解为什么 eBPF 既能扩展内核,又不会轻易“搞坏整个城市交通”。
  1. 加载用户态工具把编译后的 BPF 字节码发送给内核,由内核接管后续流程。
    加载\text{加载}
  2. 校验验证器检查指令是否安全,包括内存访问边界和指令复杂度。
    校验\text{校验}
  3. 挂载钩子把程序绑定到网络、跟踪等事件发生的位置,等待事件触发。
    挂载钩子\text{挂载钩子}
  4. 事件触发当有数据包经过或系统调用发生时,钩子点自动执行这段程序。
    事件触发\text{事件触发}
  5. Map 读写程序在 BPF Map 中读写统计或配置,实现内核态与用户态的数据交换。
    Map读写\text{Map读写}
  6. 返回动作程序返回“放行、丢弃、重定向”等动作,让内核按结果处理。
    返回动作\text{返回动作}

Cilium 数据面:内核直通的快速路

现在,城市管理者不再需要给每辆车派调度员了。他们改造了一批快速路,在入口处安装智能传感器,车辆进入时自动识别身份、核对目的地,然后直接通过地下通道或高架快速到达出口。整个过程中,车辆没有停下,也没有绕进任何调度员的车厢。Cilium 的数据面设计思想正是如此:让数据包在内核网络栈中直接完成转发与治理,而不是反复进入用户态的 Envoy 代理。

Cilium 利用 eBPF 挂载在 veth、tc、XDP 等网络钩子上,把 Service Mesh 的流量拦截、负载均衡、策略执行、可观测性数据采集全部下沉到内核。它替代了传统 Service Mesh 中 kube-proxy 的 iptables 逻辑,也替代了 Sidecar 代理的数据面转发职责。更进一步的“套接字级负载均衡”可以让请求在进程发起连接时就被决定转发目标,相当于在出发车库门口就完成路线规划,连快速路都不用绕。

Cilium 的加速路径可以用下面的延迟模型来表示:

快速路虽然修建成本不低,但一旦建成,每辆车的通行效率都会大幅提升。Cilium 对数据面的改造,本质上就是把“随行调度员”的工作内容,变成了道路基础设施的一部分。

TCilium≈T内核收包+TeBPF决策+T内核转发T_{\text{Cilium}} \approx T_{\text{内核收包}} + T_{\text{eBPF决策}} + T_{\text{内核转发}}
这个公式与 Sidecar 模式的差异在于:没有“用户态代理一跳”,数据不需要跨过内核态和用户态的边界来回折腾。
  1. $T_{\text{内核收包}}$网卡把报文交给内核网络栈的过程,这是任何网络通信都存在的基线成本。
    T内核收包T_{\text{内核收包}}
  2. $T_{\text{eBPF决策}}$eBPF 程序在钩子点执行查表、路由、负载均衡和策略判断的耗时,通常在微秒级。
    TeBPF决策T_{\text{eBPF决策}}
  3. $T_{\text{内核转发}}$内核直接把报文发送到目标端点,而不需要切换到用户态代理。
    T内核转发T_{\text{内核转发}}

L7 流量管理:认识货物内容的路口

前面的快速路能让车快速通行,但现实中,不同货物需要不同处理。有的车运输生鲜,需要优先放行;有的车装载危险品,需要立刻拦下;有的车要送去仓库,有的车要送去码头。传统路口只看车牌就能放行,但无法判断车厢里装的是什么。Cilium 的 L7 流量管理能力,相当于给路口检查员配上了“智能货物扫描仪”,在车流通过时能读取货物清单,也就是 HTTP 路径、gRPC 方法、Kafka 主题等应用层信息。

有了这种能力,Cilium 可以执行七层路由、HTTP 熔断、限流、请求重试、超时控制等策略。例如,用户请求的路径是 /api/pay,就进入支付服务;如果请求来自某个风险等级较高的租户,就返回 403。这些判断可以部分由 eBPF 直接完成,也可以在需要深度解析时,把流量引流到 Envoy 做更复杂的处理。Cilium 并不排斥 Envoy,而是把它从“每个 Pod 标配随行调度员”变成了“仅仅在需要复杂七层逻辑的路口部署的检查站”。

一次 L7 请求的治理流程可以抽象为:

对业务团队来说,这意味着流量治理的粒度从“车能不能走”升级成了“这箱货该怎么走”。这正是现代微服务架构最需要的精细化控制能力。

请求处理=协议解析→路由匹配→策略校验→转发/拒绝\text{请求处理} = \text{协议解析} \rightarrow \text{路由匹配} \rightarrow \text{策略校验} \rightarrow \text{转发/拒绝}
L7 治理的本质是“先看懂货物,再决定放行”。解析越深入,能做的治理越精细,但也要在性能和灵活性之间取得平衡。
  1. 协议解析理解 HTTP、gRPC、Kafka 等应用层协议的内容和元数据。
    协议解析\text{协议解析}
  2. 路由匹配根据路径、方法、Header 等信息决定请求应该交给哪个后端服务。
    路由匹配\text{路由匹配}
  3. 策略校验检查这条请求是否满足限流、鉴权、熔断等预设规则。
    策略校验\text{策略校验}
  4. 转发/拒绝策略通过则转发到目标服务,不通过则直接返回错误响应。
    转发/拒绝\text{转发/拒绝}

网络策略安全:带身份徽章的通行证

城市交通管理最头疼的问题之一是假车牌。过去的安全策略很多基于 IP 地址,就像保安只看车牌号:如果一辆车换了假牌照,保安可能就认不出来了。而且在云原生环境里,Pod 的 IP 是动态变化的,销毁重建后 IP 就变了,这给安全策略带来了极大的不稳定。Cilium 的解决方案是给每一辆车发放一张“身份徽章”,这个徽章不依赖车牌,而是基于 Kubernetes 标签生成的唯一安全身份。

Cilium 会为每个端点计算一个 security identity。当数据包经过 eBPF 钩子时,内核直接读取源端点和目的端点的身份标识,而不是重新解析 IP。网络策略可以根据这些身份定义“谁能访问谁”,并且支持 L3、L4、L7 多层规则。规则更新时,Cilium 通过 BPF Map 动态调整,不需要像 iptables 那样重建大量规则链,因此在大规模集群中也能够快速生效。

一条流量被允许通过的条件,可以用逻辑表达式概括:

有了身份徽章,安全策略就不再害怕 Pod IP 漂移了。就像城市安保认的是可追溯的电子徽章,而不是随时可能伪造的车牌号,Cilium 让云原生环境的安全模型更稳定、更自动化。

允许=源身份∈S∧目的身份∈D∧L7规则允许\text{允许} = \text{源身份} \in S \land \text{目的身份} \in D \land \text{L7规则允许}
这里的 $S$ 和 $D$ 是策略中允许的源身份集合与目的身份集合。只有三层条件同时满足,数据包才会被放行。
  1. 源身份 $\in S$发起请求的工作负载必须具备策略允许的源身份标签。
    源身份∈S\text{源身份} \in S
  2. 目的身份 $\in D$被访问的服务必须具备策略允许的目的身份标签。
    目的身份∈D\text{目的身份} \in D
  3. L7 规则允许如果策略包含七层规则,请求的方法、路径、Header 也需要通过校验。
    L7规则允许\text{L7规则允许}

可观测性:城市交通大屏

当道路上的智能传感器足够多时,城市管理者就能实时看到一张“全城交通大屏”:哪些路口拥堵、哪些道路流量异常、哪两辆车沟通失败。更重要的是,这些数据不是靠单独安装摄像头或给每辆车加装监控设备获得的,而是道路本身在治理交通时顺手记录的。Cilium 的可观测性组件 Hubble 就是这样一块“城市交通大屏”。

Hubble 基于 eBPF 在数据面采集流量元数据,展示服务之间的依赖关系、网络吞吐、TCP 握手时延、DNS 解析情况、被策略拒绝的流量等。这种观测方式是“非侵入式”的,应用不需要改代码,也不需要主动上报指标,因为每次数据包经过内核钩子时,信息已经被记录下来了。对于微服务故障定位,这张大屏能快速告诉你:是服务不可用?还是网络策略拦掉了流量?或是某个服务成了新的瓶颈?

eBPF 的可观测性成本模型可以写成:

传统 Service Mesh 的监控往往依赖 Sidecar 的访问日志,日志量大、存储成本高;而 Cilium 借助内核观测数据,让运维团队既能看得清,又不必为“看清”付出过高性能代价。

观测开销=采样率×单事件处理成本\text{观测开销} = \text{采样率} \times \text{单事件处理成本}
eBPF 之所以能做到“观测但不拖慢交通”,就是因为它把单事件处理成本压得非常低,并且可以通过采样率灵活调节精度。
  1. 采样率并不是所有流量都要记录,可以按比例采样,降低开销。
    采样率\text{采样率}
  2. 单事件处理成本每个数据包或事件在 eBPF 程序中做元数据提取的耗时。
    单事件处理成本\text{单事件处理成本}
  3. 乘积关系总开销取决于采样多少事件以及每个事件处理多快,Cilium 让后者保持极低。
    采样率×单事件处理成本\text{采样率} \times \text{单事件处理成本}

部署迁移实践:旧马路的改造工程

把这座城市的随行调度员全部撤掉,换成智能信号灯,并不是一夜之间就能完成的。老城区还有很多旧交通设施、历史遗留的规则,有些车队甚至已经习惯了调度员的节奏。迁移到 Cilium Service Mesh 同样需要分阶段进行,而不是简单的“改一行配置就上线”。

第一阶段,可以先以 CNI 插件方式部署 Cilium,替换 Kubernetes 默认的 kube-proxy,观察网络性能变化;第二阶段,逐步开启 Cilium 的 L3/L4 网络策略,用身份标签替代旧的 IP 访问控制;第三阶段,再引入 L7 策略和 Hubble 可观测性,同时评估哪些复杂场景还需要保留 Envoy。整个过程中,要对比传统 Sidecar 模式和 eBPF 模式在 P50、P95 延迟、吞吐量、CPU 和内存占用上的差异。

性能提升可以用一个直观的公式衡量:

迁移的本质是“渐进式改造”:先用新道路承担一部分车流,验证稳定后再逐步扩大范围。Cilium 的部署实践告诉我们,技术升级不是非此即彼,而是要让治理能力更靠近道路本身,让业务车流跑得更轻松。

性能提升=T传统−TCiliumT传统×100%\text{性能提升} = \frac{T_{\text{传统}} - T_{\text{Cilium}}}{T_{\text{传统}}} \times 100\%
这个公式是架构改造中常写的“降幅计算”:拿旧方案的延迟减去新方案的延迟,再除以旧方案延迟,得到百分比。
  1. $T_{\text{传统}}$迁移前 Sidecar 模式下的平均或尾延迟。
    T传统T_{\text{传统}}
  2. $T_{\text{Cilium}}$迁移后 eBPF 数据面下的延迟。
    TCiliumT_{\text{Cilium}}
  3. 除以 $T_{\text{传统}}$用差值相对于原延迟的比例,消除绝对数值带来的干扰。
    T传统−TCiliumT传统\frac{T_{\text{传统}} - T_{\text{Cilium}}}{T_{\text{传统}}}
  4. 乘以 100\%将比例换算为百分比,便于汇报和对比。
    ×100%\times 100\%

AI 应用场景

金融交易链路低延迟改造

阶段:数据面优化

解决的问题:在金融交易系统中,传统 Sidecar 的每一跳代理都会增加毫秒级延迟,直接影响用户下单体验和交易成功率。对于高频交易和在线支付,微秒级延迟差异都可能是巨大损失。Cilium 用 eBPF 把流量转发下沉到内核,减少用户态切换,让交易请求走“内核直通快速路”。

具体案例:某券商容器云平台原先使用 Istio 管理订单服务的灰度流量,调用链路由 Sidecar 代理后 P99 延迟明显上升。他们将核心链路切换到 Cilium Service Mesh,保留少量 Envoy 处理复杂 L7 策略,最终在同等负载下 P99 延迟降低约 30%,CPU 占用也大幅下降。

大规模微服务安全策略治理

阶段:安全策略执行

解决的问题:大型电商或 AI 推理平台有成百上千个微服务,基于 IP 的安全策略在 Pod 频繁扩缩容时难以维护。Cilium 使用身份标签定义网络策略,让“哪个服务可以访问哪个服务”的规则不再依赖 IP 白名单,而是跟随标签自动随 Pod 重建生效。

具体案例:一个多团队共享的 Kubernetes 集群中,多个 AI 模型推理服务需要隔离访问。团队为每个模型服务打上“模型类型”标签,配置 Cilium L3/L4 策略,确保只有指定调用方可以访问对应模型的推理接口。Pod 重启、扩容后策略仍然自动适用。

云原生可观测性建设

阶段:可观测性

解决的问题:传统微服务监控依赖业务埋点和日志采集,接入成本高且容易漏数据。Cilium 的 Hubble 直接从内核采集流量指标和事件,无需修改应用代码,就能展示服务调用拓扑和异常流量,特别适合 AI 推理这类网络敏感型系统。

具体案例:某推荐系统在 Kubernetes 上部署了多个推理服务,遇到线上响应变慢时,团队使用 Hubble 查看服务依赖图和 TCP 丢包率,快速定位到某个存储服务的限流配置问题,整个过程没有改动任何业务代码。

Python 演示

python49 行
import randomimport statistics SIDECAR_HOP_MS = 2.0EBPF_HOP_MS = 0.5REQUEST_NUM = 1000  def percentile(sorted_data, p):    if not sorted_data:        return 0.0    k = (len(sorted_data) - 1) * p    f = int(k)    c = f + 1 if f + 1 < len(sorted_data) else f    return sorted_data[f] + (sorted_data[c] - sorted_data[f]) * (k - f)  def simulate_sidecar(requests):    latencies = []    for req in requests:        # 经过 2 个 sidecar, 每个 sidecar 转发 2 次        delay = SIDECAR_HOP_MS * 4 + req["payload_size"] / 1000.0        latencies.append(delay)    return latencies  def simulate_cilium(requests):    latencies = []    for req in requests:        # 内核收包 + eBPF 决策 + 内核发包        delay = EBPF_HOP_MS * 2 + req["payload_size"] / 10000.0        latencies.append(delay)    return latencies  if __name__ == "__main__":    random.seed(42)    requests = [        {"id": i, "payload_size": random.randint(100, 2000)}        for i in range(REQUEST_NUM)    ]    sidecar_list = sorted(simulate_sidecar(requests))    cilium_list = sorted(simulate_cilium(requests))    sidecar_p95 = percentile(sidecar_list, 0.95)    cilium_p95 = percentile(cilium_list, 0.95)    speedup = statistics.mean(sidecar_list) / statistics.mean(cilium_list)    print("sidecar p95: %.2f ms" % sidecar_p95)    print("cilium p95: %.2f ms" % cilium_p95)    print("speedup: %.2f x" % speedup)
目的:用 Python 模拟 Sidecar 模式与 Cilium eBPF 数据面的延迟差异,帮助你直观理解为什么去掉用户态代理能显著降低尾延迟。
  1. delay = SIDECAR_HOP_MS * 4 + req["payload_size"] / 1000.0模拟 Sidecar 路径中 4 次用户态代理跳转,再加上载荷大小带来的序列化开销。
  2. delay = EBPF_HOP_MS * 2 + req["payload_size"] / 10000.0模拟 Cilium 路径只有内核收包和发包两个核心步骤,载荷影响也更小。
  3. percentile(sorted_data, 0.95)计算 P95 延迟,衡量真实生产环境中尾部请求的表现。
  4. random.seed(42)固定随机数种子,让每次运行结果可复现,便于基准对比。
  5. statistics.mean(sidecar_list) / statistics.mean(cilium_list)计算平均延迟加速比,量化验证数据面优化的效果。

常见误区

误区我一开始以为 eBPF 和普通 Web 服务一样,是一段运行在用户态的代码,靠某种框架接收网络事件然后处理。

正解eBPF 程序运行在内核态的虚拟机中,虽然它由用户态加载,但执行位置在内核网络栈或跟踪点附近。它不需要把数据包一层层拷贝到用户态再处理,这正是它能做到低延迟的关键。用户可以把它想象成安装在道路内部的传感器,而不是坐在路边的办公室里看监控。

为何常见:因为大多数初学者接触的程序都在用户态运行,eBPF 又由用户态工具加载,所以很容易把加载方式和运行位置混为一谈。

误区很多文章说 Cilium 替代 Sidecar,所以我会以为 Cilium Service Mesh 中不存在或不允许使用 Envoy。

正解Cilium 默认数据面使用 eBPF,但在某些复杂的 L7 场景下仍然可以集成 Envoy 来处理深度协议解析、TLS 终止、复杂重试熔断等逻辑。区别在于 Envoy 不再作为每个业务 Pod 旁边都有的常驻调度员,而是按需部署的“特殊检查站”。Cilium 的目的不是消灭代理,而是让代理回归到真正需要它的场景。

为何常见:技术宣传往往强调替代关系,容易让人忽略“替代一部分职责”和“完全替代”之间的区别。

误区有人觉得 eBPF 就是更轻量的内核模块,依然可以随意访问内核内存,改坏就重启机器。

正解eBPF 与内核模块有本质差异。eBPF 程序由验证器强制检查内存访问边界、指令数量和运行时长,运行在受限的虚拟机环境中,不能任意修改内核数据结构,也不能无限循环。它更像是经过安全检查后嵌入路口的传感器,而不是可以随便打穿墙壁的施工队。

为何常见:因为两者都“跑在内核里”,初学者容易忽略安全模型的巨大差异,而安全性恰恰是 eBPF 能大规模普及的前提。

误区只要安装 Cilium,Service Mesh 就能自动达到最佳性能,不需要考虑内核版本、网络策略、可观测性迁移和旧代理逻辑。

正解迁移到 Cilium 需要逐步验证。内核版本要满足 eBPF 特性要求,存量 iptables 规则和网络策略需要梳理,原本依赖 Sidecar 访问日志的监控系统也要过渡到 Hubble。安装只是开始,真正的改造是让业务流量和策略模型适配新的实现方式。

为何常见:因为 Cilium 的安装指令简单,容易让人低估生产环境迁移中兼容性测试和历史资产梳理的复杂度。

面试题

Q1. eBPF 程序运行在什么位置?

单选题 · easy

  • A.用户态沙箱中
  • B.内核态虚拟机中← 正确答案
  • C.容器运行时中
  • D.物理网卡固件中

答案:B。eBPF 程序由用户态加载,但实际运行在内核态的虚拟机中。它通过验证器检查后执行,可以安全扩展内核能力。A 是普通进程的位置,C 是容器运行环境,D 不构成通用执行位置。

Q2. 传统 Sidecar 数据面延迟高的根本原因是什么?

单选题 · mid

  • A.编程语言性能差
  • B.请求需在用户态代理间跳转← 正确答案
  • C.缺少负载均衡能力
  • D.无法处理 HTTPS 流量

答案:B。Sidecar 模式要求数据包从内核态进入用户态代理,再由代理转发回内核态,每次请求至少经过两次用户态代理跳转。这种上下文切换和数据复制是延迟的主要来源。语言、负载均衡和 HTTPS 都不是根本原因。

Q3. eBPF 程序能安全在内核运行,依赖哪些保障?

多选题 · mid

  • A.静态验证器检查越界访问← 正确答案
  • B.人工审核每行源码
  • C.沙箱隔离与受限指令集← 正确答案
  • D.禁止读取任何网络数据

答案:AC。eBPF 的安全性来自内核验证器的静态分析和沙箱执行模型。验证器检查指令边界、栈访问和内存安全,沙箱限制指令集。人工审核不是常态机制,eBPF 也不可能禁止读取网络数据,否则无法处理流量。

Q4. Hubble 组件在 Cilium 中的主要职责是什么?

单选题 · easy

  • A.提供流量可观测性← 正确答案
  • B.替代容器运行时
  • C.执行镜像扫描
  • D.管理持久化存储

答案:A。Hubble 是 Cilium 的可观测性层,通过 eBPF 采集网络流量数据、服务依赖关系和策略拒绝事件。它不负责容器运行、镜像安全或存储管理。

Q5. Cilium 用什么标识微服务身份?

单选题 · mid

  • A.Pod 的 IP 地址
  • B.安全身份标签← 正确答案
  • C.用户自定义密码
  • D.容器镜像名称

答案:B。Cilium 基于 Kubernetes 标签生成安全身份标识,网络策略根据身份而不是 IP 判断。Pod IP 在云原生环境中经常变化,不适合作为稳定安全边界。

Q6. Cilium eBPF 加速数据面的优势有哪些?

多选题 · mid

  • A.减少用户态切换← 正确答案
  • B.增加数据包复制
  • C.降低内存拷贝← 正确答案
  • D.简化网络转发路径← 正确答案

答案:ACD。eBPF 把处理逻辑放在内核态,避免数据包反复进入用户态代理,从而减少上下文切换和内存拷贝,转发路径更短。数据包复制不会因为 eBPF 而增加,反而应该减少。

Q7. eBPF Map 在 Cilium 中的主要作用是?

单选题 · hard

  • A.存储内核数据并共享统计信息← 正确答案
  • B.替代 Kubernetes API Server
  • C.给 Pod 提供持久化存储
  • D.保存容器日志文件

答案:A。BPF Map 是 eBPF 程序与用户态程序共享数据的数据结构,Cilium 用它保存策略规则、负载均衡后端信息和统计指标。它不是 API Server、持久化存储或日志系统的替代品。

Q8. 传统 Sidecar 代理通常部署在哪里?

单选题 · easy

  • A.与业务容器同 Pod← 正确答案
  • B.独立专用集群
  • C.宿主机的内核模块
  • D.云厂商控制平面

答案:A。Sidecar 模式中代理以独立容器形式与业务容器共享同一个 Pod,因此流量可以通过本地回环进入代理。它不是部署在独立集群或内核中,更不属于云厂商控制平面。

Q9. 从传统 Service Mesh 迁移到 Cilium 前需要关注哪些问题?

多选题 · hard

  • A.内核版本是否满足要求← 正确答案
  • B.存量 iptables 规则如何兼容← 正确答案
  • C.现有监控链路是否需要调整← 正确答案
  • D.Pod 数量必须少于一百个

答案:ABC。Cilium 依赖较新的内核特性,迁移前要评估内核版本;存量 iptables 规则和传统 Sidecar 访问日志监控也需要转换到 Cilium 的策略与 Hubble 体系。迁移与 Pod 数量没有硬性上限关系。

Q10. XDP 钩子相比 tc 钩子在收包路径上的特点是?

单选题 · extreme

  • A.更早地处理网卡收到的报文← 正确答案
  • B.只能处理已进入 socket 的流量
  • C.必须经过用户态转发
  • D.不支持任何丢包动作

答案:A。XDP 挂载在网络驱动层入口,报文刚从网卡到达时就能处理,所以比 tc 更早。它可以直接做丢包、转发等动作,不需要经过用户态,也不是只能处理 socket 流量。