K8s集群一致性测试
一致性定义“一致性”(Comformance)定义了K8s(Kubernetes)集群必须支持的一系列集群互操作特性的集合,用于验证集群在不同的环境中能工作在预期的状态下。我们知道K8s集群的一个核心特性是“可移植性”,开发者仅需要做少量的变更即可以将应用部署到一个新的环境中。对于企业应用而言,随着业务的更新需要进行应用的拓展或者新增需求的支持,单一的K8s集群往往不能满...
一致性定义
“一致性”(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集群诊断工具,通过运行一系列可访问且非破坏的配置测试来轻松获取获取集群的状态,可以通过定制、可扩展的、与集群无关的方式来生成清晰的、信息丰富的集群测试报告。
具有以下几个主要的功能:
1.一致性测试(Conformance Testing);
2.负载调试(Workload Debugging);
3.自定义测试和数据收集(Custom Tests and Data Collection);
Sonobuoy工作原理
Sonobuoy主要包含三个主要组成结构:
一个命令行客户端,用于触发一致性测试、获取状态、查看活动log、接收和解压测试结果;
一个运行在K8s集群内部的聚合器,用于执行测试插件和收集测试结果;
一个或多个测试插件,运行在特定命名空间内,用于运行特定的测试或者测试框架;
测试插件框架执行原理如下图。测试插件可自定义和开发,需要遵循Sonobuoy的标准API来通信和传递状态,包如 "pending","running" 或者 "complete" 等。
环境安装
①. 首先安装依赖环境 “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”验证环境安装是否成功。
测试执行
这里以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”测试结果文件。
结果查看
执行 "sonobuoy result <result file > "级可以查看测试测试结果。
也可以执行直接将该测试结果文件解压,用其他IDE查看测试结果文件。
测试用例分析
对于某些“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”。
从该路径中可以找到该测试用例的执行方法。
总结
本文主要介绍了如何用Sonobuoy诊断工具来对K8s集群执行一致性测试。K8s集群一致性测试对于确保组件供应商遵循相同API规范,保持组件间的兼容性,确保用户在使用任何Kubernetes厂商发行版时,都得到的和原生Kuberentes功能几乎一致的体验等多个方面具有重要意义。同时也只有经过一致性认证测试,才能获得CNCF的官方认证,在产品的宣传上使用Certified Kubernetes的认证商标和Logo。后续工作将结合K8s集群的架构,重点分析测试用例执行的方法、考察的内容,进一步加深对K8s集群的认识和了解。
更多推荐
所有评论(0)