技术博客

eBPF + Cilium 2026 生产实战:零侵入可观测性与内核级安全

2026 年,eBPF 已从实验性技术成为云原生基础设施的核心组件。Cilium 成为使用最广泛的 Kubernetes CNI,Hubble 提供无需修改应用代码的网络流量全景视图,Tetragon 实现基于 eBPF 的运行时安全策略。本文从生产角度讲解:Cilium 安装与替换 kube-proxy、Hubble 网络可观测性配置与使用、Tetragon 安全策略实战(进程/文件/网络三层检测),以及 eBPF 在 2026 年的最新进展。

eBPFCiliumHubbleTetragonKubernetes可观测性网络安全云原生

eBPF(Extended Berkeley Packet Filter)允许在 Linux 内核中安全地运行沙箱程序,无需修改内核代码,也不需要加载内核模块。

2026 年,这项技术已经不再需要介绍“它是什么”——Google、Microsoft、AWS 的生产 Kubernetes 集群都在用基于 eBPF 的 CNI,Cilium 成为整个 CNCF 生态中部署规模最大的 CNI 实现之一。

本文关注怎么用,从安装到生产可观测性再到安全策略,给出可直接操作的配置。


2026 年的 eBPF 生态

三个核心场景已经成熟:

1. 网络(Cilium CNI)
   替换 kube-proxy,直接在内核处理 Service 转发
   性能比 iptables 高出 50%+
   支持 L3/L4/L7 网络策略

2. 可观测性(Hubble)
   零侵入:不改一行应用代码
   自动采集所有 HTTP/gRPC/DNS 流量
   服务依赖拓扑图、实时流量分析

3. 安全(Tetragon)
   内核级进程执行监控
   文件访问审计
   网络连接实时阻断
   
推荐内核版本:Linux 6.1+(部分高级功能需要 6.6+)

安装 Cilium(替换 kube-proxy)

前置检查

# 检查内核版本(需要 >= 5.10,推荐 6.1+)
uname -r

# 检查 eBPF 相关内核配置
grep -E "CONFIG_BPF|CONFIG_CGROUP_BPF" /boot/config-$(uname -r)
# 应该看到 CONFIG_BPF=y, CONFIG_BPF_SYSCALL=y 等

# 安装 cilium CLI
curl -L --remote-name-all \
  https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz
tar xzvf cilium-linux-amd64.tar.gz
mv cilium /usr/local/bin/

使用 Helm 安装 Cilium(替换 kube-proxy)

# 添加 Helm repo
helm repo add cilium https://helm.cilium.io/
helm repo update

# 安装 Cilium,同时禁用 kube-proxy
# 适用于用 kubeadm 搭建的集群
helm install cilium cilium/cilium \
  --version 1.16.x \
  --namespace kube-system \
  --set kubeProxyReplacement=true \
  --set k8sServiceHost=<控制平面IP> \
  --set k8sServicePort=6443 \
  --set hubble.relay.enabled=true \
  --set hubble.ui.enabled=true

# 验证安装状态
cilium status --wait

# 连接性测试
cilium connectivity test

验证 kube-proxy 已被替换

# Cilium 接管 Service 转发后,iptables 规则会大幅减少
iptables -t nat -L KUBE-SERVICES 2>/dev/null | wc -l
# 替换后应该只有很少几条,而不是原来的几百条

# 确认 Cilium 在处理 Service
kubectl -n kube-system exec ds/cilium -- \
  cilium-dbg service list

Hubble:网络可观测性

安装 Hubble CLI

# 安装 Hubble CLI
curl -L --remote-name-all \
  https://github.com/cilium/hubble/releases/latest/download/hubble-linux-amd64.tar.gz
tar xzvf hubble-linux-amd64.tar.gz
mv hubble /usr/local/bin/

# 端口转发到 Hubble Relay
kubectl port-forward -n kube-system svc/hubble-relay 4245:80 &

# 查看实时流量
hubble observe --follow

实时流量分析

# 查看特定命名空间的所有流量
hubble observe --namespace production --follow

# 只看 HTTP 流量(L7)
hubble observe --protocol http --follow

# 过滤特定服务的出入流量
hubble observe \
  --from-label app=frontend \
  --to-label app=api \
  --follow

# 查看被 NetworkPolicy 拒绝的流量(排查网络策略问题)
hubble observe \
  --verdict DROPPED \
  --namespace production \
  --follow

# 输出示例:
# Feb  1 10:23:14.123  production/frontend:54321 -> production/api:8080
#   HTTP/1.1 GET /api/users (verdict: FORWARDED)
# Feb  1 10:23:14.456  production/frontend:54322 -> production/db:5432
#   TCP (verdict: DROPPED, reason: NetworkPolicy)

使用 Hubble UI 查看服务拓扑

# 如果 Hubble UI 没有 NodePort,做端口转发
kubectl port-forward -n kube-system svc/hubble-ui 12000:80 &

# 浏览器访问 http://localhost:12000
# 可以看到:
# - 服务间调用关系图(自动生成,无需配置)
# - 实时流量数量
# - 每条连接的协议(HTTP/gRPC/DNS/TCP)
# - 被 Policy 拒绝的连接(红色显示)

L7 可观测性(HTTP/gRPC/DNS 详情)

# 需要在 Cilium 上启用 L7 代理
# 创建 CiliumNetworkPolicy 开启 L7 可见性

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: enable-l7-visibility
  namespace: production
spec:
  endpointSelector:
    matchLabels:
      app: frontend
  egress:
  - toPorts:
    - ports:
      - port: "8080"
        protocol: TCP
      rules:
        http:          # 开启 HTTP L7 解析
        - {}           # 允许所有 HTTP 请求(同时记录详情)
# 开启 L7 后,hubble observe 能看到 HTTP 详情
hubble observe --namespace production --protocol http

# 示例输出:
# frontend → api  GET /api/users HTTP/1.1 200 OK (23ms)
# frontend → api  POST /api/orders HTTP/1.1 201 Created (45ms)
# frontend → api  GET /api/item/999 HTTP/1.1 404 Not Found (5ms)

Tetragon:运行时安全

Tetragon 是 Cilium 项目的安全组件,基于 eBPF 实现内核级的进程、文件、网络监控,并支持实时阻断(不只是检测)。

安装 Tetragon

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

helm install tetragon cilium/tetragon \
  --namespace kube-system \
  --set tetragon.enableMsgHandlingLatency=true

# 验证安装
kubectl -n kube-system get pods -l app.kubernetes.io/name=tetragon

监控敏感进程执行

# TracingPolicy:监控容器内的敏感命令执行
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
  name: detect-sensitive-exec
spec:
  kprobes:
  - call: "sys_execve"
    syscall: true
    args:
    - index: 0
      type: "string"    # 记录执行的命令
    selectors:
    - matchBinaries:
      - operator: In
        values:
        - "/bin/sh"
        - "/bin/bash"
        - "/usr/bin/python3"
        - "/usr/bin/curl"
        - "/usr/bin/wget"
      matchNamespaces:
      - operator: NotIn
        values:
        - "kube-system"   # 排除系统命名空间
      matchCapabilities:
      - operator: In
        isNamespaceCapability: false
        values:
        - "CAP_SYS_ADMIN"   # 特别关注有 CAP_SYS_ADMIN 的容器

文件访问审计

# 监控对敏感文件的访问
apiVersion: cilium.io/v1alpha1
kind: TracingPolicy
metadata:
  name: detect-sensitive-file-access
spec:
  kprobes:
  - call: "security_file_open"
    syscall: false
    args:
    - index: 0
      type: "file"
    selectors:
    - matchArgs:
      - index: 0
        operator: Prefix
        values:
        - "/etc/passwd"
        - "/etc/shadow"
        - "/etc/kubernetes/pki"
        - "/var/run/secrets/kubernetes.io"
      matchActions:
      - action: Sigkill    # 检测到立即终止进程(阻断而不是只记录)

查看 Tetragon 事件

# 安装 tetra CLI
curl -L https://github.com/cilium/tetragon/releases/latest/download/tetra-linux-amd64.tar.gz \
  | tar xz && mv tetra /usr/local/bin/

# 实时查看所有安全事件
kubectl exec -n kube-system ds/tetragon -- \
  tetragon getevents -o compact

# 只看进程执行事件
kubectl exec -n kube-system ds/tetragon -- \
  tetragon getevents -o compact --event-types PROCESS_EXEC

# 事件示例输出:
# 🚀 process  production/api-pod  /bin/sh -c "id"
# 💥 exit     production/api-pod  /bin/sh  0
# 🔑 open     production/api-pod  /etc/passwd

与 Prometheus + Grafana 集成

# Hubble 自带 Prometheus metrics(端口 9965)
# 在 ServiceMonitor 中配置采集

kubectl apply -f - <<EOF
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: hubble
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: hubble
  endpoints:
  - port: prometheus
    interval: 30s
EOF
核心 Hubble 指标:

hubble_flows_processed_total        # 处理的流量总数(按 verdict 分)
hubble_drop_total                   # 被丢弃的流量(按原因分)
hubble_tcp_flags_total             # TCP 连接建立/关闭统计
hubble_dns_queries_total           # DNS 查询次数
hubble_http_requests_total         # HTTP 请求次数(L7 开启后)
hubble_http_request_duration_seconds # HTTP 延迟分布(P50/P95/P99)

告警建议:
  hubble_drop_total 持续增长 → 可能有网络策略配置错误
  hubble_http_request_duration_seconds P99 > 1s → 服务延迟告警

小结

eBPF 的价值在于它的非侵入性——不改应用代码,内核层面就能看到所有流量、所有进程、所有文件访问。Hubble 把这些数据变成运维人员能直接用的网络拓扑图和流量分析工具;Tetragon 把检测能力升级为可以实时阻断的安全策略。

2026 年,如果你在重新规划 Kubernetes 集群的 CNI,Cilium 是值得优先考虑的选项——它不只是一个网络插件,而是一套集网络、可观测性、安全于一体的平台。