k8s
Kubernetes, 자원할당과 스케일 조정 그리고 오토스케일링
089
2024. 1. 10. 16:53
리소스 할당(Resource Allocation) 을 사용하는 이유 ?
- 성능 보장 : 각 컨테이너에 적절한 CPU 및 메모리 리소스를 할당하여 안정적인 성능 유지 가능
- 효율적인 자원 활용 : 리소스 제한을 설정하여 무제한으로 활장하는 것을 방지하고, 효율적으로 자원 활용 가능
주의사항
- 과도한 리소스 할당 : 너무 큰 리소스를 할당하면 클러스터의 자원이 비효율적으로 사용될 수 있음
- 너무 작은 리소스 할당 : 너무 작은 리소스를 할당하면 애플리케이션이 예상치 못한 성능 저하를 겪을 수 있음
예시) 잘못된 리소스 할당
- 문제 : Pod에 대한 메모리 리소스를 지나치게 낮게 설정
- 결과 : 메모리 부족으로 인한 애플리케이션 성능 저하
컨테이너 리소스 설정
Kubernetes에서는 각 컨테이너에 대한 CPU 및 메모리 리소스를 설정할 수 있습니다.
이는 Pod 레벨에서 이루어지며, 리소스 요청(Request) 및 제한(Limit)을 설정할 수 있습니다.
resources:
requests:
memory: "512Mi"
cpu: "1000m"
limits:
memory: "1Gi"
cpu: "1500m"
스케일링(Scaling) 을 사용하는 이유 ?
- 트래픽 대응 : 수동 및 자동 스케일링을 통해 트래픽 증가에 대응하고, 트래픽이 감소하면 자원을 절약 할 수 있습니다.
주의사항
- 과도한 스케일링 : 필요 이상으로 많은 Pod 를 생성하면 자원이 낭비되고, 클러스터의 안정성이 감소 할 수 있음
- 느린 스케일링 : 트래픽이 증가할 때 빠르게 스케일링하지 않으면 성능 저하 및 서비스 장애가 발생할 수 있음
예시) 과도한 수동 스케일링
- 문제 : 갑작스런 트래픽 증가에 대응하기 위해 수동으로 대규모 스케일링
- 결과 : 자원 낭비 및 클러스터 안정성 감소
스케일링 설정
- 수동 스케일링
'kubectl scale' 명령어를 사용하여 Deployment,ReplicaSet, 또는 StatefulSet의 replica 수를 수동으로 조절할 수 있습니다.
kubectl scale deployment/my-deployment --replicas=3
- Horizontal Pod Autoscaler (HPA)
HPA를 사용하면 리소스 사용율을 기반으로 Pod의 개수를 동적으로 조절할 수 있습니다.
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50
오토스케일링(Autoscaling)을 사용하는 이유?
- 자원 효율성 : 클러스터에 필요한 만큼의 자원을 동적으로 할당하여 효율적으로 자원을 활용합니다.
주의사항
- 잘못된 메트릭 설정 : 오토스케일링에 사용되는 메트릭이나 조건이 부적절하면 오버스케일링 또는 언더스케일링이 발생할 수 있음
- 애플리케이션 특성 무시 : 모든 애플리케이션에 일괄적으로 적용하기보다는 애플리케이션의 특성에 맞게 설정해야 함
예시) 잘못된 오토스케일링 메트릭 설정
- 문제 : CPU 사용률을 지나치게 높은 값으로 설정
- 결과 : 과도한 오토스케일링으로 인한 비용 증가 및 자원 낭비
오토스케일링 설정
- Cluster Autoscaler : 클러스터 오토스케일링을 통해 노드의 개수를 동적으로 조절할 수 있음
노드에 부족한 자원이 있을 경우, 새로운 노드를 추가하고, 사용하지 않는 자원이 많을 경우 노드를 줄일 수 있음
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: factorial-hpa
namespace: factorial
spec:
scaleTargetRef:
apiVersion: app/v1
kind: Deployment
name: my-factorial-app
minReplicas: 2
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
behavior:
scaleUp:
stabilizationWindowSeconds: 30
scaleDown:
stabilizationWindowSeconds: 30
- Vertical Pod Autoscaler (VPA) : VPA는 각 Pod에 대한 리소스 요청과 제한을 자동으로 조절하여 최적의 성능을 유지하도록 도와줍니다.
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: my-deployment
updatePolicy:
updateMode: "Auto"
- Pod Disruption Budger (PDB) : PDB는 안정적인 서비스를 유지하기 위해 동시에 삭제될 수 있는 Pod의 수를 제한 할 수 있습니다.
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: my-pdb
spec:
maxUnavailable: 1
selector:
matchLabels:
app: my-app
이러한 기능들을 잘 숙지해서 Kubernetes클러스터의 리소스 관리와 스케일링을 효과적으로 프로젝트에 녹여내기 위해 기록해 둡니다.