Kubestr — Kube Storage IOPS 측정 툴
kube 환경에서 사용할 수 있는 FIO Tool 기반 Storage IOPS 성능 측정 툴 kubestr 소개해 드립니다. public 클라우드 환경이라면 (저는 사용하지 않아서 잘 모르지만 ^^) 스토리지 옵션에서 IOPS 정보를 제공하는데, 검증 용도로 사용 가능 할 것 같습니다. 저는 on-prem 환경에서 3rd party 외장 스토리지 대비 local disk IOPS 비교 용도로 사용 하였습니다.
kubestr를 사용하지 않고 Storage Class 간 IOPS 성능 테스트를 진행한다고 하면 기본 CentOS 등 base OS image에 FIO 설치하고, FIO 스크립트, PVC 생성 등의 작업이 필요합니다. 이에 반하여 kubestr를 사용하면 dynamic하게, 즉 kubestr 실행하면 이미 FIO가 설치된 POD가 실행되고, FIO 스크립트는 ConfigMap 으로 마운트되고 PVC도 선택한 Storage Class 기반으로 자동 생성합니다. 작업이 완료되면 자동 삭제까지 되므로 FIO 스크립트의 여러 옵션을 변경하여 테스트 하는 반복 작업 시 유용하였습니다.
그럼 FIO, IOPS 테스트 결과부터 간단히 공유 드리면
- Remote NAS HDD vs Local NVMe Disk
: 27K vs 575K (rand read 100%, 단일 POD 기준)
: NVMe disk & Remote NAS 1G(서버 NAS 네트워크 포트) 환경이라 당연히 차이가 많이 납니다. BMT 등이 아니었기에 단순 참고 용도로만 적합합니다.
: 상세 fio script 및 결과 아래 참조
당연히 Local NVMe Disk 환경이 압도적으로 높았습니다. 아마도 Local disk(nvme or ssd)를 사용하시는 환경이면 비슷하게 잘 나올 것 같습니다.
Kubestr 참조
Kubestr is an open source collection of tools that makes it fast and easy to identify, validate and evaluate your Kubernetes storage options.
Kubestr 설치는 tar 파일 풀어주는 것으로 간단히 가능합니다.
파일 : https://github.com/kastenhq/kubestr/releases/tag/v0.4.16
[spkr@erdia22 Downloads (hci1-cloud1-dz:argocd)]$ tar xvfz kubestr-v0.4.13-linux-amd64.tar.gz
LICENSE
README.md
kubestr[spkr@erdia22 Downloads (hci1-cloud1-dz:argocd)]$ sudo mv kubestr /usr/local/bin/
[spkr@erdia22 Downloads (hci1-cloud1-dz:argocd)]$ sudo chmod +x /usr/local/bin/kubestr
FIO 성능 테스트를 위해서 먼저 FIO 스크립트를 각 환경에 맞게 작성해 줍니다. FIO 스크립트 만드는 것도 경험이 필요한데, 다행히 많이 사용하는 FIO 스크립트를 모아 놓은 github를 같이 제공해 줍니다.
다양한 FIO 예제 :
저는 bare-metal 환경에 맞게 numjobs, iodepth를 수정 하였습니다.
그럼, 성능 테스트를 실행합니다. 먼저 Local NVMe Disk 입니다.
Storage Class - high
: Local NVMe Disk[spkr@erdia22 11.fio-examples (dz-saas:default)]$ kubestr fio -f fio-rand-read-Diamanti.fio -s high
PVC created kubestr-fio-pvc-x6q76
Pod created kubestr-fio-pod-lnxz4
Running FIO test (fio-rand-read-Diamanti.fio) on StorageClass (high) with a PVC of Size (100Gi)
Elapsed time- 2m5.5459797s
FIO test results:FIO version - fio-3.20
Global options - ioengine= verify= direct=1 gtod_reduce=JobName:
blocksize= filesize=1G iodepth=64 rw=
read:
IOPS=575285.562500 BW(KiB/s)=2301142
iops: min=422087 max=897495 avg=575298.437500
bw(KiB/s): min=1688352 max=3590009 avg=2301199.500000Disk stats (read/write):
nvme5n1: ios=69006229/8 merge=0/10 ticks=8666783/0 in_queue=9915781, util=100.000000%
- OK
다음으로 원격 NAS 스토리지 입니다.
Storage Class - nfs-loki
: 원격 NAS 스토리지[spkr@erdia22 11.fio-examples (dz-saas:default)]$ kubestr fio -f fio-rand-read-Diamanti.fio -s nfs-loki
PVC created kubestr-fio-pvc-qq2sx
Pod created kubestr-fio-pod-flz9c
Running FIO test (fio-rand-read-Diamanti.fio) on StorageClass (nfs-loki) with a PVC of Size (100Gi)
Elapsed time- 2m13.1247259s
FIO test results:FIO version - fio-3.20
Global options - ioengine= verify= direct=1 gtod_reduce=JobName:
blocksize= filesize=1G iodepth=64 rw=
read:
IOPS=27552.804688 BW(KiB/s)=110211
iops: min=16730 max=28408 avg=27590.234375
bw(KiB/s): min=66920 max=113632 avg=110361.968750Disk stats (read/write):
- OK
위와 같이 비교하고자 하는 스토리지 클래스 이름만 변경하면서 편리하게 반복 작업 수행 가능합니다. 작업 실행 중에 아래와 같이 pod, pvc, configmap 생성되는 걸 확인 가능합니다.
[spkr@erdia22 ~ (dz-saas:default)]$ kgp
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kubestr-fio-pod-flz9c 1/1 Running 0 88s 10.60.20.26 hci1-dzn2 <none> <none>[spkr@erdia22 ~ (dz-saas:default)]$ k get pvc
NAME STATUS VOLUME
CAPACITY ACCESS MODES STORAGECLASS AGE
kubestr-fio-pvc-sbkl9 Bound pvc-f953a959-4317-4c99-99da-17bd7b31845d 100Gi RWO nfs-loki 10m[spkr@erdia22 ~ (dz-saas:default)]$ k get cm
NAME DATA AGE
kubestr-fio2zmc2 1 58s
작업이 완료되면 위 object는 자동 삭제 됩니다. kube 환경에서 스토리지 IOPS 테스트 하시는 데 도움이 되셨으면 합니다.
Diamanti 및 Managed Kubernetes Service 관련 문의 : leejunghoon@spkr.co.kr