
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.goL7 出站策略、north_south_loadbalancing.go南北向负载均衡、to_fqdns.goFQDN 策略、egress_gateway.goEgress Gateway、ipsec_xfrm.goIPSec 加密等这正是“特性不满足则自动跳过”的落点——检测失败的 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.overridelocalhost:5000/cilium/cilium-dev:local \ --set image.pullPolicyNever \ --set operator.image.overridelocalhost:5000/cilium/operator-generic:local \ --set operator.image.pullPolicyNever \ --set routingModetunnel \ --set tunnelProtocolvxlan \ --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/ciliumimage.pullPolicyNever确保 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-world3.3 常用命令行参数源码级梳理结合 cilium-cli/cli/connectivity.go 中newCmdConnectivityTest的注册逻辑以下是日常 E2E 调试最常用的参数参数默认值说明--test regex空全部运行按正则筛选测试!前缀表示排除可用/scenario形式定向到 Scenario--test-namespace nscilium-test测试 Pod 所在命名空间见 defaults与--cleanup清理配合--test-concurrency n1并行执行测试的命名空间数量每个命名空间会追加序列号后缀如cilium-test-1并自动错开 HostPort 避免端口冲突connectivity.go#L329-L356--node-selector kv空用节点标签限制连通性 Pod 的调度范围--single-nodefalse只保留能在单节点运行的测试--hubble/--flow-validationtrue/warning自动使用 Hubble 做流量校验与排障--flow-validation可取disabled\|warning\|strict--print-flowsfalse每个测试打印 flow 日志--pause-on-fail-pfalse测试失败时暂停便于现场排查--verbose-v/--timestamp-tfalse显示信息级消息 / 带时间戳输出--external-targetone.one.one.one.外部目标域名pod-to-world 类测试--external-ip/--external-ipv61.1.1.1/2606:4700:4700::1111外部目标 IP--connect-timeout/--request-timeout见 defaults连接与请求的超时上限--service-typeNodePort测试用 Service 的类型--junit-file空生成 JUnit 报告CI 上传cilium-junits产物--collect-sysdump-on-failurefalse测试失败后自动采集 sysdump--timeout套件默认超时整个连通性测试套件的最大时长源码中通过context.WithTimeoutCause实现全局超时connectivity.go#L111-L115--force-deployfalse强制重新部署测试资源--cleanupfalse只清理连通性测试产物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-helperLVH它提供基于 QEMU 的 VM 运行器、VM 镜像构建器以及预构建 VM 镜像仓库。4.1 安装 LVH CLI 并拉取镜像$ go install github.com/cilium/lilium/little-vm-helper/cmd/lvhlatest $ 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 --cpu3 --mem6G4.3 进入 VM 建集群、装 Cilium、跑测试SSH 进入 VM 后在挂载的源码目录内完成“建 kind 集群 → 安装 Cilium → 跑连通性测试”三步以官方文档中 v1.13.2 版本的示例命令为准实际版本号按你的发布替换$ ssh -p 2222 -o StrictHostKeyCheckingno rootlocalhost # 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 \ --versionv1.13.2 \ --set routingModetunnel \ --set tunnelProtocolvxlan \ --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 --depth1 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 --cpu3 --mem6GSSH 进 VM 安装自编译的内核模块LVH 相关 issue #117 解决后此步骤可省略$ ssh -p 2222 -o StrictHostKeyCheckingno rootlocalhost # 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-testserver node/worker1 labeled $ kubectl label nodes worker2 perf-testclient node/worker2 labeled $ cilium connectivity perf \ --node-selector-client perf-testclient \ --node-selector-server perf-testserver ... [] 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-sizeUDP 测试消息大小默认 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中会强制Perftrue、ForceDeploytrue、Hubblefalse——即每次都强制部署 perf 资源且不依赖 Hubble 做流量校验connectivity.go#L249-L268。六、小结与适用前提适用前提需要一个可调度、已安装 Cilium 的 Kubernetes 集群本地快速验证推荐 kind make kind-imagecilium 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),仅供参考