一致性定义

“一致性”(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集群诊断工具,通过运行一系列可访问且非破坏的配置测试来轻松获取获取集群的状态,可以通过定制、可扩展的、与集群无关的方式来生成清晰的、信息丰富的集群测试报告。

2f0b6e8505eae9a25b11d2c59f330c58.png

具有以下几个主要的功能:

1.一致性测试(Conformance Testing);

2.负载调试(Workload Debugging);

3.自定义测试和数据收集(Custom Tests and Data Collection);

ff16ca7a57a48f0b82d07408c244268c.png

Sonobuoy工作原理

Sonobuoy主要包含三个主要组成结构:

一个命令行客户端,用于触发一致性测试、获取状态、查看活动log、接收和解压测试结果;

一个运行在K8s集群内部的聚合器,用于执行测试插件和收集测试结果;

一个或多个测试插件,运行在特定命名空间内,用于运行特定的测试或者测试框架;

78eeb228c322baaaac3c56f4d509c48e.png

测试插件框架执行原理如下图。测试插件可自定义和开发,需要遵循Sonobuoy的标准API来通信和传递状态,包如 "pending","running" 或者 "complete" 等。

1fc2ba313f80b2fbae015f6e3a0cedfe.png

环境安装

①. 首先安装依赖环境 “kubectl” 

根据执行环境安装对应的 kubectl 环境(https://kubernetes.io/docs/tasks/tools/)。确保被测集群的config文件配置正确,”kubectl cluster-info“可返回正确集群信息。

4518f0edfa5526831ca48c266670bce7.png

②. 安装Sonobuoy诊断工具

可到Github的sSonobuoy主要下载最新的安装包(https://github.com/vmware-tanzu/sonobuoy/releases),解压安装包后,添加“sonobuoy”到可执行环境变量。执行“sonobuoy version”验证环境安装是否成功。

27b4f94b34dbcf7f024fcf73716c04d5.png

测试执行

这里以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 ”镜像。

001fd5ad1d67ffb64a6f88515f2b3ad3.png

用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

6e0b55fa7e9cf4b5604584619c071864.png

测试执行之后,可以看到集群里面创建了一些测试相关的pod。

ed968e076d22ee2de2d17dd6b2f4a998.png

可以看到e2e container运行的log如下。

677b1be6276f08488353ed54a4d8f429.png

测试执行过程也可以通过 "sonobuoy status" 查看执行状态。

276585b3b5ff98b6b751ed664f09af25.png

执行大于1-2小时后(取决集群和测试用例集大小),可以看到测试执行完成。

4994f1d7d393819db04a857e99b63fc0.png

第三步,测试结果提取。

执行 "sonobuoy retrieve" 即可收集测试结果,可以在当前目录生成“*.tar.gz”测试结果文件。

9caa3c9f5e3955c88c6b040db6b7bab6.png

结果查看

执行 "sonobuoy result <result file > "级可以查看测试测试结果。

c3bd7d607f2b906f943bba5735e3299d.png

也可以执行直接将该测试结果文件解压,用其他IDE查看测试结果文件。

dad2dda5731d7e39cc45503489e36bf5.png

测试用例分析

对于某些“failed”状态的测试用例,需要分析执行失败的原因。可以到Kubernetes官网查看测试用例执行原理,进而分析造成执行失败原因。

如测试用例“'[sig-apps] Daemon set [Serial] should run and stop complex daemon [Conformance]'”,其返回的测试结果如下:

abbccac467005fdf654cde3df773afa6.png

可以根据官方“conformance tests”用例网址

https://github.com/kubernetes/kubernetes/blob/ea0764452222146c47ec826977f49d7001b0ea8c/test/conformance/testdata/conformance.yaml

可以定位到该测试用例,找到测试用例定义文件路径:“test/e2e/apps/daemon_set.go”。

f3f7a6b43951c71081e7a9e6d4a69c7f.png

从该路径中可以找到该测试用例的执行方法。

7a961b066e719cfdea55e3d239901178.png

acb941638bf1fbf6d74d48d8dfeb9237.gif

总结

ebd1b8c15e5a724bcb95c4fe012f2149.gif

本文主要介绍了如何用Sonobuoy诊断工具来对K8s集群执行一致性测试。K8s集群一致性测试对于确保组件供应商遵循相同API规范,保持组件间的兼容性,确保用户在使用任何Kubernetes厂商发行版时,都得到的和原生Kuberentes功能几乎一致的体验等多个方面具有重要意义。同时也只有经过一致性认证测试,才能获得CNCF的官方认证,在产品的宣传上使用Certified Kubernetes的认证商标和Logo。后续工作将结合K8s集群的架构,重点分析测试用例执行的方法、考察的内容,进一步加深对K8s集群的认识和了解。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐