移动测试开发 K8s 集群一致性测试
1. 一致性定义
“一致性”(Comformance)定义了 K8s(Kubernetes)集群必须支持的一系列集群互操作特性的集合,用于验证集群在不同的环境中能工作在预期的状态下。我们知道 K8s 集群的一个核心特性是 “可移植性”,开发者仅需要做少量的变更即可以将应用部署到一个新的环境中。对于企业应用而言,随着业务的更新需要进行应用的拓展或者新增需求的支持,单一的 K8s 集群往往不能满足业务变更需求,需要多 K8s 集群或者混合集群部署等方式支持。在此背景下,如果 K8s 集群未通过一致性测试,那么 K8s 集群的便携性和自动部署等能力就无法实现,也无法支持企业的多样化需求,因此我们需要对 K8s 集群进行一致性测试。更多 K8s 官方一致性测试介绍可参考官方介绍:https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/conformance-tests.md
Sonobuoy 是一款 K8s 集群诊断工具,通过运行一系列可访问且非破坏的配置测试来轻松获取获取集群的状态,可以通过定制、可扩展的、与集群无关的方式来生成清晰的、信息丰富的集群测试报告。
具有以下几个主要的功能:
- 一致性测试(Conformance Testing)
- 负载调试(Workload Debugging)
- 自定义测试和数据收集(Custom Tests and Data Collection)
2. Sonobuoy 工作原理
Sonobuoy 主要包含三个主要组成结构:
- 一个命令行客户端,用于触发一致性测试、获取状态、查看活动 log、接收和解压测试结果;
- 一个运行在 K8s 集群内部的聚合器,用于执行测试插件和收集测试结果;
- 一个或多个测试插件,运行在特定命名空间内,用于运行特定的测试或者测试框架;
测试插件框架执行原理如下图。测试插件可自定义和开发,需要遵循 Sonobuoy 的标准 API 来通信和传递状态,包如” pending“,” running“或者” complete“等。
3. 环境安装
- 首先安装依赖环境 “kubectl”
根据执行环境安装对应的 kubectl 环境(https://kubernetes.io/docs/tasks/tools/)。确保被测集群的 config 文件配置正确,” kubectl cluster-info“可返回正确集群信息。
- 安装 Sonobuoy 诊断工具
可到 Github 的 sSonobuoy 主要下载最新的安装包(https://github.com/vmware-tanzu/sonobuoy/releases),解压安装包后,添加 “sonobuoy” 到可执行环境变量。执行 “sonobuoy version” 验证环境安装是否成功。
4. 测试执行
这里以 e2e 测试插件为例介绍 Sonobuoy 测试执行。e2e 插件 (Kubernetes End-To-End Tests) 更多介绍可参考官方主页(https://github.com/vmware-tanzu/sonobuoy-plugins/tree/main/e2e)。其他支持的测试插件介绍(https://github.com/vmware-tanzu/sonobuoy-plugins)。
第一步,同步官方镜像到本地,解决本地集群镜像下载慢的问题。
这里推荐用 Skopeo 工具快速同步镜像。注意下载的测试镜像的版本应与集群 Kubernetst 版本一致,如当前集群版本是 “v1.21.3”,则下载 “k8s.gcr.io/conformance:v1.21.3 ” 镜像。
用 Skopeo 同步镜像到本地仓库:
skopeo --override-os linux copy docker://k8s.gcr.io/conformance:v1.21.3 docker://r.addops.soft.360.cn/google-containers/conformance:v1.21.3 --insecure-policy --dest-tls-verify=false
第二步,下载 e2e 测试插件 yaml 文件。
e2e 测试插件官方模板(https://github.com/vmware-tanzu/sonobuoy-plugins/blob/main/e2e/e2e.yaml)
odSpec:
containers: []
nodeSelector:
kubernetes.io/os: linux
restartPolicy: Never
serviceAccountName: sonobuoy-serviceaccount
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
operator: Exists
- key: CriticalAddonsOnly
operator: Exists
- key: kubernetes.io/e2e-evict-taint-key
operator: Exists
sonobuoy-config:
driver: Job
plugin-name: e2e
result-format: junit
source_url: https://raw.githubusercontent.com/vmware-tanzu/sonobuoy-plugins/main/e2e/e2e.yaml
description: The end-to-end tests maintained by Kubernetes to test the health of your cluster.
spec:
command:
- /run_e2e.sh
env:
- name: E2E_EXTRA_ARGS
value: --progress-report-url=http://localhost:8099/progress
- name: E2E_FOCUS
value: \[Conformance\]
- name: E2E_PARALLEL
value: "false"
- name: E2E_SKIP
value: \[Disruptive\]|NoExecuteTaintManager
- name: E2E_USE_GO_RUNNER
value: "true"
image: k8s.gcr.io/conformance:$SONOBUOY_K8S_VERSION
imagePullPolicy: IfNotPresent
name: e2e
resources: {}
volumeMounts:
- mountPath: /tmp/results
name: results
注意将 yaml 中的 image 地址更新为第一步中同步到本地的镜像地址。
第二步,执行测试。
执行以下命令,其他测试插件的运行可按同样的方式制定到不同插件的 yaml 文件路径即可。
sonobuoy run --plugin ./plugin/e2e.yaml
测试执行之后,可以看到集群里面创建了一些测试相关的 pod。
可以看到 e2e container 运行的 log 如下。
测试执行过程也可以通过 “sonobuoy status” 查看执行状态。
执行大于 1-2 小时后(取决集群和测试用例集大小),可以看到测试执行完成。
第三步,测试结果提取。
执行 “sonobuoy retrieve
” 即可收集测试结果,可以在当前目录生成 “*.tar.gz” 测试结果文件。
5. 结果查看
- 执行”
sonobuoy result <result file >
” 级可以查看测试测试结果。
- 也可以执行直接将该测试结果文件解压,用其他 IDE 查看测试结果文件。
6. 测试用例分析
对于某些 “failed” 状态的测试用例,需要分析执行失败的原因。可以到 Kubernetes 官网查看测试用例执行原理,进而分析造成执行失败原因。
如测试用例 “'[sig-apps] Daemon set [Serial] should run and stop complex daemon [Conformance]’”,其返回的测试结果如下:
可以根据官方 “conformance tests” 用例网址(https://github.com/kubernetes/kubernetes/blob/ea0764452222146c47ec826977f49d7001b0ea8c/test/conformance/testdata/conformance.yaml)可以定位到该测试用例,找到测试用例定义文件路径:“test/e2e/apps/daemon_set.go”。
从该路径中可以找到该测试用例的执行方法。
7. 总结
本文主要介绍了如何用 Sonobuoy 诊断工具来对 K8s 集群执行一致性测试。K8s 集群一致性测试对于确保组件供应商遵循相同 API 规范,保持组件间的兼容性,确保用户在使用任何 Kubernetes 厂商发行版时,都得到的和原生 Kuberentes 功能几乎一致的体验等多个方面具有重要意义。同时也只有经过一致性认证测试,才能获得 CNCF 的官方认证,在产品的宣传上使用 Certified Kubernetes 的认证商标和 Logo。后续工作将结合 K8s 集群的架构,重点分析测试用例执行的方法、考察的内容,进一步加深对 K8s 集群的认识和了解。