客座文章最初发表在Sonobuoy上,作者John Schnake
在Sonobuoy 0.15.4中,我们引入了插件通过使用可定制的webhook向Sonobuoy报告插件进展的功能。报告状态对于运行Kubernetes一致性测试的长时间运行的、不透明的插件(如e2e plugin)非常重要。
我们很高兴地宣布,从Kubernetes 1.17.0开始,Kubernetes端到端(E2E)测试框架将利用这个webhook来提供关于将运行多少测试、已经运行了多少测试以及哪些测试失败的反馈。
这个反馈可以帮助你在等待整个运行完成之前查看测试是否失败(以及哪些测试失败)。它还帮助你确定测试是死了的还是正在进行的。
如何使用它
在e2e插件中使用这个特性有两个要求:
首先,运行以下命令来运行e2e插件,这将启动一组长期运行的测试:
$ sonobuoy run
现在,你可以轮询状态使用这个命令:
$ sonobuoy status --json | jq
测试开始运行后,你将开始看到输出,其中包括如下部分:
{
"plugin": "e2e",
"node": "global",
"status": "running",
"result-status": "",
"result-counts": null,
"progress": {
"name": "e2e",
"node": "global",
"timestamp": "2019-11-25T17:21:32.5456932Z",
"msg": "PASSED [sig-storage] HostPath should give a volume the correct mode [LinuxOnly] [NodeConformance] [Conformance]",
"total": 278,
"completed": 2
}
}
瞧!在运行期间的任何时候,你现在都可以检入并获得有关运行情况的更多信息。当测试失败时,输出还将返回一个字符串数组,其中包含failure字段中的测试名称(“msg”字段只报告最后一次测试完成及其结果)。例如:
{
...
"progress": {
...
"msg": "FAILED [sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] should create service with ipv4 cluster ip [Feature:IPv6DualStackAlphaFeature:Phase2]",
...
"failures": [
"[sig-network] [Feature:IPv6DualStackAlphaFeature] [LinuxOnly] should create service with ipv4 cluster ip [Feature:IPv6DualStackAlphaFeature:Phase2]"
]
}
},
问答
问:我使用的是Kubernetes的一个新版本,但是我使用的是一个高级测试配置,我将它存储为一个YAML文件。我还可以得到进度更新吗?
答:可以,e2e插件只有两个环境变量需要设置,这样就能工作:
- name: E2E_USE_GO_RUNNER
value: "true"
- name: E2E_EXTRA_ARGS
value: --progress-report-url=http://localhost:8099/progress
E2E_USE_GO_RUNNER值确保一致性测试镜像使用基于Golang的runner,该runner允许在调用测试时传递额外的参数。E2E_EXTRA_ARGS值设置标记,通知框架将进度更新发送到何处。
状态更新只是发送到localhost,因为测试容器和Sonobuoy sidecar位于同一个pod中。
问:我想尝试这个功能,但没有可用的Kubernetes 1.17.0集群;如何测试它?
答:重要的是一致性测试镜像是1.17或更高版本,所以如果你只是想试试,你可以手动指定镜像版本。由于测试镜像版本和API服务器版本不匹配,结果可能不可靠(例如,可能测试你的集群不支持的特性),并且对于Kubernetes一致性认证无效。
https://www.cncf.io/certification/software-conformance
可以指定运行Sonobuoy时要使用的版本;这里有一个例子:
sonobuoy run --kube-conformance-image-version=v1.17.0-beta.2
问:我想在我自己的自定义插件中实现进度更新。怎么做呢?
答:要查看此功能的示例用法,请查看progress reporter的自述文件。Sonobuoy sidecar会一直监听你的插件是否要发送进度更新,所以只要把一些JSON数据发送到预期的端点就可以了。
https://github.com/vmware-tanzu/sonobuoy/tree/master/examples/plugins/progress-reporter