카테고리 없음

Cilium Study - 7 ( Cilium Performance )

바코더 2025. 8. 30. 06:47

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 → 인위적 대기 및 시간 측정