编程 eBPF + Cilium 深度拆解:当内核开始「可编程」——从 XDP 数据面、kube-proxy 替换到 Hubble 可观测与 Tetragon 运行时安全的工程全貌(2026)

2026-07-18 13:48:20 +0800 CST views 3

eBPF + Cilium 深度拆解:当内核开始「可编程」——从 XDP 数据面、kube-proxy 替换到 Hubble 可观测与 Tetragon 运行时安全的工程全貌(2026)

如果你在 2026 年还在用 iptables 管 Kubernetes 网络、用 kube-proxy 转发 Service、用一堆 Sidecar 做可观测和安全,那这篇文章值得你花 20 分钟看完。

不是因为 iptables 不好——它陪伴 Linux 网络二十年,稳得一批。而是因为云原生场景把 iptables 的设计前提彻底击穿了:Pod 生命周期以秒计、Service 数量以万计、东西向流量以百万连接计。当规则从几百条膨胀到几十万条,当一条 kubectl apply 要触发整张规则表的重写,iptables 的 O(n) 复杂度就成了集群的「高血压」。

解药不是换一个更聪明的用户态程序,而是把逻辑下沉到内核里——这正是 eBPF 在做的事,也正是 Cilium 把它产品化的方式。


一、背景:为什么内核需要「可编程」

1.1 传统内核扩展的三道枷锁

Linux 内核是地球上最复杂的单体软件之一。过去如果你想「改内核的行为」,基本只有三条路,每一条都代价高昂:

  1. 改内核源码,重新编译内核。代价:上线周期以月计,且你改的逻辑要和主线持续对抗。
  2. 写内核模块(LKM)。代价:模块和内核版本强绑定,一个 API 变动就 insmod 失败;模块里一个空指针解引用就是一次内核 panic,整台机器直接躺平。
  3. 用户态抓包/Netfilter 钩子。代价:数据要在内核态和用户态之间反复拷贝,上下文切换吃掉大量 CPU;规则匹配是线性的,规模一大就崩。

核心矛盾是:我们既想安全地扩展内核能力,又不想承担「崩内核」的风险,还不想付出「内核态/用户态来回搬数据」的性能税。 2014 年从 BPF(Berkeley Packet Filter)演化而来的 eBPF(extended BPF),就是为这个矛盾而生的。

1.2 eBPF 的工程定义

一句话:eBPF 是一套运行在 Linux 内核中的沙箱化、事件驱动的 bytecode 虚拟机。你用 C(或 Rust)写一段小程序,编译成 eBPF 字节码,加载进内核,挂到特定的「钩子点」上;当那个事件发生时(收到一个数据包、发起一次系统调用、打开一个文件……),内核就执行你的程序。

关键点在于——它不修改内核源码,也不加载内核模块。程序在加载前必须经过内核「验证器(Verifier)」的严格审查,证明它:不会死循环、不会越界访问内存、不会崩溃、会在有限指令内结束。审查通过后再由 JIT 编译成原生机器码,执行效率和手写内核代码无异。

这就同时解决了三件事:安全(沙箱 + 验证器)、可编程(无需改内核)、高性能(JIT + 零拷贝)。

1.3 Cilium:把 eBPF 从「玩具」变成「生产基础设施」

eBPF 是底层能力,但绝大多数团队没有精力自己写一套完整的 CNI、负载均衡、网络策略和可观测系统。Cilium(CNCF 毕业项目,由 Isovalent 创立,现归属独立社区与多家厂商共同维护)做的事,就是用 eBPF 重写 Kubernetes 网络栈的每一个关键环节,并以声明式 API 暴露给开发者。

截至 2026 年 7 月,Cilium 的受支持版本线为 1.17.x / 1.18.x / 1.19.x,项目定位是 "eBPF-based Networking, Security, and Observability",覆盖能力包括:高性能 CNI、L4 负载均衡、Cluster Mesh 多集群互联、带宽与延迟优化、kube-proxy 替换、BGP、Egress Gateway、Service Mesh、Hubble 可观测、Tetragon 运行时安全。


二、核心概念:eBPF 的五脏六腑

要真正读懂 Cilium,必须先吃透 eBPF 的几个核心抽象。

2.1 钩子点(Hook Points):事件从哪来

eBPF 程序不是「常驻运行」的,而是挂在钩子上、事件驱动。常见的挂载点决定了你能「看见」什么:

钩子类型挂载位置典型用途
XDP(eXpress Data Path)网卡驱动刚收到包、协议栈之前最早、最快的包处理:DDoS 防护、负载均衡、丢包
TC(Traffic Control)内核协议栈的 ingress/egress容器网络、流量整形、L3/L4 策略
kprobe / kretprobe任意内核函数入口/返回内核行为追踪、排障
tracepoint内核静态埋点稳定、低开销的可观测
LSM(Linux Security Module)安全决策点(如 file_open运行时安全、强制访问控制
fentry / fexit内核函数边界(需 BTF)比 kprobe 更稳的性能分析
uprobe用户态程序函数追踪 Nginx/Envoy 等应用

Cilium 的 datapath 主要吃 XDP + TC 这两块:入向流量在 XDP 层做最快的负载均衡和早期过滤,剩余的在 TC 层做完整的网络策略、NAT、连接跟踪。

2.2 Map:内核态与用户态之间的「共享内存」

eBPF 程序跑在内核态,你的控制程序跑在用户态,它们靠什么通信?答案是 BPF Map——一种键值对形式的内核数据结构,可以被 eBPF 程序读写,也可以被用户态程序通过 bpf() 系统调用读写。

Map 的类型很多:HASHARRAYLRU_HASHPERCPU_HASH(每 CPU 一个副本,避免原子竞争)、RINGBUF(高性能事件流)、Sockmap(套接字重定向)等。

实战中的关键技巧:eBPF 程序里做计数一定要用 PERCPU_HASH__sync_fetch_and_add,否则多核并发会让你数出来的数字远小于真实值。这正是下面代码里用 __sync_fetch_and_add 的原因。

2.3 验证器(Verifier):eBPF 的「安全闸门」

验证器是 eBPF 区别于「内核模块」的灵魂。它做 DAG 可达性分析 + 路径模拟执行,确保:

  • 所有内存访问都经过边界检查(借助 bpf_probe_read/skb_load_bytes 等受控 helper);
  • 没有不可达的死代码,也没有无法终止的循环(早期 eBPF 禁止循环,后来通过有界循环 + 状态剪枝放开);
  • 栈使用不超过 512 字节(早期限制,新内核已放宽到 8KB+)。

验证器越严格,你写 eBPF 越「束手束脚」——但正是这种束手束脚,保证了它不会像内核模块那样一写崩全盘。

2.4 JIT、Helper 与 BTF/CO-RE

  • JIT 编译器:验证通过后,字节码被 JIT 成宿主 CPU 的原生指令(x86/ARM64 等),执行路径与内核原生代码几乎无差。
  • Helper 函数:eBPF 程序不能直接调用任意内核函数,只能通过白名单式的 bpf_* helper(如 bpf_map_lookup_elembpf_ktime_get_nsbpf_get_current_pid_tgid)。这是「能力收口」的另一道保险。
  • BTF(BPF Type Format)+ CO-RE(Compile Once - Run Everywhere):这是 eBPF 可移植性的关键。BTF 把内核的数据结构布局以调试信息形式导出,eBPF 程序在加载时根据目标内核的 BTF 重定位字段偏移,于是同一份编译产物可以跑在任意版本内核上,不再需要每内核一套编译。Cilium 的完整 datapath 就重度依赖 CO-RE。

三、架构分析:Cilium 如何用 eBPF 重写 K8s 网络栈

3.1 组件全景

                         Kubernetes API Server
                                  │ (watch Services/Endpoints/Policies)
                                  ▼
                      ┌─────────────────────────┐
                      │      cilium-operator     │  ← 集群级编排:IPAM、KVStore、节点生命周期
                      └─────────────────────────┘
                                  │
        ┌─────────────────────────┴─────────────────────────┐
        ▼                                                   ▼
  ┌──────────────┐  (per-node)                       ┌──────────────┐
  │  cilium-agent │ ◀── 编译/加载 eBPF 程序到本机      │  cilium-agent │
  │  (每个节点)   │     维护 BPF Maps、网络策略        │  (每个节点)   │
  └──────────────┘                                   └──────────────┘
        │ eBPF datapath: XDP + TC                     │
        ▼                                             ▼
  ┌──────────────────────────────────────────────────────────┐
  │                 Kernel: eBPF Programs + Maps               │
  │   XDP: 早期 LB / 丢包     TC: 策略/NAT/Conntrack/SNAT       │
  └──────────────────────────────────────────────────────────┘
        │                        │
        ▼                        ▼
   Hubble (可观测: L3/L4/L7 流 + 服务依赖图)   Tetragon (运行时安全:  syscall/kprobe 级事件)
  • cilium-agent:每个节点一个 DaemonSet,负责本机 eBPF 程序的编译、加载、热更新,把 K8s 的 Service/Endpoint/NetworkPolicy 翻译成 BPF Map 里的条目。
  • cilium-operator:集群级单实例,负责 IP 地址管理(IPAM)、KVStore 后端协调、节点初始化等。
  • Hubble:Cilium 内置的可观测层,基于 eBPF 直接拿到「谁在和谁说话、用了什么 HTTP 方法、状态码多少」,无需 Sidecar。
  • Tetragon:Cilium 家族的运行时安全组件,用 LSM/kprobe/eBPF 在内核里直接看见(甚至拦截)进程、文件、网络行为。

3.2 kube-proxy 替换:从 O(n) 到 O(1) 的革命

这是 Cilium 最常被拿来「秀肌肉」的能力。传统 kube-proxy 的 iptables 模式工作方式:

  1. 每个 Service 对应一组 iptables 规则;
  2. 每个 Pod 访问 Service 的 ClusterIP 时,iptables 从规则链头一路匹配到目标后端;
  3. 规则总数 = Service 数 × 后端 Pod 数,规模一大就是几十万条;
  4. 每次 Service 变更,kube-proxy 要重写整张规则表——O(n) 的代价。

Cilium 的 kubeProxyReplacement 把这件事搬进 eBPF:

  • Service 和后端 Endpoints 被写成 BPF Map 里的键值对(key=Service 标识,value=后端地址列表);
  • 数据包到达时,eBPF 程序用 O(1) 哈希查找直接拿到后端,并在 XDP/TC 层完成 DNAT;
  • 后端变更只是更新 Map 里的一条 value,不需要重写任何规则

效果(以下为社区与生产环境常见的量级对比,具体数值随内核版本、网卡、集群规模浮动,仅作趋势参考):

指标kube-proxy(iptables)Cilium eBPF趋势
Service 发现 P99 延迟数百 ms 级个位数 ms 级显著下降
TCP 连接建立时间数 ms亚 ms明显下降
网络策略检查开销随规则线性增长Map 常量查询O(1)
节点 CPU(大量规则下)高(内核态规则匹配)显著下降

注意:上面是量级趋势,不是某次固定 benchmark 的承诺数字。不同硬件差异极大,但 O(n)→O(1) 这一结构性优势是确定的。

3.3 连接跟踪、SNAT 与 Bandwidth Manager

Cilium 还在 eBPF 里实现了:

  • 连接跟踪(conntrack):用 BPF Map 记录「这条连接该往哪走」,回包直接命中,无需重新查策略;
  • eBPF 原生 masquerade(SNAT):Pod 访问集群外时,在 eBPF 层完成源地址转换,替代 iptables 的 MASQUERADE;
  • Bandwidth Manager:基于 EDT(Earliest Departure Time)的公平队列,给每个 Pod/cgroup 做带宽限速,避免「一个 Pod 把网卡打满」。

四、代码实战:亲手写一个 eBPF 防火墙并跑起来

光说不练假把式。下面我们从零写一个 XDP 层 IP 黑名单防火墙:用 C 写 eBPF 程序,用 Go + cilium/ebpf 库加载,并在网卡驱动层直接丢包。

4.1 eBPF 程序(C)

// xdp_firewall.c
// 编译: clang -O2 -g -target bpf -c xdp_firewall.c -o xdp_firewall.o
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_endian.h>

char LICENSE[] SEC("license") = "GPL";

#define MAX_BLOCKLIST 1024

// 黑名单: key=IPv4 源地址(网络字节序), value=占位 1
struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __uint(max_entries, MAX_BLOCKLIST);
    __type(key, __u32);
    __type(value, __u8);
} blocklist SEC(".maps");

// 丢包计数器: 用单元素 ARRAY
struct {
    __uint(type, BPF_MAP_TYPE_ARRAY);
    __uint(max_entries, 1);
    __type(key, __u32);
    __type(value, __u64);
} drop_count SEC(".maps");

SEC("xdp")
int xdp_firewall(struct xdp_md *ctx) {
    void *data_end = (void *)(long)ctx->data_end;
    void *data     = (void *)(long)ctx->data;
    struct ethhdr *eth = data;
    if ((void *)(eth + 1) > data_end)
        return XDP_PASS;

    // 只处理 IPv4,其余放行
    if (eth->h_proto != bpf_htons(ETH_P_IP))
        return XDP_PASS;

    struct iphdr *ip = (void *)(eth + 1);
    if ((void *)(ip + 1) > data_end)
        return XDP_PASS;

    // 在 XDP 层查询黑名单(哈希 O(1))
    __u32 src = ip->saddr;
    if (bpf_map_lookup_elem(&blocklist, &src)) {
        __u32 key = 0;
        __u64 *cnt = bpf_map_lookup_elem(&drop_count, &key);
        if (cnt)
            __sync_fetch_and_add(cnt, 1);   // 多核安全计数
        return XDP_DROP;   // 在网卡驱动层直接丢弃,根本不进内核协议栈
    }
    return XDP_PASS;
}

几个要点:

  • SEC("xdp") 标记这是 XDP 钩子程序;SEC(".maps") 标记这是 Map 定义。
  • 所有指针解引用前都要做边界检查(void *)(x+1) > data_end),否则验证器直接拒载。
  • XDP_DROP 意味着包在最早阶段就被丢弃,CPU 几乎零成本——这是 iptables 在协议栈深处丢包比不了的。

4.2 Go 加载器(cilium/ebpf)

// main.go
package main

import (
    "log"
    "net"
    "os"
    "os/signal"
    "syscall"
    "time"

    "github.com/cilium/ebpf"
    "github.com/cilium/ebpf/link"
    "github.com/cilium/ebpf/rlimit"
)

func main() {
    // 1. 放开 bpf 内存锁限制(生产请用 systemd 而非运行时放开)
    if err := rlimit.RemoveMemlock(); err != nil {
        log.Printf("warning: remove memlock: %v", err)
    }

    // 2. 加载编译好的 ELF 对象
    spec, err := ebpf.LoadCollectionSpec("xdp_firewall.o")
    if err != nil {
        log.Fatalf("load spec: %v", err)
    }
    coll, err := ebpf.NewCollection(spec)
    if err != nil {
        log.Fatalf("new collection: %v", err)
    }
    defer coll.Close()

    // 3. 找到目标网卡并 attach 到 XDP 钩子
    iface, err := net.InterfaceByName("eth0")
    if err != nil {
        log.Fatalf("interface: %v", err)
    }
    l, err := link.AttachXDP(link.XDPOptions{
        Interface: iface.Index,
        Program:   coll.Programs["xdp_firewall"],
        Flags:     link.XDPDriver, // 优先 native 驱动模式,性能最好
    })
    if err != nil {
        log.Fatalf("attach xdp: %v", err)
    }
    defer l.Close()

    // 4. 向黑名单 Map 写入一条待拦截的源 IP
    bl := coll.Maps["blocklist"]
    ip := net.ParseIP("203.0.113.66").To4()
    var v uint8 = 1
    if err := bl.Put(ip, &v); err != nil {
        log.Fatalf("put blocklist: %v", err)
    }

    // 5. 周期读取丢包计数
    drop := coll.Maps["drop_count"]
    key := uint32(0)
    log.Println("XDP firewall running, Ctrl+C to exit")
    stop := make(chan os.Signal, 1)
    signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)
    go func() {
        for range time.Tick(2 * time.Second) {
            var cnt uint64
            _ = drop.Lookup(&key, &cnt)
            log.Printf("dropped packets: %d", cnt)
        }
    }()
    <-stop
}

运行前先编译 eBPF 对象(需要 clangbpftool/libbpf 头文件):

# 安装依赖(Ubuntu/Debian 示例)
sudo apt install -y clang llvm libbpf-dev linux-headers-$(uname -r)

# 编译 eBPF 对象
clang -O2 -g -target bpf -c xdp_firewall.c -o xdp_firewall.o

# 运行 Go 加载器(需 root)
go mod init xdpfw && go get github.com/cilium/ebpf
sudo go run main.go

跑起来后,凡是源 IP 为 203.0.113.66 的包都会在网卡驱动层被丢弃,而用户态只负责「往 Map 里塞一条 IP」——这就是 eBPF 的核心范式:控制面在用户态,数据面在内核态,二者靠 Map 解耦

4.3 在生产里落地 Cilium(Helm)

真实集群里你不会手写 eBPF,而是用 Cilium 的成熟 datapath。最小可落地的 Helm 安装(启用 kube-proxy 替换、Hubble、带宽管理):

helm repo add cilium https://helm.cilium.io/
helm repo update

helm install cilium cilium/cilium --version 1.17.0 \
  --namespace kube-system \
  --set kubeProxyReplacement=true \
  --set k8sServiceHost=10.96.0.1 \
  --set k8sServicePort=6443 \
  --set devices='{eth0}' \
  --set bandwidthManager.enabled=true \
  --set bpf.masquerade=true \
  --set Hubble.relay.enabled=true \
  --set Hubble.ui.enabled=true \
  --set Hubble.peerService.enabled=true

装好后验证:

# 确认 kube-proxy 已被替换
kubectl -n kube-system exec ds/cilium -- cilium status | grep KubeProxyReplacement

# 确认 eBPF 程序已挂载
cilium bpf lb list        # 看 Service -> 后端的 Map

4.4 用 CiliumNetworkPolicy 做 L3/L4/L7 策略

Cilium 的网络策略比原生 NetworkPolicy 强在能做 L7(HTTP/gRPC/Kafka)级控制,而且无需 Sidecar

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: api-allow-frontend
  namespace: default
spec:
  endpointSelector:
    matchLabels:
      app: api-server
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: frontend
    toPorts:
    - ports:
      - port: "8080"
        protocol: TCP
      rules:
        http:
        - method: GET
          path: "/api/v1/products"   # 只允许 GET 这个路径
        - method: POST
          path: "/api/v1/orders"

这条策略的意思是:只有带 app: frontend 标签的端点,才能对 app: api-server 的 8080 端口发请求,且 HTTP 层只允许规定的 method + path。L7 解析由 Cilium 的 eBPF 数据面 + 可选的 Envoy 代理协作完成,远比 iptables 的「端口通杀」精细。

4.5 Hubble:不靠 Sidecar 的服务可观测

Hubble 直接从 eBPF 拿到流元数据,用 hubble CLI 就能看见服务依赖与流量:

# 端口转发 Hubble UI
kubectl -n kube-system port-forward svc/hubble-ui 12000:80

# 命令行看某命名空间的实时流
hubble observe --namespace default --follow
# 只看被策略拒绝的
hubble observe --verdict DROPPED --protocol http

你会看到形如 frontend pod1 -> api-server pod3:http GET /api/v1/products -> 200 的流记录——全部来自内核 eBPF,不消耗任何应用侧资源

4.6 Tetragon:在内核里「看见并拦截」危险行为

Tetragon 用 eBPF/LSM 做运行时安全。下面这条 TracingPolicy 在文件被打开时检查路径,对 /tmp/evil 直接在内核里覆写返回值拒绝打开:

apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
  name: "block-sensitive-file"
spec:
  kprobes:
  - call: "security_file_open"
    syscall: false
    args:
    - index: 0
      type: "file"
    selectors:
    - matchArgs:
      - index: 0
        operator: "Equal"
        values:
        - "/tmp/evil"
      matchActions:
      - action: Override
        argError: -1    # 直接在内核返回 -EPERM,进程层面 open() 失败

这比用户态的「文件完整性监控」快了一个数量级——攻击刚要 open(),内核就已经把它摁住了,连系统调用都没真正完成。


五、性能优化:为什么 eBPF 这么快,以及怎么调

5.1 快的本质

eBPF 的快不是玄学,来自四个结构性原因:

  1. O(1) 查找替代 O(n) 线性匹配:Service/策略/黑名单全部是 Map 哈希查找,和规则数量无关。
  2. 零拷贝、少上下文切换:数据在内核态直接处理,不用 skb → 用户态 → skb 来回搬。
  3. XDP 早期处理:在网卡驱动层就做 LB/丢包,最热的路径最短。
  4. JIT 原生执行:验证后的字节码直接编译成机器码,没有解释器开销。

5.2 生产调优清单

# 1. 启用 kube-proxy 替换(结构性收益最大)
--set kubeProxyReplacement=true

# 2. 启用带宽管理(EDT 公平队列),防止单 Pod 打满网卡
--set bandwidthManager.enabled=true

# 3. 启用 eBPF 原生 masquerade(替代 iptables MASQUERADE)
--set bpf.masquerade=true

# 4. 直连节点路由(同二层网络下跳过 overlay)
--set autoDirectNodeRoutes=true

# 5. 指定网卡设备,避免通配抓错
--set devices='{eth0}'

# 6. 大集群调高 Map 容量,避免后端数量触顶
--set bpf.mapsMax=256  # 视规模调整
# 运行期排查工具
cilium status --verbose        # 总体健康
cilium bpf lb list             # Service 映射
cilium bpf ct list             # 连接跟踪表
bpftool net xdp show           # 查看 XDP 挂载
bpftool prog list              # 查看所有已加载 eBPF 程序

5.3 一个常被忽略的坑:验证器失败

当你自己写 eBPF 时,最常见的报错是 permission deniedinvalid mem access。99% 是验证器认为你的内存访问不安全。排障顺序:

  1. 确认所有指针解引用前有 > data_end 边界检查;
  2. 确认没有未初始化变量的分支使用;
  3. llvm-objdump -S xdp_firewall.o 看编译产物;
  4. 内核太老(< 4.19)会缺大量 helper,生产建议 5.10+(Cilium 官方推荐 5.10/6.x)。

六、总结与展望:eBPF 正在「吞噬」内核

回看 2026 年的基础设施版图,eBPF 已经不是「可观测性小工具」,而是重构整个 Linux 内核交互方式的主干技术

  • 网络:Cilium 用 eBPF 替换了 kube-proxy、iptables、kube-router,甚至把 Service Mesh 的 Sidecar 也「干掉」了一部分(Cilium Service Mesh 走 eBPF + 可选 Envoy,控制面更轻);
  • 安全:Tetragon / Tracee 用 eBPF 在内核做运行时防护,比用户态 HIDS 更快更全;
  • 可观测:Pixie、Hubble、Parca 用 eBPF 零侵入拿指标、追踪、火焰图;
  • 存储/调度:从文件系统到调度器,eBPF 的钩子点还在继续扩张。

对工程师的务实建议:

  1. 如果你管 Kubernetes 网络:Cilium 1.17+ 已经是「默认更优解」,尤其是规模超过几十节点后,kube-proxy 替换带来的 O(1) 收益肉眼可见。
  2. 如果你想深入 eBPF 编程:loader 生态三选一——C + libbpf(最贴近内核)、Go + cilium/ebpf(工程化最舒服,本文即采用)、Rust + Aya(无 libbpf 依赖、纯 Rust 体验)。先从一个 XDP 小程序开始,再读 Cilium 的 datapath 源码,成长曲线最陡。
  3. 不要神话它:eBPF 不是银弹。验证器限制、内核版本依赖、调试难度都比用户态高。能用户态解决的,别硬上 eBPF;但凡是「高频、内核态、需零拷贝」的场景,eBPF + Cilium 几乎是无可替代的答案。

最后一句大实话:内核「可编程」这扇门一旦打开,就再也关不上了。2026 年的我们,只是站在了这场基础设施范式转移的早期。早理解 eBPF,早一天从「被 iptables 规则淹没」的运维泥潭里爬出来。


参考与延伸

  • Cilium 官方文档与 GitHub(cilium/cilium,当前受支持 1.17/1.18/1.19)
  • eBPF 官方文档(ebpf.io)、BPF 与 BTF/CO-RE 设计文档
  • cilium/ebpf Go 库、libbpfAya(Rust) loader 生态
  • Hubble / Tetragon 项目文档
  • 社区性能基准(注意:具体数值随内核、网卡、集群规模浮动,本文性能对比为量级趋势参考)
复制全文 生成海报 eBPF Cilium 云原生 Kubernetes 可观测性

推荐文章

php机器学习神经网络库
2024-11-19 09:03:47 +0800 CST
页面不存在404
2024-11-19 02:13:01 +0800 CST
PHP服务器直传阿里云OSS
2024-11-18 19:04:44 +0800 CST
SQL常用优化的技巧
2024-11-18 15:56:06 +0800 CST
程序员茄子在线接单