使用Kubestone对Kubernetes进行基准测试

基准测试(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

环境要求

使用以下命令将Kubestone部署到kubestone-system名称空间:

$ kustomize build github.com/xridge/kubestone/config/default | kubectl create -f -

部署后,Kubestone将监听与kubestone.xridge.io同一组的自定义资源 。

创建基准测试

使用Kubestone执行基准测试,可以通过在集群中创建自定义资源。

命名空间

建议创建一个专用的命名空间进行基准测试。

$ kubectl create namespace kubestone

创建名称空间后,可以使用它对kubernetes集群发送基准测试请求,产生的基准测试结果将保留在此名称空间中。

自定义资源创建和应用

我们将使用kustomizegithub仓库中应用自定义资源。

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:       <none>
Annotations:  <none>
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

K8S中文社区微信公众号

评论 抢沙发

登录后评论

立即登录