# AUTOSCALING-GUIDE ## 로컬 환경에서 오토스케일링 테스트 ### 현재 환경 - Docker Desktop K8s: 4개 노드 (1 control-plane, 3 workers) - HPA 설정: CPU 70%, Memory 80% 기준 - Pod 확장: 2-10 replicas ### Cluster Autoscaler 대안 #### 1. **HPA (Horizontal Pod Autoscaler)** ✅ 현재 사용중 ```bash # HPA 상태 확인 kubectl -n site11-pipeline get hpa # 메트릭 서버 설치 (필요시) kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml # 부하 테스트 kubectl apply -f load-test.yaml # 스케일링 관찰 kubectl -n site11-pipeline get hpa -w kubectl -n site11-pipeline get pods -w ``` #### 2. **VPA (Vertical Pod Autoscaler)** Pod의 리소스 요청을 자동 조정 ```bash # VPA 설치 git clone https://github.com/kubernetes/autoscaler.git cd autoscaler/vertical-pod-autoscaler ./hack/vpa-up.sh ``` #### 3. **Kind 다중 노드 시뮬레이션** ```bash # 다중 노드 클러스터 생성 kind create cluster --config kind-multi-node.yaml # 노드 추가 (수동) docker run -d --name site11-worker4 \ --network kind \ kindest/node:v1.27.3 # 노드 제거 kubectl drain site11-worker4 --ignore-daemonsets kubectl delete node site11-worker4 ``` ### 프로덕션 환경 (AWS EKS) #### Cluster Autoscaler 설정 ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: cluster-autoscaler namespace: kube-system spec: template: spec: containers: - image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.27.0 name: cluster-autoscaler command: - ./cluster-autoscaler - --v=4 - --stderrthreshold=info - --cloud-provider=aws - --skip-nodes-with-local-storage=false - --expander=least-waste - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/site11-cluster ``` #### Karpenter (더 빠른 대안) ```yaml apiVersion: karpenter.sh/v1alpha5 kind: Provisioner metadata: name: default spec: requirements: - key: karpenter.sh/capacity-type operator: In values: ["spot", "on-demand"] - key: node.kubernetes.io/instance-type operator: In values: ["t3.medium", "t3.large", "t3.xlarge"] limits: resources: cpu: 1000 memory: 1000Gi ttlSecondsAfterEmpty: 30 ``` ### 부하 테스트 시나리오 #### 1. CPU 부하 생성 ```bash kubectl run -n site11-pipeline stress-cpu \ --image=progrium/stress \ --restart=Never \ -- --cpu 2 --timeout 60s ``` #### 2. 메모리 부하 생성 ```bash kubectl run -n site11-pipeline stress-memory \ --image=progrium/stress \ --restart=Never \ -- --vm 2 --vm-bytes 256M --timeout 60s ``` #### 3. HTTP 부하 생성 ```bash # Apache Bench 사용 kubectl run -n site11-pipeline ab-test \ --image=httpd \ --restart=Never \ -- ab -n 10000 -c 100 http://console-backend:8000/ ``` ### 모니터링 #### 실시간 모니터링 ```bash # Pod 자동 스케일링 관찰 watch -n 1 'kubectl -n site11-pipeline get pods | grep Running | wc -l' # 리소스 사용량 kubectl top nodes kubectl -n site11-pipeline top pods # HPA 상태 kubectl -n site11-pipeline describe hpa ``` #### Grafana/Prometheus (선택사항) ```bash # Prometheus Stack 설치 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install monitoring prometheus-community/kube-prometheus-stack ``` ### 로컬 테스트 권장사항 1. **현재 Docker Desktop에서 가능한 것:** - HPA 기반 Pod 자동 스케일링 ✅ - 부하 테스트를 통한 스케일링 검증 ✅ - 4개 노드에 Pod 분산 배치 ✅ 2. **제한사항:** - 실제 노드 자동 추가/제거 ❌ - Spot Instance 시뮬레이션 ❌ - 실제 비용 최적화 테스트 ❌ 3. **대안:** - Minikube: `minikube node add` 명령으로 노드 추가 가능 - Kind: 수동으로 노드 컨테이너 추가 가능 - K3s: 가벼운 멀티노드 클러스터 구성 가능 ### 실습 예제 ```bash # 1. 현재 상태 확인 kubectl -n site11-pipeline get hpa kubectl -n site11-pipeline get pods | wc -l # 2. 부하 생성 kubectl apply -f load-test.yaml # 3. 스케일링 관찰 (별도 터미널) kubectl -n site11-pipeline get hpa -w # 4. Pod 증가 확인 kubectl -n site11-pipeline get pods -w # 5. 부하 중지 kubectl -n site11-pipeline delete pod load-generator # 6. 스케일 다운 관찰 (5분 후) kubectl -n site11-pipeline get pods ```