이번장 한줄 요약
Autoscaling을 이용해 Pod나 Node를 Metric을 기반으로 자동으로 Scale-out / in 하는 방법
목차는
1. Autoscaling은 누가 수행하고 일어나는 과정은 어떤가?
2. CPU 사용량을 기준으로 Autoscaling 하기
3. Custom metrics를 기준으로 Autoscaling 하기
4. Cluster nodes를 auto scaling하기
들어가기 전에 알아야 할 개념
1) 누가 Autoscaling을 하는가?
2) Auto scaling은 어떻게 이뤄지는가?
1. Controller가 주기적으로 Metric을 확인한다.
2. HPA Resource에 설정된 Target Value 값을 만족하는 replica수를 계산한다.
note) cAdvisor
cAdvisor (Container Advisor) provides container users an understanding of the resource usage and performance characteristics of their running containers. It is a running daemon that collects aggregates processes and exports information about running containers.
3. deployment, replicaset 등 replicas 필드 값을 갱신한다.
Scale
이라는 sub-resource를 통해 간접적으로 조정한다. note) Scale 이라는 virtual resource의 정체
curl http://localhost:8080/apis/apps/v1/namespaces/default/deployments
/kubia/scale
{
"kind": "Scale",
"apiVersion": "autoscaling/v1",
"metadata": {
"name": "kubia",
"namespace": "default",
"uid": "4ac36acf-33c5-49d2-90fa-66c25eb6f44b",
"resourceVersion": "34597",
"creationTimestamp": "2021-07-27T12:59:19Z"
},
"spec": {
"replicas": 3
},
"status": {
"replicas": 3,
"selector": "app=kubia"
}
}%
deployement 리소스에 scale sub-resource를 패치하는 REST request
curl -X PATCH -H 'Content-Type: application/strategic-merge-patch+json'
--data '
{
"spec":
{
"replicas":1
}
}' 'http://localhost:8080/apis/apps/v1/namespaces
/default/deployments/kubia/scale'
{
"kind": "Scale",
"apiVersion": "autoscaling/v1",
"metadata": {
"name": "kubia",
"namespace": "default",
"uid": "4ac36acf-33c5-49d2-90fa-66c25eb6f44b",
"resourceVersion": "35485",
"creationTimestamp": "2021-07-27T12:59:19Z"
},
"spec": {
"replicas": 1
},
"status": {
"replicas": 3,
"selector": "app=kubia"
}
}
deployment가 scale 됨
# kubectl get deployment kubia
NAME READY UP-TO-DATE AVAILABLE AGE
kubia 1/1 1 1 22m
1. metrics-server를 설치한다.
https://github.com/kubernetes-sigs/metrics-server#installation
2. Deployment를 생성하거나, 타 리소스를 생성할 때 request를 적어준다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: kubia
spec:
replicas: 3
selector:
matchLabels:
app: kubia
template:
metadata:
name: kubia
labels:
app: kubia
spec:
containers:
- image: luksa/kubia:v1
name: nodejs
resources:
requests: #### 여기처럼 requests를 입력해줘야함
cpu: 100m
3. HPA를 생성한다.
# kubectl autoscale deployment kubia --cpu-percent=30 --min=1 --max=5
** note) Memory consumption에 기반한 Scaling
HPA를 생성할 때
...
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: <deployment name>
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource # metric
resource:
name: cpu #
target: #
type: Utilization
averageUtilization: 50
metrics 필드에다가 사용할 하나 이상의 metric type을 정의하면 된다.
사용할 수 있는 metric 유형은 다음과 같이 정해져 있다.
type: Pods
pods:
metric:
name: packets-per-second
target:
type: AverageValue
averageValue: 1k
type: Object
object:
metric:
name: requests-per-second
describedObject:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
name: main-route
target:
type: Value
value: 10k
note) Replica를 0으로 감소
HPA는 아무리 metric이 작은 숫자더라도 minReplicas(최소 replica) 를 0으로 조절하지는 않는다.
Cluster Autoscaler는 node에 resource가 부족해서 scheduling 할 수 없는 pod를 발견하면, node를 추가공급한다.
Node 의 Resource가 부족해 cluster auto scale이 시작되면
1. cluster autoscaler는 사용 가능한 Node group을 확인한다.
2. 최소한 하나의 node 유형이라도 pod를 수용할 수 있는지 확인한다.
3. Node를 추가한다.
특정 node에서 실행 중인 모든 pod의 resource가 50% 미만이면 해당 노드를 불필요한 node라고 간주한다.
Node를 종료할 수 없는 경우는?
Node를 종료하는 경우는?
다음과 같은 providers에서 cluster autoscaler를 활성화 할 수 있다
처음 공부하던 때와 달리, VPA 가 개발되었다.
VPA 한줄 요약 : 사용자가 pod의 request를 수동으로 입력하지 않아도 사용량에 근거해서 적합한 auto scaling을 하도록 알아서 조정함 오오..
End of docs