
“凌晨 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 替换计划,进一步压低内核上下文切换。











