产品如何做Kubernetes一致性认证

Certified Kubernetes是CNCF基金会在2018年推出的Kubernetes一致性认证计划。它由CNCF基金会提供的一套诊断测试工具(Sonobuoy)并运行在Kubernetes中。各云厂商如果需要将自己产品纳入到Certified Kubernetes当中,就需要按照操作指导进行自身测试,并将测试结果上传给CNCF社区,当报告审核通过,交付一定的费用(CNCF Members免费)后,就会得到CNCF基金会给企业颁发一个Certified Kubernetes的认证。也就是说得到认证后企业就能在自己的产品宣传上使用CNCF基金会的Certified Kubernetes商标和在产品中使用带Kubernetes字样的名称。Certified Kubernetes Logo大概长这个样子。

Certified Kubernetes

Certified Kubernetes好处

  • 一致性

    只要获得了一致性认证,用户在对任何Kubernetes厂商发行版进行安装或交互时,得到的和原生Kuberentes功能几乎一致的体验

  • 及时更新

    为了保持认证,CNCF基金会要求厂商需要每年或更频繁地提供对最版本的Kubernetes支持。通常情况下来说,厂商提交的产品适配的版本,为官方最新的次要发型版本(x.y)以及最近的两个发行版(x.y-1 和 x.y-2)

    例子。在Kubernetes v1.23发布后,新的合格产品最初可以针对Kubernetes v1.23、v1.22或v1.21进行自我认证,但不能针对v1.20再进行测试。

    了解Kubernetes的同学都知道,K8S几乎每年会以3-4个大版本进行迭代,这样就等于让各大厂商必须跟这个K8S的迭代进行适配。也侧面上加强了社区对于各大厂商的控制

  • 可确认性

    任何终端用户都可以通过运行用于认证的相同的开源一致性应用程序(Sonobuoy)来确认他们的发行版或平台仍然符合要求,以免用户被厂商锁定。

Sonobuoy

Sonobuoy 是一个诊断工具,通过它我们可以访问且以非破坏性的方式运行一组插件(其中包括Kubernetes一致性认证的测试)使我们更轻松地了解 Kubernetes 集群的状态。同时Sonobuoy 也是一种可定制、可扩展和黑盒的方式生成有关Kubernetes集群的相关报告工具。

我们可以用Sonobuoy来对Kubernetes内的资源做如下用例测试:

  • 集成的端到端 (e2e) 一致性测试
  • 工作负载调试
  • 扩展插件来采集自定义数据

环境准备

在使用Sonobuoy之前我们需要准备好如下环境:

  • 一个可以正常访问的Kubernetes集群
  • 拥有被测试Kubernetes集群的ADMIN权限,以及它的kubeconfig文件
  • kubectl命令(某些告警场景会用,Certified Kubernetes不需要)
  • sonobuoy的docker镜像
  • 本地的私有化镜像仓库(强烈建议要有!!!)

安装

在下述链接中下载最新版本的Sonobuoy二进制文件,将它解压后,并把可执行文件sonobuoy路径添加到系统的PATH环境变量下即可。

https://github.com/vmware-tanzu/sonobuoy/releases

运行测试

标准的一致性测试集目前是由 kubernetes e2e套件中的 [Conformance] 标签定义的。所以我们需要使用如下命令进行部署。

$ sonobuoy run --mode=certified-conformance
INFO[0000] created object                                name=sonobuoy namespace= resource=namespaces
INFO[0000] created object                                name=sonobuoy-serviceaccount namespace=sonobuoy resource=serviceaccounts
INFO[0001] created object                                name=sonobuoy-serviceaccount-sonobuoy namespace= resource=clusterrolebindings
INFO[0001] created object                                name=sonobuoy-serviceaccount-sonobuoy namespace= resource=clusterroles
INFO[0001] created object                                name=sonobuoy-config-cm namespace=sonobuoy resource=configmaps
INFO[0001] created object                                name=sonobuoy-plugins-cm namespace=sonobuoy resource=configmaps
INFO[0001] created object                                name=sonobuoy namespace=sonobuoy resource=pods
INFO[0001] created object                                name=plugin-e2e-cm namespace=sonobuoy resource=configmaps
INFO[0001] created object                                name=sonobuoy-aggregator namespace=sonobuoy resource=services

当sonobuoy容器正常运后,它就会开始创建e2e容器和systemd-log容器开始进行相关的测试和日志收集。

$ kubectl get pod -n sonobuoy                                                                                                                                                                             
NAME                                                      READY   STATUS    RESTARTS   AGE   IP               NODE              NOMINATED NODE   READINESS GATES
sonobuoy                                                  1/1     Running   0          31s   192.169.15.126   k8s-master3-123   <none>           <none>
sonobuoy-e2e-job-23d08735503942f5                         2/2     Running   0          27s   192.169.15.86    k8s-master3-123   <none>           <none>
sonobuoy-systemd-logs-daemon-set-c7fe30c923a848d5-c7wvz   2/2     Running   0          27s   172.16.23.123    k8s-master3-123   <none>           <none>
sonobuoy-systemd-logs-daemon-set-c7fe30c923a848d5-d28gr   2/2     Running   0          27s   172.16.23.122    k8s-master2-122   <none>           <none>
sonobuoy-systemd-logs-daemon-set-c7fe30c923a848d5-q25t8   2/2     Running   0          27s   172.16.23.124    k8s-node1-124     <none>           <none>
sonobuoy-systemd-logs-daemon-set-c7fe30c923a848d5-wkd4f   2/2     Running   0          27s   172.16.23.125    k8s-node2-125     <none>           <none>
sonobuoy-systemd-logs-daemon-set-c7fe30c923a848d5-z829h   2/2     Running   0          27s   172.16.23.121    k8s-master1-121   <none>           <none>

在测试的进行过程中,我们可以使用sonobuoy status命令进行查看当前任务的执行状态,可以用sonobuoy logs来查看用例的执行日志。

image.png

提示:certified-conformance测试通常会跑1 - 2个小时

当我们用sonobuoy status发现状态都为completed时,就代表一致性测试运行完成。

定制镜像(可选)

如果你的Kubernetes网络足够科学可以跳过此步骤。

众所周知,Docker Hub在今年开启了对Pull镜像的请求限制,而我们运行sonobuoy是,有大量用例都会从Docker Hub或者gcr.io上去拉取镜像,如果网络不稳定的话,整个测试时间会被拉的非常长,且极容易出现用例执行超时失败的现象。所以我们需要将线上镜像离线到本地镜像仓库,以加速镜像的下载。

好在sonobuoy提供了修改插件镜像地址的方式来让我们配置。

私有测试用例镜像仓库

  • 下载测试用例所需的镜像列表
$ sonobuoy  images  pull
INFO[0000] e2e image to be used: k8s.gcr.io/conformance:v1.18.16
INFO[0005] Pulling image: gcr.io/authenticated-image-pulling/alpine:3.7 ...
ERRO[0010] failed with following error after 1 retries:
ERRO[0010] Error response from daemon: unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication
INFO[0014] Pulling image: invalid.com/invalid/alpine:3.1 ...
ERRO[0016] failed with following error after 1 retries:
ERRO[0016] Error response from daemon: Get https://invalid.com/v2/: remote error: tls: handshake failure
INFO[0017] Pulling image: gcr.io/authenticated-image-pulling/windows-nanoserver:v1 ...
ERRO[0020] failed with following error after 1 retries:
ERRO[0020] Error response from daemon: unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication
INFO[0023] Pulling image: gcr.io/k8s-authenticated-test/agnhost:2.6 ...
ERRO[0027] failed with following error after 1 retries:
ERRO[0027] Error response from daemon: unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication
ERRO[0027] couldn't pull image: gcr.io/authenticated-image-pulling/alpine:3.7: exec: already started
ERRO[0027] couldn't pull image: invalid.com/invalid/alpine:3.1: exec: already started
ERRO[0027] couldn't pull image: gcr.io/authenticated-image-pulling/windows-nanoserver:v1: exec: already started
ERRO[0027] couldn't pull image: gcr.io/k8s-authenticated-test/agnhost:2.6: exec: already started

在运行上述命令时,可能会看到一些类似镜像不存在或者无权限pull镜像的错误。这是正常的,因为有些镜像被一些端到端测试所引用,但不被一致性测试所引用。

  • 创建镜像仓库列表
$ sonobuoy gen default-image-config > custom-repo-config.yaml
$ cat ./custom-repo-config.yaml

dockerLibraryRegistry: docker.io/library
e2eRegistry: gcr.io/kubernetes-e2e-test-images
gcRegistry: k8s.gcr.io
googleContainerRegistry: gcr.io/google-containers
sampleRegistry: gcr.io/google-samples
  • 修改custom-repo-config.yaml为你的本地仓库
$ cat ./custom-repo-config.yaml

dockerLibraryRegistry: xxx.yyy.zzz/library
e2eRegistry: xxx.yyy.zzz/library
gcRegistry: xxx.yyy.zzz/library
googleContainerRegistry: xxx.yyy.zzz/library
sampleRegistry: xxx.yyy.zzz/library
  • 推送镜像到本地仓库
sonobuoy images push --e2e-repo-config <path/to/custom-repo-config.yaml>

私有Sonobuoy镜像

Sonobuoy提供几个参数让我们来制定私有镜像启动

--systemd-logs-image     #指定日志采集镜像
--sonobuoy-image          # 指定Sonobuoy镜像
--e2e-repo-config           # 指定Sonobuoy用例镜像配置

那么最后我们可以用如下命令就能在自己私有化环境里面进行测试了

$ sonobuoy run \
--mode=certified-conformance \
--sonobuoy-image=xxx.yyy.zzz/library/sonobuoy:v0.53.2 \
--kubernetes-version=v1.18.16 \
--systemd-logs-image=xxx.yyy.zzz/library/systemd-logs:v0.3 \
--e2e-repo-config conformance-image-config.yaml

提取结果

运行命令sonobuoy retrieve就会把当前跑完的测试结果以tar包的方式保存在当前目录,对它进行解压就得到了类似如下目录结构的文件

$ tree -L 2
.
├── 202108180508_sonobuoy_ff7aa0c1-34cb-4375-a09e-153235a96d34.tar.gz
├── hosts
│   ├── k8s-master1-121
│   ├── k8s-master2-122
│   ├── k8s-master3-123
│   ├── k8s-node1-124
│   └── k8s-node2-125
├── meta
│   ├── config.json
│   ├── info.json
│   ├── query-time.json
│   └── run.log
├── plugins
│   ├── e2e
│   └── systemd-logs
├── podlogs
│   └── sonobuoy
├── resources
│   ├── cluster
│   └── ns
├── servergroups.json
└── serverversion.json

需要提交给CNCF社区的两个文件就位于plugins/e2e/results/global/{e2e.log,junit_01.xml}

上传结果

在Github上Fork社区的[cncf/k8s-conformance]到自己的仓库,并在指定的Kubernetes目录下创建一个目录。目录要求是一个简短的产品名称。同时将e2e.logjunit_01.xml两个文件伙同产品描述文件(PRODUCT.yaml)一起保存在目录下。

PRODUCT.yaml的内容描述

字段 Description
vendor 认证的法律实体的名称。该实体必须有一份在CNCF备案的参与表格。
name 被Certified Kubernetes认证的产品名称
version 被Certified Kubernetes认证的产品版本(非Kubernetes版本)
website_url 产品介绍地址
repo_url 如果产品是开源的,就必须指向包含源代码的主要GitHub repo地址。也是可以接受Docker镜像地址。可选的
documentation_url 产品文档地址
product_logo_url 产品Logo地址(必须是 SVG、AI 或者 EPS 格式,且需包含产品名称),如果没有则使用公司的Logo
type 产品类型,包含三种 发行版( product a distribution), 托管平台(hosted platform) 或者安装器(installer)
description 一句话的产品描述文字

如下就是一个样例

vendor: Yoyodyne
name: Turbo Encabulator
version: v1.7.4
website_url: https://yoyo.dyne/turbo-encabulator
repo_url: https://github.com/yoyo.dyne/turbo-encabulator
documentation_url: https://yoyo.dyne/turbo-encabulator/docs
product_logo_url: https://yoyo.dyne/assets/turbo-encabulator.svg
type: distribution
description: 'The Yoyodyne Turbo Encabulator is a superb Kubernetes distribution for all of your Encabulating needs.'

接下来我们就可以提交一个PR来让CNCF社区人员来进行复核了,通常情况下会在提交后的3个工作日内回复。

清理环境

运行sonobuoy delete命令即可完成整个测试过程中产生的K8S资源。

不过如果sonobuoy的测试用例执行失败后不会自动清除,需要用户执行清理残留资源

总结

本文主要讲述了小白对CNCF社区对Kubernetes一致性认证的理解,以及如何利用Sonobuoy工具来对自己的Kubernetes集群做集成测试。Sonobuoy是一个非常好的集成测试工具,它除了能做Kubernetes一致性测试外,还能做性能测试存储测试以及厂商自定义的测试。同时,本文还对提交Certified Kubernetes做了一个简单的流程说明。如果有读者的公司正在做相关的工作的话,希望能够帮到你。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容