[CloudNet-Cilium-Study[1기]] 7주차

진웅·2025년 8월 30일

CILIUM

목록 보기
10/14

Kube-burner

Kube-burner는 Kubernetes 클러스터의 성능과 확장성을 테스트하기 위한 도구입니다. 대량의 리소스를 생성하여 클러스터의 한계를 테스트하고 성능 메트릭을 수집할 수 있습니다.

주요 기능

  • 부하 생성: Pod, Service, ConfigMap 등 다양한
  • Kubernetes 리소스 생성
  • 성능 측정: 클러스터 성능 메트릭 수집 및 분석
  • 확장성 테스트: 대규모 워크로드에 대한 클러스터 반응 측정
  • 자동화: CI/CD 파이프라인에 통합 가능

설치

(⎈|HomeLab:N/A) root@k8s-ctr:~/kube-burner# curl -LO https://github.com/kube-burner/kube-burner/releases/download/v1.17.3/kube-burner-V1.17.3-darwin-arm64.tar.gz # mac M
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 16.4M  100 16.4M    0     0  8620k      0  0:00:01  0:00:01 --:--:-- 31.1M
(⎈|HomeLab:N/A) root@k8s-ctr:~/kube-burner# 
(⎈|HomeLab:N/A) root@k8s-ctr:~/kube-burner# tar -xvf kube-burner-V1.17.3-darwin-arm64.tar.gz
LICENSE
kube-burner
(⎈|HomeLab:N/A) root@k8s-ctr:~/kube-burner# sudo cp kube-burner /usr/local/bin

go 깔려있어야 수행된다.

root@k8s-ctr:~/kube-burner# kube-burner version

Version: 1.17.3
Git Commit: 917540ff45a89386bb25de45af9b96c9fc360e93
Build Date: 2025-08-19T14:42:17Z
Go Version: go1.23.12
OS/Arch: linux arm64

1차 시나리오 실습

#
cat << EOF > s1-config.yaml
global:
  measurements:
    - name: none

jobs:
  - name: create-deployments
    jobType: create
    jobIterations: 1  # How many times to execute the job , 해당 job을 5번 반복 실행
    qps: 1            # Limit object creation queries per second , 	초당 최대 요청 수 (평균 속도 제한) - qps: 10이면 초당 10개 요청
    burst: 1          # Maximum burst for throttle , 순간적으로 처리 가능한 요청 최대치 (버퍼) - burst: 20이면 한순간에 최대 20개까지 처리 가능
    namespace: kube-burner-test
    namespaceLabels: {kube-burner-job: delete-me}
    waitWhenFinished: true # false
    verifyObjects: false
    preLoadImages: true # false
    preLoadPeriod: 30s # default 1m
    objects:
      - objectTemplate: s1-deployment.yaml
        replicas: 1
EOF

#
cat << EOF > s1-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-{{ .Iteration}}-{{.Replica}}
  labels:
    app: test-{{ .Iteration }}-{{.Replica}}
    kube-burner-job: delete-me
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-{{ .Iteration}}-{{.Replica}}
  template:
    metadata:
      labels:
        app: test-{{ .Iteration}}-{{.Replica}}
    spec:
      containers:
        - name: nginx
          image: nginx:alpine
          ports:
            - containerPort: 80
EOF


# 모니터링 : 터미널, kube-ops-view
watch -d kubectl get ns,pod -A


# 부하 발생 실행 Launch benchmark
kube-burner init -h
kube-burner init -c s1-config.yaml --log-level debug
...

#
kubectl get deploy -A -l kube-burner-job=delete-me
kubectl get pod -A -l kube-burner-job=delete-me
kubectl get ns -l kube-burner-job=delete-me

#
ls kube-burner-*.log
kube-burner-86508d5e-52dc-45de-88ab-d933f48ae0c8.log
cat kube-burner-*.log


# 삭제!
## deployment 는 s1-deployment.yaml 에 metadata.labels 에 추가한 labels 로 지정
## namespace 는 config.yaml 에 job.name 값을 labels 로 지정
cat << EOF > s1-config-delete.yaml
# global:
#   measurements:
#     - name: none

jobs:
  - name: delete-deployments-namespace
    qps: 500
    burst: 500
    namespace: kube-burner-test
    jobType: delete
    waitWhenFinished: true
    objects:
    - kind: Deployment
      labelSelector: {kube-burner-job: delete-me}
      apiVersion: apps/v1
    - kind: Namespace
      labelSelector: {kube-burner-job: delete-me}
EOF

#
kube-burner init -c s1-config-delete.yaml --log-level debug

설정 파일 (s1-config.yaml)

Global 설정
measurements: none - 성능 측정 비활성화
Job 설정
jobType: create - 리소스 생성 작업
jobIterations: 1 - Job을 1번만 실행
qps: 1 - 초당 1개 요청으로 제한 (매우 느림)
burst: 1 - 순간 최대 1개 요청만 허용
namespace: kube-burner-test - 대상 네임스페이스
namespaceLabels: {kube-burner-job: delete-me} - 네임스페이스에 삭제용 라벨 추가
waitWhenFinished: true - 작업 완료까지 대기
verifyObjects: false - 객체 검증 비활성화
preLoadImages: true - 이미지 미리 로드
preLoadPeriod: 30s - 이미지 로드 대기시간
replicas: 1 - 템플릿당 1개 생성
템플릿 (s1-deployment.yaml)

Deployment 리소스

이름: deployment-{{.Iteration}}-{{.Replica}}
라벨: app: test-{{.Iteration}}-{{.Replica}}
컨테이너: nginx:alpine 이미지
포트: 80번 오픈
레플리카: 1개

실행 결과 예상

생성되는 리소스

  • 네임스페이스: kube-burner-test (라벨: kube-burner-job=delete-me)
  • Deployment: deployment-0-0 (라벨: app=test-0-0)
  • Pod: deployment-0-0-xxx (nginx:alpine)
    실행 특징
    매우 느린 속도: qps=1, burst=1로 제한
    단순 테스트: 1개 Deployment만 생성
    안전한 설정: 검증 비활성화, 이미지 미리 로드
    정리 준비: 삭제용 라벨 설정
    사용 목적
    기본 테스트: kube-burner 동작 확인
    환경 검증: 클러스터 기본 기능 테스트
    학습용: 최소 설정으로 동작 원리 이해

root@k8s-ctr:~/kube-burner# kube-burner init -c s1-config.yaml --log-level debug

time="2025-08-31 08:59:26" level=info msg="🔥 Starting kube-burner (1.17.3@917540ff45a89386bb25de45af9b96c9fc360e93) with UUID 510c9899-42cb-48ca-a0b5-ac9da09ae127" file="job.go:91"
time="2025-08-31 08:59:26" level=warning msg="Measurement [none] is not supported" file="factory.go:101"
time="2025-08-31 08:59:26" level=debug msg="job.MaxWaitTimeout is zero in create-deployments, override by timeout: 4h0m0s" file="job.go:361"
time="2025-08-31 08:59:26" level=info msg="QPS: 1" file="job.go:371"
time="2025-08-31 08:59:26" level=info msg="Burst: 1" file="job.go:378"
time="2025-08-31 08:59:26" level=debug msg="Preparing create job: create-deployments" file="create.go:46"
time="2025-08-31 08:59:26" level=debug msg="Rendering template: s1-deployment.yaml" file="create.go:52"
time="2025-08-31 08:59:26" level=info msg="Job create-deployments: 1 iterations with 1 Deployment replicas" file="create.go:84"
time="2025-08-31 08:59:26" level=info msg="Pre-load: images from job create-deployments" file="pre_load.go:73"
time="2025-08-31 08:59:26" level=debug msg="Created namespace: preload-kube-burner" file="namespaces.go:55"
time="2025-08-31 08:59:26" level=info msg="Pre-load: Creating DaemonSet using images [nginx:alpine] in namespace preload-kube-burner" file="pre_load.go:195"
time="2025-08-31 08:59:26" level=info msg="Pre-load: Sleeping for 30s" file="pre_load.go:86"
time="2025-08-31 08:59:56" level=info msg="Deleting 1 namespaces with label: kube-burner-preload=true" file="namespaces.go:67"
time="2025-08-31 08:59:56" level=debug msg="Waiting for 1 namespaces labeled with kube-burner-preload=true to be deleted" file="namespaces.go:90"
time="2025-08-31 08:59:57" level=debug msg="Waiting for 1 namespaces labeled with kube-burner-preload=true to be deleted" file="namespaces.go:90"
time="2025-08-31 08:59:58" level=debug msg="Waiting for 1 namespaces labeled with kube-burner-preload=true to be deleted" file="namespaces.go:90"
time="2025-08-31 08:59:59" level=debug msg="Waiting for 1 namespaces labeled with kube-burner-preload=true to be deleted" file="namespaces.go:90"
time="2025-08-31 09:00:00" level=debug msg="Waiting for 1 namespaces labeled with kube-burner-preload=true to be deleted" file="namespaces.go:90"
time="2025-08-31 09:00:01" level=debug msg="Waiting for 1 namespaces labeled with kube-burner-preload=true to be deleted" file="namespaces.go:90"
time="2025-08-31 09:00:02" level=info msg="Triggering job: create-deployments" file="job.go:122"
time="2025-08-31 09:00:02" level=info msg="0/1 iterations completed" file="create.go:119"
time="2025-08-31 09:00:02" level=debug msg="Creating object replicas from iteration 0" file="create.go:122"
time="2025-08-31 09:00:03" level=debug msg="Created namespace: kube-burner-test-0" file="namespaces.go:55"
time="2025-08-31 09:00:03" level=debug msg="Created Deployment/deployment-0-1 in namespace kube-burner-test-0" file="create.go:288"
time="2025-08-31 09:00:03" level=info msg="Waiting up to 4h0m0s for actions to be completed" file="create.go:169"
time="2025-08-31 09:00:04" level=info msg="Actions in namespace kube-burner-test-0 completed" file="waiters.go:74"
time="2025-08-31 09:00:04" level=info msg="Job create-deployments took 2s" file="job.go:191"
time="2025-08-31 09:00:04" level=info msg="Finished execution with UUID: 510c9899-42cb-48ca-a0b5-ac9da09ae127" file="job.go:264"
time="2025-08-31 09:00:04" level=info msg="👋 Exiting kube-burner 510c9899-42cb-48ca-a0b5-ac9da09ae127" file="kube-burner.go:90"

k8s get 으로 상태 보면 남아있다.

root@k8s-ctr:~/kube-burner# kubens
cilium-secrets
default
kube-burner-test-0
kube-node-lease
kube-public
kube-system
local-path-storage

profile
bytebliss

0개의 댓글