Kube-burner
- 대규모 Kubernetes 리소스 작업
- Create, delete, read, patch 지원
- 대규모 배포/삭제 시뮬레이션
- Prometheus 메트릭 통합
- 테스트 중 Prometheus에서 메트릭 수집 및 인덱싱
- 성능 지표 자동 기록
- Measurements
- 다양한 성능 측정 (API latency, scheduling delay 등)
- 커스텀 메트릭 정의 가능
- Alerting
- 사전 정의된 SLA/SLI 위반 시 알람
- Prometheus 규칙 기반
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
tar -xvf kube-burner-V1.17.3-darwin-arm64.tar.gz
kube-burner version

디플로이먼트 pod 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-burner init -c s1-config.yaml --log-level debug
kube-burner 리소스 생성확인

생성한 리소스 삭제
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

옵션 의미
| preLoadImages | 이미지 사전 풀링 여부 | Pod Ready 속도 (네트워크/레지스트리 영향) |
| waitWhenFinished | Job 종료 후 kube-burner 동작 | CLI 종료 여부, 리소스 잔존 여부 |
| jobIterations | 템플릿 반복 횟수 | 생성 Deployment/Pod 수 변화 |
| objects.replicas | 리소스 scale-out 개수 | Pod 총 개수 (Iterations × Replicas) |
| qps | 초당 API 요청 속도 | API 서버 처리 latency, 자원 생성 속도 |
| burst | 순간 burst 요청 허용치 | 짧은 시간 집중 부하, etcd/API 안정성 |
노드 1개에 최대 Pod (150) 배포 시도
kube-burner config 변경
global:
measurements:
- name: none
jobs:
- name: create-deployments
jobType: create
jobIterations: 100 # How many times to execute the job , 해당 job을 5번 반복 실행
qps: 300 # Limit object creation queries per second , 초당 최대 요청 수 (평균 속도 제한) - qps: 10이면 초당 10개 요청
burst: 300 # 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
모든 Pod이 배포 되는지 확인

배포 안되는 이유 확인
kubectl describe node

노드의 default max pod =100개
kubelet 설정 조정으로 max pod을 150 개로 증설
# maxPods 항목 없으면 기본값 110개
kubectl get cm -n kube-system kubelet-config -o yaml
#
docker exec -it myk8s-control-plane bash
----------------------------------------
cat /var/lib/kubelet/config.yaml
apt update && apt install vim -y
vim /var/lib/kubelet/config.yaml
maxPods: 150
systemctl restart kubelet
systemctl status kubelet
kubelet/config.yaml 에 maxPod 추가

노드 설정 확인으로 maxPod 증설 확인

K8S Performance & Tuning
K8S 단일 클러스터 최대 수용 규모
- 노드(Node)
- 최대 5,000대 이하
- No more than 5,000 nodes
- 파드(Pod per Node)
- 노드당 최대 110개 파드 이하
- No more than 110 pods per node
- 총 파드 수(Total Pods)
- 클러스터 전체에서 최대 150,000개 이하
- No more than 150,000 total pods
- 총 컨테이너 수(Total Containers)
- 클러스터 전체에서 최대 300,000개 이하
- No more than 300,000 total containers
kube-burner 시나리오
api-intensive

cat << EOF > api-intensive-100.yml
jobs:
- name: api-intensive
jobIterations: 100
qps: 100
burst: 100
namespacedIterations: true
namespace: api-intensive
podWait: false
cleanup: true
waitWhenFinished: true
preLoadImages: false # true
objects:
- objectTemplate: templates/deployment.yaml
replicas: 1
- objectTemplate: templates/configmap.yaml
replicas: 1
- objectTemplate: templates/secret.yaml
replicas: 1
- objectTemplate: templates/service.yaml
replicas: 1
- name: api-intensive-patch
jobType: patch
jobIterations: 10
qps: 100
burst: 100
objects:
- kind: Deployment
objectTemplate: templates/deployment_patch_add_label.json
labelSelector: {kube-burner-job: api-intensive}
patchType: "application/json-patch+json"
apiVersion: apps/v1
- kind: Deployment
objectTemplate: templates/deployment_patch_add_pod_2.yaml
labelSelector: {kube-burner-job: api-intensive}
patchType: "application/apply-patch+yaml"
apiVersion: apps/v1
- kind: Deployment
objectTemplate: templates/deployment_patch_add_label.yaml
labelSelector: {kube-burner-job: api-intensive}
patchType: "application/strategic-merge-patch+json"
apiVersion: apps/v1
- name: api-intensive-remove
qps: 500
burst: 500
jobType: delete
waitForDeletion: true
objects:
- kind: Deployment
labelSelector: {kube-burner-job: api-intensive}
apiVersion: apps/v1
- name: ensure-pods-removal
qps: 100
burst: 100
jobType: delete
waitForDeletion: true
objects:
- kind: Pod
labelSelector: {kube-burner-job: api-intensive}
- name: remove-services
qps: 100
burst: 100
jobType: delete
waitForDeletion: true
objects:
- kind: Service
labelSelector: {kube-burner-job: api-intensive}
- name: remove-configmaps-secrets
qps: 100
burst: 100
jobType: delete
objects:
- kind: ConfigMap
labelSelector: {kube-burner-job: api-intensive}
- kind: Secret
labelSelector: {kube-burner-job: api-intensive}
- name: remove-namespace
qps: 100
burst: 100
jobType: delete
waitForDeletion: true
objects:
- kind: Namespace
labelSelector: {kube-burner-job: api-intensive}
EOF
kube-burner init -c api-intensive-100.yml --log-level debug
Cilium Performance
cilium cni 설치
cilium install --version 1.18.1 --set ipam.mode=kubernetes --set ipv4NativeRoutingCIDR=172.20.0.0/16 \
--set routingMode=native --set autoDirectNodeRoutes=true --set endpointRoutes.enabled=true --set directRoutingSkipUnreachable=true \
--set kubeProxyReplacement=true --set bpf.masquerade=true \
--set endpointHealthChecking.enabled=false --set healthChecking=false \
--set hubble.enabled=true --set hubble.relay.enabled=true --set hubble.ui.enabled=true \
--set hubble.ui.service.type=NodePort --set hubble.ui.service.nodePort=30003 \
--set prometheus.enabled=true --set operator.prometheus.enabled=true --set envoy.prometheus.enabled=true --set hubble.metrics.enableOpenMetrics=true \
--set hubble.metrics.enabled="{dns,drop,tcp,flow,port-distribution,icmp,httpV2:exemplars=true;labelsContext=source_ip\,source_namespace\,source_workload\,destination_ip\,destination_namespace\,destination_workload\,traffic_direction}" \
--set debug.enabled=true # --dry-run-helm-values
Kubernetes 환경에서 속도 측정 테스트
배포 및 확인
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: iperf3-server
spec:
selector:
matchLabels:
app: iperf3-server
replicas: 1
template:
metadata:
labels:
app: iperf3-server
spec:
containers:
- name: iperf3-server
image: networkstatic/iperf3
args: ["-s"]
ports:
- containerPort: 5201
---
apiVersion: v1
kind: Service
metadata:
name: iperf3-server
spec:
selector:
app: iperf3-server
ports:
- name: tcp-service
protocol: TCP
port: 5201
targetPort: 5201
- name: udp-service
protocol: UDP
port: 5201
targetPort: 5201
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: iperf3-client
spec:
selector:
matchLabels:
app: iperf3-client
replicas: 1
template:
metadata:
labels:
app: iperf3-client
spec:
containers:
- name: iperf3-client
image: networkstatic/iperf3
command: ["sleep"]
args: ["infinity"]
EOF
1. TCP 5201, 측정시간 5초
# 클라이언트 파드에서 아래 명령 실행
kubectl exec -it deploy/iperf3-client -- iperf3 -c iperf3-server -t 5
# 서버 파드 로그 확인 : 기본 5201 포트 Listen
kubectl logs -l app=iperf3-server -f

2. UDP 사용, 역방향 모드 ( -R )
# 클라이언트 파드에서 아래 명령 실행
kubectl exec -it deploy/iperf3-client -- iperf3 -c iperf3-server -u -b 20G
# 서버 파드 로그 확인 : 기본 5201 포트 Listen
kubectl logs -l app=iperf3-server -f

3. TCP, 쌍방향 모드 ( -R )
kubectl exec -it deploy/iperf3-client -- iperf3 -c iperf3-server -t 5 --bidir

4. TCP 다중 스트림 ( 30개 )
# 클라이언트 파드에서 아래 명령 실행
kubectl exec -it deploy/iperf3-client -- iperf3 -c iperf3-server -t 10 -P 2
# 서버 파드 로그 확인 : 기본 5201 포트 Listen
kubectl logs -l app=iperf3-server -f

Cilium Connectivity ( test, perf )
cilium connectivity test --debug

Kubernetes perf-tests
- Kubernetes 공식 부하·확장성 테스트 프레임워크
- 클러스터에 원하는 상태 집합(예: 1만 Pod, 2천 Service 등)을 정의하고 도달 속도(처리량) 측정
- Prometheus 기반 관측 및 다양한 성능 측정 기능 제공
- **단일 노드(kind)**부터 대규모 5,000 노드까지 테스트 가능
주요 측정 (Measurements)
- APIAvailabilityMeasurement → /readyz 기반 API 가용성 확인
- APIResponsiveness / APIResponsivenessPrometheus → API 호출 지연·백분위수, SLO 검증
- PodStartupLatency → Pod 시작 시간, SLO 확인
- EtcdMetrics → etcd 메트릭 및 DB 크기 수집
- SchedulingMetrics / SchedulingThroughput → 스케줄러 성능 및 처리량
- ResourceUsageSummary → CPU/메모리 사용량 요약 (90/99/100%)
- CPUProfile / MemoryProfile → pprof 기반 프로파일링
- PodPeriodicCommand → Pod 내부 명령 주기 실행·수집
- WaitForControlledPodsRunning / WaitForRunningPods → 지정 객체 Pod 실행 완료 대기
- WaitForGenericK8sObjects → 특정 객체 조건 만족 여부 대기
- Sleep / Timer → 인위적 대기 및 시간 측정