- 测试
- 云原生
- 质量保障
【免费下载链接】origin
Conformance test suite for OpenShift
本文围绕 test/extended/storage/csi/README.md 展开,讲解 OpenShift origin 仓库中openshift/csi测试套件如何复用上 Kubernetes 上游存储测试、通过两个环境变量的 YAML 清单控制 CSI 驱动的功能测试范围,以及 OpenShift 特有的LUNStressTest单节点 LUN 压力测试的设计原理与运行方法。读完本文,你可以独立完成一套 CSI 驱动的认证测试:编写上游/ OpenShift 两份清单、运行openshift-tests或tests容器镜像、用--dry-run/--run/run-test定位失败用例,并理解这些测试在源码中的注册与执行链路。
说明(引自原文档):本文档不受 Red Hat 支持,其目的是帮助调试测试或 CSI 驱动本身。提交正式的 CSI 驱动测试结果应遵循 Red Hat 官方文档流程。
一、openshift/csi 套件的定位:复用上游存储测试 + OpenShift 特有用例
openshift/csi套件包含针对一个已安装 CSI 驱动的功能测试。它的核心思路是:
- 复用上游:直接复用 Kubernetes 上游的
test/e2e/storage/external存储测试框架及其 YAML 驱动清单,测试项以External Storage [Driver: <driver name>]为前缀; - 叠加 OpenShift 特有测试:在上游测试之上追加若干 OpenShift 特定的测试套件(源码位于 test/extended/storage/csi/csi.go),目前主要有两类:
OpenShift CSI extended - SCSI LUN Overflow(LUN 压力测试,需 OpenShift 清单启用,见 test/extended/storage/csi/scsi_overflow.go);OpenShift CSI extended - CSI Clone(PVC 克隆到更大卷的测试,只要设置了上游清单就会自动注册,见 test/extended/storage/csi/pvc_clone_larger.go)。
套件在 pkg/testsuites/standard_suites.go 中注册,其选择器(qualifier)决定了哪些 ginkgo 测试属于本套件:
Qualifiers: []string{ `name.contains("External Storage [Driver:") && !name.contains("[Disabled:") && !name.contains("[Flaky]") && !name.contains("[Disruptive]")`, },也就是说,openshift/csi运行所有匹配External Storage [Driver:前缀、且未被标记为 Disabled/Flaky/Disruptive 的测试。
二、两个清单文件与环境变量
两个 YAML 文件控制“测试哪些 CSI 驱动功能、怎么测”。openshift-tests二进制接受两个环境变量(常量定义见 pkg/clioptions/clusterdiscovery/csi.go):
| 环境变量 | 是否必需 | 作用 |
|---|---|---|
TEST_CSI_DRIVER_FILES | 必需 | 指向上游CSI 驱动测试清单文件,格式遵循上游 kubernetes 仓库test/e2e/storage/external的 README(将 master 替换为与集群对应的版本分支即可找到对应格式说明)。 |
TEST_OCP_CSI_DRIVER_FILES | 可选 | 指向OpenShift 特有测试清单文件,格式见下文。设置后会在上游测试之外额外运行 OCP 特有测试。 |
从源码 pkg/clioptions/clusterdiscovery/csi.go 的InitCSITests还可以确认几点原文档未展开的实现细节:
- 两个变量都支持逗号分隔的多个清单文件,会逐个加载;
- 每个上游清单中必须能解析出
DriverInfo.Name(驱动名),OCP 清单中的Driver字段必须与某个上游清单对应,否则直接报错:env. var TEST_OCP_CSI_DRIVER_FILES must describe the same CSI drivers as TEST_CSI_DRIVER_FILES——即允许缺 OCP 清单(CI 中常见),但 OCP 清单里出现的驱动必须有对应上游清单; - 上游清单所在目录会被注册为测试框架的文件源(
testfiles.AddFileSource),以便在清单中用FromFile字段引用同目录下的 StorageClass 定义; - 该初始化发生在测试二进制启动阶段:pkg/test/extensions/binary.go 中构建 ginkgo 测试 spec 之前调用
clusterdiscovery.InitCSITests(),且 spec 过滤逻辑特意保留所有External Storage前缀的用例。
OpenShift 特有清单的格式
示例(来自原文档):
Driver: <CSI driver name> LUNStressTest: PodsTotal: 260 Timeout: "40m"其中Driver必须与某个上游清单中的驱动名一致。LUNStressTest是单节点压力测试的配置,语义见下一节。清单的解析入口是 AddOpenShiftCSITests:它先填入默认值,再用runtime.DecodeInto把 YAML 解码进OpenShiftCSIDriverConfig结构体,最后把测试套件追加到上游框架的testsuites.CSISuites全局列表中——因此它必须先于external.AddDriverDefinition(真正遍历已注册套件并生成 ginkgo 测试的函数)执行。
三、LUNStressTest:单节点 260 卷压力测试的原理
LUNStressTest用于在单个节点上压测 CSI 驱动。测试会挑选一个随机的可调度节点,并在其上创建配置的 Pod + PVC 数量(默认 260)。
- 每个 Pod 持有自己独立的 PVC,需要 CSI 驱动动态供给(源码 scsi_overflow.go 中先
createSC创建 StorageClass,再循环startTestPod创建pvc-N+pod-N); - 每个 Pod 只做一个非常简单的操作(如
ls -la /mnt/the_volume,见 scsi_overflow.go 中Command: "ls -la " + e2epod.VolumeMountPath1)然后很快退出; - 所有这些 Pod 会被相对快速地集中创建,但测试并不期望它们全部并行运行:
- 期望 CSI 驱动在请求过多时返回超时和其他错误,OpenShift/CSI sidecar 会以指数退避方式重试;
- Kubernetes 应尊重 CSINode 中报告的 attach limit,因此同一时刻运行的 Pod 数量不应超过该上限;
- 需要注意,Kubernetes 曾存在一个调度器可能向单节点塞入超过 CSI 驱动支持数量的 Pod 的 bug(kubernetes/kubernetes#126502,scsi_overflow.go 的注释中同样引用了该 issue)。测试期望 CSI 驱动足够健壮,在超限时对
ControllerPublish、NodeStage或NodePublish返回合理的错误。
- 超时(Timeout)应留足,以容纳 260 个卷的动态供给、attach、mount、unmount、detach 和 PV 删除的全周期;
- 该测试运行期间没有其他测试并行(测试用例带
[Serial]标记,见 scsi_overflow.go),让 CSI 驱动可以完全专注处理这次压力。
参数说明
| 参数 | 含义 | 默认值 |
|---|---|---|
PodsTotal | 创建的 Pod 数量(每个 Pod 一个卷)。设为0可显式禁用该测试 | 260(csi.go 中DefaultLUNStressTestPodsTotal) |
Timeout | 等待全部 Pod 完成的时长,接受 Gotime.ParseDuration后缀,如"1h30m15s"表示 1 小时 30 分 15 秒 | "40m"(DefaultLUNStressTestTimeout) |
官方强烈建议用 257 个及以上 Pod 进行测试,并建议测试在 1 小时内完成。历史上出现过 CSI 驱动或 RHCOS 节点配置在处理 LUN 号大于 256 时出问题的案例。即使 CSI 驱动不使用 LUN,这也是一次很有价值的压力测试:它验证驱动能报告合理的 attach limit、并能承受一定负载。
源码层面还可以确认测试的执行细节(scsi_overflow.go):
- 用例名为
should use many PVs on a single node [Serial][Timeout:<timeout>],Timeout值会同步传播为 ginkgo 的[Timeout:...]标注; - 流程为:
GetRandomReadySchedulableNode选节点 →driver.PrepareTest准备配置 → 创建 StorageClass(并要求驱动实现DynamicPVTestDriver,即支持动态供给)→ 一次性创建全部 Pod(startTestPod不等待 Pod 启动)→waitForPodsComplete以 10 秒轮询间隔等待所有 Pod 到达Succeeded阶段,剩余等待时长为总 Timeout 减去创建 Pod 已消耗的时间; - 若清单中
LUNStressTest为nil,或PodsTotal为 0,测试会被g.Skip跳过; - PVC 容量取驱动
SupportedSizeRange.Min,未声明时回退为1Gi,访问模式固定ReadWriteOnce,并显式指定调度到被选中的节点。
四、附赠的 OpenShift 特有测试:PVC 克隆到更大的卷
除了 LUN 压力测试,只要设置了TEST_CSI_DRIVER_FILES(无需 OCP 清单),RegisterAlwaysOnCSISuites 就会注册pvcCloneLargerCSISuite(套件名OpenShift CSI extended - CSI Clone,测试模式覆盖DefaultFsDynamicPV与BlockVolModeDynamicPV两种卷模式)。它验证“克隆 PVC 时目标卷大于源卷”的场景:先向源 PVC 写入测试数据,再以源容量 + 1Gi作为请求大小创建带dataSourceRef的克隆 PVC,最后校验克隆卷中包含源数据(实现见 pvc_clone_larger.go)。该测试会自动按驱动能力跳过:不支持CapPVCDataSource(克隆)、块模式下不支持CapBlock、或文件系统模式不支持从源端扩展文件系统(CapFSResizeFromSourceNotSupported)的驱动会被Skip。
五、运行方式
5.1 使用openshift-tests二进制
- 自行编译
openshift-tests二进制(在本仓库执行make),或从 OpenShift 镜像中提取。务必使用与你已安装的 OpenShift 版本对应的openshift-tests二进制! - 设置
KUBECONFIG环境变量指向你的客户端配置。 - 设置
TEST_CSI_DRIVER_FILES为上游清单。 - (可选)设置
TEST_OCP_CSI_DRIVER_FILES为 OpenShift 测试清单。 - 运行测试套件:
openshift-tests run openshift/csi。
示例(原文档):
export TEST_CSI_DRIVER_FILES=upstream-manifest.yaml # this is mandatory export TEST_OCP_CSI_DRIVER_FILES=ocp-manifest.yaml # this is optional ./openshift-tests run openshift/csi |& tee test.log5.2 使用 OpenShift 发布中的tests容器镜像
这与上面运行openshift-tests二进制大致等价,只是二进制位于容器镜像内。
- 在当前目录准备好
kubeconfig.yaml、上游测试清单,以及可选的 OpenShift 测试清单; - 找到与你的 OpenShift 集群版本对应的、包含
openshift-tests的镜像:$ oc adm release info --image-for=tests quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:8e43b259635d5adcef769f5f4359554395c900d7211915249ee66b5602fea5b9 - 在
tests容器镜像中运行openshift-tests:把当前目录以/data挂载进容器,并透传所有环境变量:podman run -v `pwd`:/data:z --rm -it quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:8e43b259635d5adcef769f5f4359554395c900d7211915249ee66b5602fea5b9 \ sh -c "KUBECONFIG=/data/kubeconfig.yaml TEST_CSI_DRIVER_FILES=/data/upstream-manifest.yaml TEST_OCP_CSI_DRIVER_FILES=/data/ocp-manifest.yaml /usr/bin/openshift-tests run openshift/csi --junit-dir /data/results"
5.3 调试技巧(原文档 Tips 全量整理)
openshift-tests在跑任何测试之前会启动一组 monitors,持续监控测试期间的整体集群健康,确保某个测试不会把整个集群搞坏。这些 monitors 非常“话痨”,会在当前目录产生大量文件;openshift-tests run openshift/csi --dry-run可以列出将要运行的测试;openshift-tests run openshift/csi --run=<regexp>只运行匹配的特定测试,可搭配--dry-run反复微调正则;用--help查看更多命令行选项;openshift-tests run-test <full test name>运行单个测试且不启动任何 monitor,输出几乎无噪音,是调试单个测试的最佳方式。<full test name>必须与--dry-run打印的内容完全一致(包括所有空格),请谨慎整行复制粘贴--dry-run输出(含双引号)。例如:./openshift-tests run-test "External Storage [Driver: cooldriver.coolstorage.com] [Testpattern: Pre-provisioned PV (ext4)] volumes should store data"- 使用
tests容器镜像时,上述任意命令行参数同样可以透传给镜像内的openshift-tests。
六、关键结论与适用前提
- 本套件的适用前提是集群中已安装被测 CSI 驱动,且你持有对应版本的
openshift-tests(二进制或tests镜像),版本不匹配可能导致测试框架与集群 API 行为不一致; - 上游清单是硬性要求:没有
TEST_CSI_DRIVER_FILES时InitCSITests不会注册任何 CSI 测试(也不会注册 always-on 的 Clone 测试); - OCP 清单是增量项:它通过
AddOpenShiftCSITests在testsuites.CSISuites中注入 LUN 压力测试,因此必须在驱动定义加载前完成——这也是源码中“Load OCP specific tests first”注释要保证的时序; - 若你的目标是验证驱动在高并发 attach 下的稳健性(尤其是 SCSI/LUN 编号边界),把
LUNStressTest.PodsTotal设为 257 以上、Timeout预留 1 小时以内,是官方建议的认证强度。
- 测试
- 云原生
- 质量保障
【免费下载链接】origin
Conformance test suite for OpenShift
相关推荐
OpenShift Origin 扩展测试实战:NVIDIA DRA(动态资源分配)GPU 调度验证套件
OpenShift Origin 扩展测试实战:NVIDIA DRA(动态资源分配)GPU 调度验证套件 本文基于 test/extended/node/dra
测试云原生质量保障Debezium OpenShift 部署验证套件实战指南:基于 Strimzi 的 Kafka Connect 集群端到端测试
Debezium OpenShift 部署验证套件实战指南:基于 Strimzi 的 Kafka Connect 集群端到端测试 本文基于 Debezium 仓
后端变更数据捕获数据集成流处理OpenShift origin MonitorTests:与测试套件并行运行的集群观测器原理与实现
OpenShift origin MonitorTests:与测试套件并行运行的集群观测器原理与实现 MonitorTests 是 OpenShift orig
测试云原生质量保障
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考