perf-tests로 쿠버네티스 성능 테스트해보기

이전에 kube-burner로 쿠버네티스 성능 테스트하는 방법을 작성해봤는데 이번에는 perf-tests로 쿠버네티스 테스트를 해보는 것을 진행해보겠습니다.

 

https://github.com/kubernetes/perf-tests

 

GitHub - kubernetes/perf-tests: Performance tests and benchmarks

Performance tests and benchmarks. Contribute to kubernetes/perf-tests development by creating an account on GitHub.

github.com

 

perf-tests는 쿠버네티스의 공식 성능테스트로 다양한 테스트 도구들을 가지고 있습니다. 

 

clusterloader2

kube-burner와 유사하게 테스트 설정할 템플릿을 하나 생성해 주어야합니다. 

cat <<EOF > config.yaml
name: test # 테스트 이름

namespace:
  number: 1 # 생성할 네임스페이스의 수 

tuningSets: # 액션이 실행되는 방식
- name: Uniform1qps  # 초당 1개의 요청 속도로 실행
  qpsLoad:
    qps: 1

steps:
# 테스트의 값을 측정
- name: Start measurements
  measurements:
  # 파드가 시작되기까지의 시작 지연(latency) 시간 측정
  - Identifier: PodStartupLatency
    Method: PodStartupLatency
    Params:
      action: start
      labelSelector: group = test-pod
      threshold: 20s
  # 모든 Pod가 Running 상태가 될 때까지의 시간 측정
  - Identifier: WaitForControlledPodsRunning
    Method: WaitForControlledPodsRunning
    Params:
      action: start
      apiVersion: apps/v1
      kind: Deployment
      labelSelector: group = test-deployment
      operationTimeout: 120s
# deployment 생성 (1개의 네임스페이스에서 10개의 파드)
- name: Create deployment
  phases:
  - namespaceRange:
      min: 1
      max: 1
    replicasPerNamespace: 1
    tuningSet: Uniform1qps
    objectBundle:
    - basename: test-deployment
      objectTemplatePath: "deployment.yaml"
      templateFillMap:
        Replicas: 10 # <-- 레플리카 10개 
# 파드가 Running이 될때까지 기다린 시간 모으기 (위에서 지정한 측정 완료시키기)
- name: Wait for pods to be running
  measurements:
  - Identifier: WaitForControlledPodsRunning
    Method: WaitForControlledPodsRunning
    Params:
      action: gather
# 파드가 시작되기까지 기다린 시간 모으기 (위에서 지정한 측정 완료시키기)
- name: Measure pod startup latency
  measurements:
  - Identifier: PodStartupLatency
    Method: PodStartupLatency
    Params:
      action: gather
EOF

 

그리고 kube-burner와 유사하게 여기서도 오브젝트 생성을 위한 템플릿도 필요합니다

cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{.Name}}
  labels:
    group: test-deployment
spec:
  replicas: {{.Replicas}}
  selector:
    matchLabels:
      group: test-pod
  template:
    metadata:
      labels:
        group: test-pod
    spec:
      containers:
      - image: registry.k8s.io/pause:3.9
        name: {{.Name}}
EOF

 

위의 파일을 생성한다음 다음과 같이 실행하면 테스트를 진행할 수 있습니다. 

 kind로 진행하는 경우 apt가 아닌 직접 go버전을 1.24.1 이상으로 설치해야합니다. 

# golang 설치 방법
wget https://go.dev/dl/go1.25.0.linux-arm64.tar.gz
rm -rf /usr/local/go && \
  tar -C /usr/local -xzf go1.25.0.linux-arm64.tar.gz && \
  rm go1.25.0.linux-arm64.tar.gz
export PATH=$PATH:/usr/local/go/bin

 

테스트를 실행할 때에는 kubeconfig 위치를 설정해주어야하는데 kind-control-plane 내부에서는 kubeconfig의 위치가 /etc/kubernetes/admin.conf로 설정되어있습니다. 

# fork/exec /tmp/go-build2371393815/b001/exe/clusterloader: permission denied 에러 발생 해결
mkdir ~/tmp
export TMPDIR=~/tmp/

# cd perf-tests/clusterloader2
go run cmd/clusterloader.go \
  --kubeconfig=/etc/kubernetes/admin.conf \
  --testconfig=config.yaml --provider=kind

 

 

테스트가 진행되는 동안 이렇게 로그가 나오게 됩니다. 

 

 

최종적으로 테스트 결과는 Junit Report로 나오게 됩니다.

파드가 러닝상태로 변경되기까지 14.02초가 걸렸으며 파드가 뜨는데 걸리는 시간은 0.013초로 나왔습니다. 

<?xml version="1.0" encoding="UTF-8"?>
  <testsuite name="ClusterLoaderV2" tests="0" failures="0" errors="0" time="30.293">
      <testcase name="test overall (config.yaml)" classname="ClusterLoaderV2" time="30.283160452"></testcase>
      <testcase name="test: [step: 01] Start measurements [00] - PodStartupLatency" classname="ClusterLoaderV2" time="0.109954463"></testcase>
      <testcase name="test: [step: 01] Start measurements [01] - WaitForControlledPodsRunning" classname="ClusterLoaderV2" time="0.210576726"></testcase>
      <testcase name="test: [step: 02] Create deployment" classname="ClusterLoaderV2" time="1.005080757"></testcase>
      <testcase name="test: [step: 03] Wait for pods to be running [00] - WaitForControlledPodsRunning" classname="ClusterLoaderV2" time="14.01648241"></testcase>
      <testcase name="test: [step: 04] Measure pod startup latency [00] - PodStartupLatency" classname="ClusterLoaderV2" time="0.012790753"></testcase>
  </testsuite>root@myk8s-control-plane:/perf-tests/clusterloader2#

 

이렇게 직접 실행하는 방법도 있지만 perf-tests/clusterloader2 폴더에는 테스트를 위한 스크립트가 준비되어있어 바로 스크립트를 통해 테스트를 진행해볼 수도 있습니다. 

 

 

이외에도 netperf나 perfdash같은 대시보드 ui도 존재하는데 이것은 나중에 이어서 정리해보겠습니다.