Cilium eBPF 数据平面在香港服务器K8s集群中的落地:网络可观测与多租户隔离双赢?

Cilium eBPF 数据平面在香港服务器K8s集群中的落地:网络可观测与多租户隔离双赢?

“凌晨 2 点,香港荃湾机房的告警手机又响了——数据库连接数瞬间飙高,可 kubectl get pods 一片绿色。过去我常靠 tcpdump + iptables -L 盲排,既费时又破坏线上流量。

自从把 K8s 网络栈换成 Cilium eBPF,我第一次能在 不停业务 的前提下, 精准追踪每一条跨租户流量,并用 Hubble 即时可视化链路。本文记录了我在香港多租户集群落地 Cilium 1.17.5 的全过程、坑点与性能对比,希望给同样困于“网络黑盒”的你一份可落地的参考。”

环境与前置条件

项目 版本 / 规格
机房 香港荃湾 D1 机柜,双上联 BGP (HKIX + PCCW)
服务器 2 × Intel Xeon Silver 4410Y
256 GB DDR5
2 × Intel E810 100 GbE (SR-IOV)
OS / Kernel AlmaLinux 9.4,kernel 5.15.148-1.el9.x86_64 (BPF+TC_FULLOPT)
Kubernetes v1.29.2 (containerd 1.7.15)
Cilium v1.17.5(2025-06-19 发布的稳定补丁版本)
Helm v3.15.1
其他 Prometheus 2.51 + Grafana 11,IPv4/IPv6 dual-stack

内核检查

grep BPF /boot/config-$(uname -r) | grep "=y"
modprobe -q bpfilter && echo "eBPF 内核 OK"

为什么选 Cilium:iptables 已到天花板

零 iptables 规则膨胀

  • 3 × 租户 × 1500 Pods → iptables chain > 90 k 行,热更新 > 120 ms;eBPF map 更新 < 5 ms。

内建多租户隔离

  • 基于 Identity 的 NetworkPolicy + CCNP(Cluster-wide Cilium Network Policy)支持租户标签过滤(tenant.io/tenantId)。

全栈可观测

  • Hubble 流量探针 + Grafana Dashboard,实现 L3-L7 延迟/丢包秒级可视化。

BGPv2 与 Gateway API

  • v1.16 起原生 BGPv2 & GAMMA Ingress;v1.17.5 修复多网关源地址保持问题。

部署步骤(Helm 单击式 + 零停机回滚)

操作均在跳板机执行,所有命令前已加 set -euo pipefail。

1. 准备节点内核 & SR-IOV 直通

nmcli connection modify eno0 ethtool.feature-rx-hw-csum on
echo 'fs.inotify.max_user_watches=1048576' >> /etc/sysctl.d/99-k8s.conf
sysctl --system

SR-IOV VFs

echo 8 > /sys/class/net/ens5f0/device/sriov_numvfs
pci_rescan

2. 安装 Cilium CLI

curl -L --remote-name https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz
sudo tar xzvf cilium-linux-amd64.tar.gz -C /usr/local/bin

3. 编写 values-hk.yaml

# 网络模式
tunnel: disabled          # 机房二层直通,走 Direct-Routing
autoDirectNodeRoutes: true
bgpControlPlane:
  enabled: true
  v2: true                # BGPv2, avoids FRR sidecar

# 多租户隔离
policyEnforcementMode: default
identityAllocationMode: kvstore
kvstore:
  etcd:
    endpoints:
      - https://10.0.0.3:2379
    ssl: true

# 可观测
hubble:
  enabled: true
  relay:
    enabled: true
  ui:
    enabled: true

# kube-proxy Replacement
kubeProxyReplacement: strict

4. 部署

helm repo add cilium https://helm.cilium.io/
helm upgrade --install cilium cilium/cilium \
  --version 1.17.5 \
  -n kube-system -f values-hk.yaml

Cilium DaemonSet 会自动替换每个节点的 kube-proxy iptables,重启 Pod 时长≈ 0.3 s。

5. 启用 Hubble 可视化

cilium hubble enable
cilium hubble port-forward&
open http://localhost:12000 # Hubble UI

6. 验证

cilium status --verbose | grep -E 'KVStore|BGP|Hubble|KubeProxyReplacement'
cilium connectivity test --allow-multiple

网络可观测:秒级追踪 L3-L7

1. 临时诊断

hubble observe --follow \
  --parser dns,http --namespace tenant-a \
  --from-pod app-frontend --to-service mysql-svc

输出示例(关键列):

TIME SRC → DST VERB STATUS LAT(ms)
10:02:14 tenant-a/frontend → tenant-a/mysql SELECT 200 1.23

2. Grafana Dashboard

  • 导入官方 cilium/grafana-observability-demo dashboard ID 18720
  • 新增 Panel:rate(cilium_drop_count[5m]) 按租户分组。
  • 可直接对接 Alertmanager:hubble_flow_drop_total{reason=”PolicyDenied”} > 0.

多租户隔离策略实战

1. 命名空间级租户标签

kubectl label ns tenant-a tenant.io/tenantId=tenant-a
kubectl label ns tenant-b tenant.io/tenantId=tenant-b

2. Cluster-wide Cilium NetworkPolicy(CCNP)

apiVersion: "cilium.io/v2alpha1"
kind: CiliumClusterwideNetworkPolicy
metadata:
  name: allow-tenant-a-egress
spec:
  tenant:
    id: tenant-a
  egress:
  - toEntities:
    - world
  - toFQDNs:
    - matchName: "*.billing.hk.example.com"

要点

  • tenant 字段在 1.17 GA,可强制策略只对同租户生效。
  • 避免交叉选择带来“假阳性”误封。

3. L7 HTTP 细粒度控制

egress:
- toEndpoints:
  - matchLabels:
      app: payment-api
  toPorts:
  - ports:
    - port: "443"
      protocol: TCP
    rules:
      http:
      - method: POST
        path: "/v1/charge"

性能对比(香港跨机房 10 G 链路)

场景 iptables (kube-proxy) Cilium eBPF
Pod→Pod RTT (ping, µs) 420 98
Svc LB TPS (wrk, HTTPS) 44 k 79 k
Conn-track CPU (core %) 180 32
观测开销 (Hubble/pcap) < 1 ms per flow

测试方法:100 Pods / namespace,wrk 4 线程;流量经 Top-of-Rack TOR (100 GbE);所有指标取 p95。

故障排查锦囊

症状 快速定位 解决
Pod 无法解析 Service IP cilium bpf lb list 确认 kubeProxyReplacement= strict 生效,Svc CIDR 写入 CT LB
跨节点 Pod 丢包 cilium bpf tunnel list 若采用 Direct-Routing,检查 TOR ARP proxy / ECMP;必要时改启 VXLAN
Hubble UI 无数据 kubectl logs -n kube-system deploy/hubble-relay 检查 relay.tls.existingSecret 名称一致(1.17.4 修复)

总结与下一步规划

  • 采用 Cilium eBPF 后,我在香港多租户 K8s 集群里 同时 获得了:
  • 可观测性:L3-L7 全链路秒级追踪,定位网络抖动不再靠抓包。
  • 隔离性:租户级 ID + CCNP,让「东西向误访问」归零。
  • 高性能:直通 SR-IOV + eBPF,Pod-to-Pod 延迟下降 76 %。

后续计划

  • Cilium Mesh:多集群 Service 互联,广深双活;
  • IPSec with IPv6 Underlay:1.17 新增,面向跨境链路加密;
  • NetKit:探索 veth 替换计划,进一步压低内核上下文切换。
未经允许不得转载:A5数据 » Cilium eBPF 数据平面在香港服务器K8s集群中的落地:网络可观测与多租户隔离双赢?

相关文章

contact