基准测试(benchmarking)是一种测量和评估软件性能指标的活动。 随着客户对容器和分布式应用程序的敏捷性和可伸缩性要求越来越高,组织也需要具有用基准问题测试其应用程序的能力。
在本文中,我将向你介绍名为Kubestone的云原生基准测试工具。 Kubestone是一个基准测试operator,可以用来评估Kubernetes集群的性能。
Kubestone如何工作?
Kubestone特征
- 支持一组通用的基准测试:CPU,磁盘,网络和应用程序性能
- 对Kubernetes的细粒度控制:亲和力,反亲和力,容忍度,存储类和节点选择
- 支持云原生:基准测试被定义为CRD资源,并使用Kubernetes资源( Pods, Jobs,Deployments和Services)在集群中执行。
- 可扩展:通过实现新的控制器,可以轻松添加新的基准。
Kubestone基准测试列表
类型 | 基准测试名称 | 状态 |
---|---|---|
Core/CPU | sysbench | 已支持 |
Core/Disk | fio | 已支持 |
Core/Disk | ioping | 已支持 |
Core/Memory | sysbench | 已支持 |
Core/Network | iperf3 | 已支持 |
Core/Network | qperf | 已支持 |
HTTP Load Tester | drill | 已支持 |
Application/Etcd | etcd | 计划中 |
Application/K8S | kubeperf | 计划中 |
Application/PostgreSQL | pgbench | 已支持 |
Application/Spark | sparkbench | 计划中 |
让我们尝试安装Kubestone并自己运行基准测试,看看它是如何工作的。
安装Kubestone
环境要求
- Kubernetes v1.13版本(或更高版本)
- Kustomize v3.1.0
- 集群管理员权限
使用以下命令将Kubestone部署到kubestone-system名称空间:
$ kustomize build github.com/xridge/kubestone/config/default | kubectl create -f -
部署后,Kubestone将监听与kubestone.xridge.io同一组的自定义资源 。
创建基准测试
使用Kubestone执行基准测试,可以通过在集群中创建自定义资源。
命名空间
建议创建一个专用的命名空间进行基准测试。
$ kubectl create namespace kubestone
创建名称空间后,可以使用它对kubernetes集群发送基准测试请求,产生的基准测试结果将保留在此名称空间中。
自定义资源创建和应用
我们将使用kustomize从github仓库中应用自定义资源。
kustomize 是 kubernetes 原生的配置管理,以无模板方式来定制应用的配置。
kustomize 使用 k8s 原生概念帮助创建并复用资源配置(YAML),允许用户以一个应用描述文件 (YAML文件)为基础(Base YAML),然后通过 Overlay 的方式生成最终部署应用所需的描述文件。
$ kustomize build github.com/xridge/kubestone/config/samples/fio/overlays/pvc
自定义的YAML文件具体内容,如下所示:
apiVersion: perf.kubestone.xridge.io/v1alpha1 kind: Fio metadata: name: fio-sample spec: cmdLineArgs: --name=randwrite --iodepth=1 --rw=randwrite --bs=4m --size=256M image: name: xridge/fio:3.13 volume: persistentVolumeClaimSpec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi volumeSource: persistentVolumeClaim: claimName: GENERATED
当我们在Kubernetes中创建此资源时, operator将对其进行解释并创建相关的基准测试。
- metadata.name:自定义资源名称。它可用于查询或删除集群中的基准测试。
- cmdLineArgs:基准测试参数。上文中,我们将为Fio(文件系统基准测试)提供参数。上文的设置,表示基准测试程序以4Mb的块大小执行随机写入测试,而总传输大小为256MB。
- image.name:基准测试的镜像。
- volume.persistentVolumeClaimSpec:鉴于Fio是磁盘基准测试,我们需要设置PersistentVolumeClaim。上文的设置,表示Kubernetes从默认的StorageClass申请1GB的空间,并将其用于基准测试。
运行基准测试
现在,当我们了解基准测试的定义时,我们可以尝试执行它。
注意:在执行此步骤之前,请确保已安装kubestone operator并运行它。
$ kustomize build github.com/xridge/kubestone/config/samples/fio/overlays/pvc | kubectl create --namespace kubestone -f -
kustomize build命令的输出,通过管道传递给 kubectl create命令,因此它将在Kubernetes集群中创建对象。
可以使用对象的类型(fio)及其名称(fio-sample)查询生成的对象:
$ kubectl describe --namespace kubestone fio fio-sample Name: fio-sample Namespace: kubestone Labels: Annotations: API Version: perf.kubestone.xridge.io/v1alpha1 Kind: Fio Metadata: Creation Timestamp: 2019-09-14T11:31:02Z Generation: 1 Resource Version: 31488293 Self Link: /apis/perf.kubestone.xridge.io/v1alpha1/namespaces/kubestone/fios/fio-sample UID: 21cdbe92-d6e3-11e9-ba70-4439c4920abc Spec: Cmd Line Args: --name=randwrite --iodepth=1 --rw=randwrite --bs=4m --size=256M Image: Name: xridge/fio:3.13 Volume: Persistent Volume Claim Spec: Access Modes: ReadWriteOnce Resources: Requests: Storage: 1Gi Volume Source: Persistent Volume Claim: Claim Name: GENERATED Status: Completed: true Running: false Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Created 11s kubestone Created /api/v1/namespaces/kubestone/configmaps/fio-sample Normal Created 11s kubestone Created /api/v1/namespaces/kubestone/persistentvolumeclaims/fio-sample Normal Created 11s kubestone Created /apis/batch/v1/namespaces/kubestone/jobs/fio-sample
如Events所示,Kubestone 为自定义资源创建了ConfigMap, PersistentVolumeClaim和Job对象。Status字段告诉我们基准测试已完成。
查看基准测试创建的对象
可以使用以下kubectl命令列出与基准测试相关的对象:
$ kubectl get pods,jobs,configmaps,pvc --namespace kubestone NAME READY STATUS RESTARTS AGE pod/fio-sample-bqqmm 0/1 Completed 0 54s NAME COMPLETIONS DURATION AGE job.batch/fio-sample 1/1 15s 54s NAME DATA AGE configmap/fio-sample 0 54s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/fio-sample Bound pvc-b3898236-c698-11e9-8071-4439c4920abc 1Gi RWO rook-ceph-block 54s
如上所示,Fio控制器创建了PersistentVolumeClaim和ConfigMap,Fio Job在基准测试执行期间将使用该ConfigMap。Fio Job有一个关联的Pod,其中包含我们要执行的基准测试。运行结果可以用以下kubectl logs命令显示:
$ kubectl logs --namespace kubestone fio-sample-bqqmm randwrite: (g=0): rw=randwrite, bs=(R) 4096KiB-4096KiB, (W) 4096KiB-4096KiB, (T) 4096KiB-4096KiB, ioengine=psync, iodepth=1 fio-3.13 Starting 1 process randwrite: Laying out IO file (1 file / 256MiB) randwrite: (groupid=0, jobs=1): err= 0: pid=47: Sat Aug 24 17:58:10 2019 write: IOPS=470, BW=1882MiB/s (1974MB/s)(256MiB/136msec); 0 zone resets clat (usec): min=1887, max=2595, avg=2042.76, stdev=136.56 lat (usec): min=1953, max=2688, avg=2107.35, stdev=142.94 clat percentiles (usec): | 1.00th=[ 1893], 5.00th=[ 1926], 10.00th=[ 1926], 20.00th=[ 1958], | 30.00th=[ 1991], 40.00th=[ 2008], 50.00th=[ 2024], 60.00th=[ 2040], | 70.00th=[ 2057], 80.00th=[ 2073], 90.00th=[ 2114], 95.00th=[ 2409], | 99.00th=[ 2606], 99.50th=[ 2606], 99.90th=[ 2606], 99.95th=[ 2606], | 99.99th=[ 2606] lat (msec) : 2=34.38%, 4=65.62% cpu : usr=2.22%, sys=97.78%, ctx=1, majf=0, minf=9 IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% issued rwts: total=0,64,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=1 Run status group 0 (all jobs): WRITE: bw=1882MiB/s (1974MB/s), 1882MiB/s-1882MiB/s (1974MB/s-1974MB/s), io=256MiB (268MB), run=136-136msec Disk stats (read/write): rbd7: ios=0/0, merge=0/0, ticks=0/0, in_queue=0, util=0.00%
列举已安装的基准测试
我们已经了解到,Kubestone使用自定义资源来定义基准测试。我们可以使用kubectl get crds命令列举已安装的自定义资源:
$ kubectl get crds | grep kubestone drills.perf.kubestone.xridge.io 2019-09-08T05:51:26Z fios.perf.kubestone.xridge.io 2019-09-08T05:51:26Z iopings.perf.kubestone.xridge.io 2019-09-08T05:51:26Z iperf3s.perf.kubestone.xridge.io 2019-09-08T05:51:26Z pgbenches.perf.kubestone.xridge.io 2019-09-08T05:51:26Z sysbenches.perf.kubestone.xridge.io 2019-09-08T05:51:26Z
使用上面的CRD名称,我们可以查看系统中执行的基准测试。
Kubernetes提供了有关CRD的便利功能:使用CRD的简称来操作资源对象。例如,fios.perf.kubestone.xridge.io可以缩短为fio。因此,我们可以使用fio查看资源对象:
$ kubectl get --namespace kubestone fios.perf.kubestone.xridge.io NAME RUNNING COMPLETED fio-sample false true
删除基准测试
成功执行基准测试后,结果对象将存储在Kubernetes集群中。鉴于Kubernetes在系统中只能容纳有限数量的Pod,建议用户经常清理基准测试。我们可以通过删除启动基准测试的自定义资源来实现:
$ kubectl delete --namespace kubestone fio fio-sample
由于自定义资源对创建的资源拥有所有权,这个删除操作也将删除 pod, job,configmap,pvc等。
下一步
现在你已经熟悉了Kubestone的关键概念,是时候进行了解和尝试基准测试了。你可以通过Fio Benchmark的cmdLineArgs,Persistent Volume和Scheduling相关设置进行操作。
译文链接: https://dzone.com/articles/cloud-native-benchmarking-with-kubestone