☰
OpenShift origin openshift/csi 套件:基于双清单配置的 CSI 驱动认证测试与 LUN 压力测试实战指南
2026/9/25 2:27:23 网站建设 项目流程
  • 测试
  • 云原生
  • 质量保障

【免费下载链接】origin

Conformance test suite for OpenShift

项目地址:https://gitcode.com/gh_mirrors/or/origin
点击查看免费下载

本文围绕 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二进制

  1. 自行编译openshift-tests二进制(在本仓库执行make),或从 OpenShift 镜像中提取。务必使用与你已安装的 OpenShift 版本对应的openshift-tests二进制!
  2. 设置KUBECONFIG环境变量指向你的客户端配置。
  3. 设置TEST_CSI_DRIVER_FILES为上游清单。
  4. (可选)设置TEST_OCP_CSI_DRIVER_FILES为 OpenShift 测试清单。
  5. 运行测试套件: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.log

5.2 使用 OpenShift 发布中的tests容器镜像

这与上面运行openshift-tests二进制大致等价,只是二进制位于容器镜像内。

  1. 在当前目录准备好kubeconfig.yaml、上游测试清单,以及可选的 OpenShift 测试清单;
  2. 找到与你的 OpenShift 集群版本对应的、包含openshift-tests的镜像:
    $ oc adm release info --image-for=tests quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:8e43b259635d5adcef769f5f4359554395c900d7211915249ee66b5602fea5b9
  3. 在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

项目地址:https://gitcode.com/gh_mirrors/or/origin
点击查看免费下载
上一篇:KOReader 跨设备同步设置方法:批注与阅读进度双端互通完整教程
下一篇:CapsNet-Keras 项目结构解析:理解胶囊网络代码组织的黄金法则

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询