前回は、Rook Cephを使って分散ストレージのインストールを試してみました。今回は、仮想マシンで構築したRook Cephから払い出したPersistentVolumeについてfioを使ってパフォーマンスのベンチマークを取ってみました。
構成
- vCenter 7.0 U3
- ESXi 7.0 Update 3
- Ubuntu 22.04 (テンプレートVM)
- open-vm-tools 11.3.5
- cloud-init 22.2
- Kubespray
- kubernetes v1.25.5
- MetalLB v0.12.1
- ingress-nginx v1.5.1
- CoreDNS
- EdgeRouter X
- Rook Ceph v1.10.9
ベンチマークについて
ストレージのパフォーマンスのベンチマークでよく使われるfioを利用してみました。
Kubernetesでfioを使ったパフォーマンスのベンチマークをする方法はいくつかあるようで、いくつか試してみましたが、最近更新がなくmanifestファイルを修正が必要だったり、fioの定義ファイルがConfigMapに測定のたびに変更が必要だったり、クラスタ外からCLIツールを使って計測するものなどいくつかありました。
いろいろな条件で測定してみかったので、シンプルにubutnuのDeploymentを作成し、その中でfioコマンドを実行することにしました。
PVCとDeploymentの作成
以下のようなmanifestファイルを作成します。ubuntuのイメージはUbuntu 22.04になります。
$ vi ubuntu.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ubuntu-pv-claim labels: app: ubuntu spec: storageClassName: rook-ceph-block accessModes: - ReadWriteOnce resources: requests: storage: 20Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: ubuntu-deployment labels: app: ubuntu spec: selector: matchLabels: app: ubuntu strategy: type: Recreate template: metadata: labels: app: ubuntu spec: containers: - image: ubuntu name: ubuntu command: - sleep - infinity volumeMounts: - name: ubuntu-persistent-storage mountPath: /mnt/rook-vol1 volumes: - name: ubuntu-persistent-storage persistentVolumeClaim: claimName: ubuntu-pv-claim
以下のコメントでPVCとDeploymentを作成します。
$ kubectl apply -f ubuntu.yaml
ubuntuのPodが起動し、PVとPVCが作成されたことを確認します。
$ kubectl get pod,pv,pvc NAME READY STATUS RESTARTS AGE pod/exdns-k8s-gateway-58bf7c6c75-vgjm8 1/1 Running 0 8d pod/ubuntu-deployment-64548dcd7-l8gpq 1/1 Running 0 37h NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/pvc-39d09d74-62ec-4c14-920b-cec8995915d4 20Gi RWO Delete Bound default/ubuntu-pv-claim rook-ceph-block 37h NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/ubuntu-pv-claim Bound pvc-39d09d74-62ec-4c14-920b-cec8995915d4 20Gi RWO rook-ceph-block 37h
fioのインストール
Dockerfileを作成して、先に独自イメージをビルドしてもよいですが、シンプルにコンテナ内でfioをインストールします。また合わせて、そのあとに必要なjqもンストールします。
$ kubectl exec -it ubuntu-deployment-64548dcd7-l8gpq -- bash # apt update # apt install -y fio jq
fioによるパフォーマンスのベンチマーク
複数のブロックサイズと複数のI/Oパターンのタイプで測定するため、以下のようなコマンドで実行してみました。
direct=1でnon-buffered I/Oを利用し、iodepth=32でキュー中に待機させるIOリクエストの最大数を32に指定、ioengine=libaioでIOを発生させる方法としてLinux ネイティブの非同期 I/Oを指定、numjobs=8でスレッド数を8に指定、group_reportingで複数スレッドの結果をまとめてレポート、output-format=jsonで計測結果をjson形式で出力という設定を行っています。
# for BS in 4k 8k 16k 64k 1m; do for RW in write randwrite read randread; do fio -filename=/mnt/rook-vol1/test -direct=1 -iodepth=32 -rw=$RW -ioengine=libaio -bs=$BS -size=1G -numjobs=8 -runtime=30 -name=32-$RW-$BS --group_reporting --output-format=json | \ jq -cr '[."global options".iodepth,."global options".bs, ."global options".rw, .jobs[0].read.iops, .jobs[0].write.iops, .jobs[0].read.bw, .jobs[0].write.bw]|@csv' done done
以下のような出力がでます。
"32","4k","write",0,807.73655,0,3230 "32","4k","randwrite",0,597.798587,0,2391 "32","4k","read",7619.117402,0,30476,0 "32","4k","randread",2980.814552,0,11923,0 :
合わせて、workerノード側のUbuntuの仮想マシンでも同様にfioを使ってベンチマークを取得してみます。
こちらが仮想マシンで構築したRook Cephから払い出したPersistentVolumeで測定したfioのパフォーマンスのベンチマーク結果です。
こちらが、workerノード側のUbuntuの仮想マシンで測定したfioのパフォーマンスのベンチマーク結果です。
workerノードはすべて同一のサーバーで稼働しているため、Rook Cephの性能はどうしても仮想マシン単体で測定した帯域の1/10ぐらいにはなってそうでした。
workerノードが稼働しているサーバーにはNVMeが接続されており、仮想マシン単体での性能の良さが良く分かります。
仮想マシンで構築したRook Cephですが、writeに比べreadの性能が良いように見えいます。また、ランダムに比べるとシーケンシャルのほうが性能がよさそうでした。
このあたりも物理サーバーで構築したRook CephだとIO特性が変わってくるのかもしれません。
仮想マシンで構築したRook Cephについて、homelabでPVCを利用して試す分には性能として問題なさそうには見えています。