Cilium 端到端连通性测试实战:从 kind 集群搭建到 cilium connectivity test 全链路指南
【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium
本文基于 Cilium 仓库的官方文档 Documentation/contributing/testing/e2e.rst 展开,介绍如何使用cilium-cli connectivity对 Cilium 进行端到端(End-to-End, E2E)连通性测试:测试框架如何从 API 层(策略导入、CLI 操作)一直验证到数据面层(策略是否在 BPF 数据面被正确执行)。读完本文后,你将能够:在本地 kind 集群中搭建测试环境、安装开发版 Cilium、运行/筛选/清理连通性测试,以及在虚拟机(含自定义内核)中执行测试和网络性能压测(cilium connectivity perf)。
一、测试框架设计:从 API 到数据面的全链路验证
Cilium 的 E2E 测试基于cilium-cli内置的 connectivity tests 框架实现。其核心验证链路是:
- API 层:通过 Kubernetes 资源(NetworkPolicy 等)、Cilium CLI 导入策略;
- 数据面层:验证导入的策略是否在 BPF 数据面被正确执行——例如被策略拒绝的流量确实被 drop、被允许的流量确实可达。
框架的一个重要设计是内置特性检测(feature detection):测试针对任意运行 Cilium 的 Kubernetes 集群均可执行,当某个前置条件不满足时(例如 Egress Gateway 特性未开启),框架会自动跳过相关测试,而不是让整套测试失败。
从源码结构看,这个框架的核心实现位于 cilium-cli/connectivity/:
- suite.go 中的
Run()是测试主入口:先对所有测试并发执行SetupAndValidate(特性检测与资源部署),再按 suite 依次执行runConnectivityTests(每个测试在独立 goroutine 中运行),最后统一输出报告并Cleanup;同时通过NewJUnitCollector预创建 JUnit 报告收集器,保证即使 setup 阶段失败,CI 也能拿到非空的cilium-junits结果文件(见 suite.go#L35-L46)。 - builder/ 目录下每个文件对应一类测试场景的构建器,例如 client_egress_l7.go(L7 出站策略)、north_south_loadbalancing.go(南北向负载均衡)、to_fqdns.go(FQDN 策略)、egress_gateway.go(Egress Gateway)、ipsec_xfrm.go(IPSec 加密)等;这正是“特性不满足则自动跳过”的落点——检测失败的 builder 不会把测试加入套件。
- 测试用例的具体断言逻辑位于 tests/,如 connect.go、pod.go、world.go 等,配合 check/ 中的
ConnectivityTest主体。 - 此外框架还会自动收集 Hubble 流量日志、校验 agent 日志中是否出现异常错误(如 check_log_errors.go 场景),失败时可选自动采集 sysdump。
二、前置准备:cilium-cli 与测试集群
2.1 安装 Cilium CLI
官方文档给出的标准方式是下载预编译的 Cilium CLI 二进制(见 installation/cli-download.rst)。
另一种方式是从本仓库手动构建并安装。注意cilium-cli目录已合入 Cilium 主仓库(见 cilium-cli/Makefile),可直接在仓库内构建:
$ cd cilium/cilium-cli $ make install2.2 使用 kind 快速创建 K8s 集群
测试需要一个运行 Cilium 的 Kubernetes 集群,最简单的方式是使用 kind。Cilium 仓库提供了封装脚本 contrib/scripts/kind.sh 来简化集群创建。例如创建 1 个 control-plane 节点 + 3 个 worker 节点、禁用 kube-proxy、启用 DualStack:
$ cd cilium/ $ ./contrib/scripts/kind.sh "" 3 "" "" "none" "dual" ... Kind is up! Time to install cilium: make kind-image make kind-install-cilium结合 kind.sh 的源码,位置参数依次为:[control-plane 数量] [worker 数量] [集群名] [节点镜像] [kube-proxy 模式] [ip-family] [apiserver 地址] [apiserver 端口] [kubeconfig 路径],其中未提供的参数可用同名环境变量(CONTROLPLANES、WORKERS、CLUSTER_NAME、IMAGE、KUBEPROXY_MODE、IPFAMILY等)覆盖;此外还支持--xdp(为 veth 挂载 dummy XDP 程序以便测试 XDP_TX 路径)、--secondary-network(多网卡 NodePort 测试)、--optimize-sysctl(提高 inotify 上限,规避 kind 在资源受限机器上的常见问题)、--external-dns <IPv4>(外部 DNS 地址,默认 1.1.1.1,见 kind.sh#L40-L68)。
该脚本除了调用kind create cluster外还做了几件对 E2E 测试很关键的事(见 kind.sh#L134-L297):
- 将 Cilium 仓库源码目录挂载进每个 kind 节点(
extraMounts),供后续“fast install”用 volume 挂载的二进制快速迭代; - 每个节点映射 agent 调试端口(2345 → 宿主机 127.0.0.1 上 234x 系列端口)与 operator 调试端口(2346 → 235x),便于本地连接
cilium-agentAPI; - 替换 CoreDNS 的
forward . /etc/resolv.conf为外部 DNS 并开启 DNS 查询日志——这是 BPF Host Routing 绕过 iptables 场景下 kubelet/容器 DNS 正常工作的保障; - 清除 control-plane 节点的
control-plane/mastertaint,让 Cilium 和测试 Pod 可以被调度到所有节点。
2.3 构建并安装开发版 Cilium
官方推荐用cilium install完成安装,因为它能自动处理一些细节步骤,例如:探测kube-apiserverendpoint 地址(在没有 kube-proxy 时必须显式指定)、给不使用 Cilium 的 K8s 节点打注解防止 Cilium 被调度上去。
先构建镜像(对应 Makefile.kind 中的kind-image目标,构建 cilium 与 operator 镜像并导入 kind 本地 registry):
$ cd cilium/ $ make kind-image ... ^^^ Images pushed, multi-arch manifest should be above. ^^^然后安装(注意--nodes-without-cilium与脚本清 taint 的配合:无 Cilium 的节点会加调度约束):
$ cilium install --wait \ --chart-directory=$GOPATH/src/github.com/cilium/cilium/install/kubernetes/cilium \ --set image.override=localhost:5000/cilium/cilium-dev:local \ --set image.pullPolicy=Never \ --set operator.image.override=localhost:5000/cilium/operator-generic:local \ --set operator.image.pullPolicy=Never \ --set routingMode=tunnel \ --set tunnelProtocol=vxlan \ --nodes-without-cilium ... ⌛ Waiting for Cilium to be installed and ready... ✅ Cilium was successfully installed! Run 'cilium status' to view installation health其中--chart-directory指向本仓库的 Helm chart install/kubernetes/cilium,image.pullPolicy=Never确保 kind 节点直接使用本地 registry 中刚构建的镜像。脚本结尾提示的make kind-image-fast/make kind-install-cilium-fast则提供了一条更快反馈路径:用 volume 挂载的本地二进制替代镜像导入(见 Makefile.kind#L282-L284 的kind-install-cilium-fast目标)。
三、运行端到端连通性测试
3.1 全量执行
$ cilium connectivity test ... ✅ All 32 tests (263 actions) successful, 2 tests skipped, 1 scenarios skipped.输出末尾的“N tests (M actions)”分别表示测试场景数与其中的具体动作数;skipped 项即来自上文所述的特性检测。
3.2 按名称筛选 / 排除测试
--test参数接受正则表达式(源码中通过regexp.Compile编译,见 cli/connectivity.go#L61-L75):
# 只运行匹配 north-south-loadbalancing 的测试 $ cilium connectivity test --test north-south_loadbalancing ... [=] Test [north-south-loadbalancing] # 以 '!' 前缀排除特定测试 $ cilium connectivity test --test '!pod-to-world'3.3 常用命令行参数(源码级梳理)
结合 cilium-cli/cli/connectivity.go 中newCmdConnectivityTest的注册逻辑,以下是日常 E2E 调试最常用的参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
--test <regex> | 空(全部运行) | 按正则筛选测试;!前缀表示排除;可用/scenario形式定向到 Scenario |
--test-namespace <ns> | cilium-test | 测试 Pod 所在命名空间(见 defaults),与--cleanup清理配合 |
--test-concurrency <n> | 1 | 并行执行测试的命名空间数量,每个命名空间会追加序列号后缀(如cilium-test-1),并自动错开 HostPort 避免端口冲突(connectivity.go#L329-L356) |
--node-selector <k=v> | 空 | 用节点标签限制连通性 Pod 的调度范围 |
--single-node | false | 只保留能在单节点运行的测试 |
--hubble/--flow-validation | true/warning | 自动使用 Hubble 做流量校验与排障;--flow-validation可取disabled\|warning\|strict |
--print-flows | false | 每个测试打印 flow 日志 |
--pause-on-fail(-p) | false | 测试失败时暂停,便于现场排查 |
--verbose(-v)/--timestamp(-t) | false | 显示信息级消息 / 带时间戳输出 |
--external-target | one.one.one.one. | 外部目标域名(pod-to-world 类测试) |
--external-ip/--external-ipv6 | 1.1.1.1/2606:4700:4700::1111 | 外部目标 IP |
--connect-timeout/--request-timeout | 见 defaults | 连接与请求的超时上限 |
--service-type | NodePort | 测试用 Service 的类型 |
--junit-file | 空 | 生成 JUnit 报告(CI 上传cilium-junits产物) |
--collect-sysdump-on-failure | false | 测试失败后自动采集 sysdump |
--timeout | 套件默认超时 | 整个连通性测试套件的最大时长(源码中通过context.WithTimeoutCause实现全局超时,connectivity.go#L111-L115) |
--force-deploy | false | 强制重新部署测试资源 |
--cleanup | false | 只清理连通性测试产物(namespace、deployment、service),不跑测试 |
--image系列(--curl-image、--json-mock-image、--dns-test-server-image等) | 官方镜像 | 覆盖测试依赖的各镜像 |
从 suite.go#L22-L33 可以看到,当--cleanup开启时框架会进入 “cleanup-only” 模式:逐个调用CleanupConnectivityTest移除所有测试产物后直接返回。
3.4 清理测试环境
如果测试被中断或超时,测试 Pod 会残留在集群中。最简单的清理方式是删除测试命名空间(默认cilium-test):
$ kubectl delete ns cilium-test如果运行测试时用--test-namespace指定过自定义命名空间,请替换上式中的默认值;也可以使用框架内置的cilium connectivity test --cleanup(等价于清理-only 模式)。
四、在虚拟机中运行测试(little-vm-helper)
为了在更接近真实环境的虚拟机中验证 Cilium(例如不同的 QEMU/内核组合),可以 Cilium 官方的 little-vm-helper(LVH):它提供基于 QEMU 的 VM 运行器、VM 镜像构建器,以及预构建 VM 镜像仓库。
4.1 安装 LVH CLI 并拉取镜像
$ go install github.com/cilium/lilium/little-vm-helper/cmd/lvh@latest $ lvh --help ... Use "lvh [command] --help" for more information about a command.$ lvh images pull quay.io/lvh-images/kind:6.1-main --dir .所有可用镜像见 LVH 镜像仓库的 tag 列表;如需构建新镜像(或更新已有镜像),参考 little-vm-helper-images 项目。
4.2 启动 VM
$ lvh run --image ./images/kind_6.1.qcow2 --host-mount $GOPATH/src/github.com/cilium/ --daemonize -p 2222:22 --cpu=3 --mem=6G4.3 进入 VM 建集群、装 Cilium、跑测试
SSH 进入 VM 后,在挂载的源码目录内完成“建 kind 集群 → 安装 Cilium → 跑连通性测试”三步(以官方文档中 v1.13.2 版本的示例命令为准,实际版本号按你的发布替换):
$ ssh -p 2222 -o "StrictHostKeyChecking=no" root@localhost # cd /host/cilium # git config --global --add safe.directory /host/cilium # ./contrib/scripts/kind.sh "" 3 "" "" "none" "dual" # cd /host/cilium-cli # ./cilium install --wait \ --chart-directory=../cilium/install/kubernetes/cilium \ --version=v1.13.2 \ --set routingMode=tunnel \ --set tunnelProtocol=vxlan \ --nodes-without-cilium # ./cilium connectivity test ... ✅ All 32 tests (263 actions) successful, 2 tests skipped, 1 scenarios skipped.停止 VM 时,在宿主机执行:
$ pkill qemu-system-x864.4 在 LVH VM 中使用自定义内核
进行 Cilium 相关的内核开发时,可以用自编译的 Linux 内核(例如 bpf-next)在 LVH VM 中快速迭代测试:
- 配置并编译内核:
$ git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git $ cd bpf-next/ # 应用 LVH 通用内核配置,确保内核能在 LVH VM 中运行 $ git clone https://github.com/cilium/little-vm-helper-images $ cat ../little-vm-helper-images/_data/kernels.json | \ jq -r '.common_opts.[] | (.[0])+" "+(.[1])' | \ xargs ./scripts/config $ make -j$(nproc)- 用自定义内核启动 VM:
$ lvh run --image ./images/kind_bpf-next.qcow2 \ --host-mount $(pwd) \ --kernel ./bpf-next/arch/x86_64/boot/bzImage \ --daemonize -p 2222:22 --cpu=3 --mem=6G- SSH 进 VM 安装自编译的内核模块(LVH 相关 issue #117 解决后此步骤可省略):
$ ssh -p 2222 -o "StrictHostKeyChecking=no" root@localhost # cd /host/bpf-next # make modules_install- 之后按 4.3 节的流程建集群、装 Cilium、执行
cilium connectivity test即可。
五、网络性能测试:cilium connectivity perf
除功能连通性外,Cilium 还提供cilium connectivity perf用于测量 Pod 之间(同节点 / 跨节点)通信的网络性能。
$ cilium connectivity perf ... [=] Test [network-perf] [1/1] ...如果要指定 client/server 所在节点,可以先给节点打标签再传入选择器:
$ kubectl label nodes worker1 perf-test=server node/worker1 labeled $ kubectl label nodes worker2 perf-test=client node/worker2 labeled $ cilium connectivity perf \ --node-selector-client perf-test=client \ --node-selector-server perf-test=server ... [=] Test [network-perf] [1/1]结合 cli/connectivity.go 中newCmdConnectivityPerf的实现,perf 子命令还有丰富的可调项:
- 测试类型开关:
--rr(默认开启,请求-应答延迟测试)、--crr、--udp、--throughput(默认开启)、--throughput-multi(默认开启,多流吞吐); - 流量方向:
--host-net/--pod-net(默认均开启)、--pod-to-host/--host-to-pod、--same-node/--other-node(默认均测)、--net-qos、--bandwidth; - 采样规模:
--duration(默认 10s)、--samples(每类测试重复次数,默认 1)、--msg-size(UDP 测试消息大小,默认 1024)、--streams(多流并行度,默认 4); - 结果输出:
--report-dir以 JSON 格式保存结果(对应 cilium-cli/connectivity/perf/ 下的 benchmark 实现); - 节点选择器默认排除了打了 Cilium 不调度标签的节点(如
cilium install --nodes-without-cilium标记的节点),因为固定在这些节点上的 perf Pod 永远不会 ready(源码注释见 connectivity.go#L294-L303)。
perf 子命令在PreRunE中会强制Perf=true、ForceDeploy=true、Hubble=false——即每次都强制部署 perf 资源且不依赖 Hubble 做流量校验(connectivity.go#L249-L268)。
六、小结与适用前提
- 适用前提:需要一个可调度、已安装 Cilium 的 Kubernetes 集群;本地快速验证推荐 kind +
make kind-image+cilium install;需要自定义内核或更接近生产环境的验证时使用 LVH 虚拟机。 - 框架特点:测试从 API 层一路验证到 BPF 数据面;内置特性检测让同一套测试可在不同能力配置的集群上运行并自动跳过不满足条件的场景(源码位于 cilium-cli/connectivity/)。
- 常用操作速查:
./contrib/scripts/kind.sh "" 3 "" "" "none" "dual"建集群 →make kind-image构建镜像 →cilium install安装 →cilium connectivity test(可加--test <regex>筛选 /--test '!<regex>'排除)→ 失败时用--pause-on-fail、--collect-sysdump-on-failure、--print-flows定位 → 结束后kubectl delete ns cilium-test或--cleanup清理。 - 性能维度:
cilium connectivity perf提供同/跨节点延迟与吞吐基准,可用节点标签精确指定 client/server 节点,并以--report-dir归档 JSON 结果。
【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考