
쿠버네티스의 Autoscaler는 HPA, VPA, CA 세 가지가 있다.
Pod의 개수를 늘린다.
사전에 HPA를 만들고 Controller와 연결을 해 놓는다면, HPA가 Pod의 리소스 상태를 감지하고 있다가 Pod의 Memory 또는 CPU가 위험한 상태일 때 Controller의 replicas를 변경한다. (1 -> 2)
기동이 빠르게 되는 App에 사용한다. 장애 복구를 위한 기능이기 때문에 복구를 할 때에도 빨라야 하기 때문이다.
Stateless App일 때 사용한다. Stateful App의 경우 HPA는 어떤 파드를 Scale Out 해야 하는지 모르기 때문이다.
Pod의 리소스를 증가시킨다.
사전에 VPA를 만들어 Controller와 연결해 놓는다면, VPA가 Pod의 리소스 상태를 감지하고 있다가 Pod의 Memory 또는 CPU가 위험한 상태일 때 Pod를 restart 시키면서 리소스를 증가시킨다.
즉, Scale Up 시켜준다. Scale Up : 리소스의 양이 수직적으로 증가하는 것 <-> Scale Down
Stateful App일 때 사용한다.
한 Controller에 HPA와 함께 사용할 수 없다. 둘 다 달면 아예 기능이 작동하지 않는다.
클러스터에 노드를 추가한다.
모든 worker node의 리소스가 모두 소모되었을 경우, Scheduler는 어느 노드에도 Pod를 배치할 수 없다는 것을 확인하고 CA에게 worker node를 생성해달라고 요청한다.
사전에 CA를 특정 Cloud Provider와 연결해 놓았다면 (AWS, Azure, GCP) 이렇게 요청이 들어왔을 때 해당 Provider에 노드를 하나 만들어주고 Scheduler는 이 노드에 Pod를 배치시킨다.
이렇게 사용하다가 로컬 노드에 자원이 남게 되면 Scheduler가 CA에게 노드를 삭제하도록 요청한다.
Cloud Provider에 있는 노드에 삭제되고, 그 안에 있던 Pod는 로컬 노드로 옮겨진다.
HPA는 Metrics Data를 받아와 그 정보를 바탕으로 작동하기 때문에 먼저 Metrics Server의 설치가 필요하다.
$ git clone https://github.com/kubernetes-sigs/metrics-server.git
$ cd metrics-server
$ kubectl apply -f deploy/kubernetes/
Metrics Server 내부에서 노드를 찾을 수 있도록 Metrics Deployment를 수정해준다.
$ kubectl edit deployment metrics-server -n kube-system
----------------------
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
# 추가
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP
설치 되었는지 확인
$ kubectl get apiservices |egrep metrics
메트릭 값 확인
$ kubectl top node
target 컨트롤러 지정
증감되는 Replicas의 max 값, min 값 설정
메트릭 정보의 어떤 조건을 통해서 replicas를 증가시킬지 metrics type 지정
name : cpu / memory
어떤 조건으로 증가시킬지?
가장 기본적인 옵션 : Utilization
averageUtilization: 50 -> Pod의 requests가 50%를 넘으면 replicas를 증가시켜준다.
spec:
maxReplicas: 10
minReplicas: 2
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: deployment-cpu1
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50