[k8s] 파드를 수평으로 Scale Out 하기(HorizontalPodAutoscaler, HPA)
HorizontalPodAutoscaler(HPA)
쿠버네티스에서는 CPU 사용량 이나 기타 메트릭을 체크하여 파드의 개수를 스케일하는 기능을 가지고 있습니다.
Horizontal Pod Autoscaler로 지정한 메트릭을 컨트롤러가 체크하여 부하에 따라 필요한 파드의 레플리카수가 되도록 자동으로 파드를 늘리거나 줄입니다. Horizontal Pod Autoscaler는 쿠버네티스 API 리소스 및 컨트롤러로 구현됩니다. 리소스는 컨트롤러의 동작을 결정한다. 컨트롤러는 평균 CPU 사용률, 평균 메모리 사용률 또는 다른 커스텀 메트릭과 같은 관찰 대상 메트릭이 사용자가 지정한 목표값과 일치하도록 레플리케이션 컨트롤러 또는 디플로이먼트에서 레플리카 개수를 주기적으로 조정합니다.
HPA(Horizontal Pod Autoscaler)는 레플리카셋 뿐만 아니라 다음 리소스의 파드 스케일링에도 사용할 수 있습니다.
- Deployment
- ReplicaSet
- Replication Controller
- StatefulSet
DaemonSet에는 적용되지 않습니다.
HPA는 Metrics Server를 사용하여 리소스의 사용 상황을 수집하며, 부하를 감시하여 설정해놓은 정책에 따라 파드의 개수를 조정합니다.
HPA를 이용한 Scale Out/Scale In 실습
Metric Server 다운 및 설치
Node, Pod 등의 리소스 사용 상황을 확인하기 위해서는 Metric Server를 설치해야합니다. kubernetes 1.22 버전을 기준으로 다음과 같이 설치합니다.
1
|
$ kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.5.0/components.yaml
|
cs |
그리고 Metrics Deployment의 spec을 열어 다음과 같이 추가합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
$ kubectl edit deployment metrics-server -n kube-system
spec:
...
template:
..
spec:
containers:
- args:
- args:
- --cert-dir=/tmp
- --secure-port=443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls <- 내용 추가
|
cs |
모두 완료하였다면 Metric Server가 정상적으로 설치되었는지 확인합니다. (False로 나온다면 1~2분 후에 다시 시도)
1
2
3
|
$ kubectl get apiservices | grep metrics
v1beta1.metrics.k8s.io kube-system/metrics-server True 14d
|
cs |
다음 명령어로 Metric 값도 확인할 수 있습니다. 노드별로 CPU, Memory 사용량을 확인할 수 있습니다.
1
2
3
4
5
6
|
$ kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master 201m 5% 1495Mi 54%
k8s-node1 94m 2% 926Mi 33%
k8s-node2 82m 2% 723Mi 26%
|
cs |
Target Deployment / Service 생성
HPA를 적용할 Deployment와 Service를 다음과 같은 내용으로 생성합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: stateless-cpu1
spec:
selector:
matchLabels:
resource: cpu
replicas: 2
template:
metadata:
labels:
resource: cpu
spec:
containers:
- name: container
image: kubetm/app:v1
resources:
requests:
cpu: 10m
limits:
cpu: 20m
---
# Service
apiVersion: v1
kind: Service
metadata:
name: stateless-svc1
spec:
selector:
resource: cpu
ports:
- port: 8080
targetPort: 8080
nodePort: 30001
type: NodePort
|
cs |
Deployment는 두 개의 컨테이너를 가집니다. 이 때 이 컨테이너들의 사용가능한 cpu 리소스양은 10MB~20MB입니다.
Service는 Nodeport로 30001번 포트가 컨테이너의 8080번 포트와 연결되어 있습니다.
HorizontalPodAutoscaler 생성
이제 부하에 따라 자동으로 스케일이 되도록 하는 HPA를 작성합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-resource-cpu
spec:
maxReplicas: 10 # 최대 레플리카 수
minReplicas: 2 # 최소 레플리카 수
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: stateless-cpu1
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 # 평균 CPU 사용량이 50% 이상인 경우 Scale Out 이하인 경우 Scale In
|
cs |
6~18 번 라인에서 HPA의 spec을 설정합니다. 스케일 아웃하는 조건, 스케일의 최대, 최소값, 자동 스케일의 대상을 정의합니다.
필드 | 데이터형 | 설명 |
maxReplicas | 정수 | 스케일 아웃할 파드의 최대 개수. minReplicas 보다 작은 값을 설정할 수 없다. |
minReplicas | 정수 | 스케일 아웃할 파드의 최소 개수. 기본 값은 1 |
scaleTargeRef | CrossVersionObjectReference | 자동 스케일 대상 리소스 설정 |
metrics | MetricSpec | 자동 스케일을 하기 위한 메트릭 설정 |
위의 매니페스트 파일을 적용하면 노드 전체의 CPU 이용률이 50% 이상인 경우 Scale Out, 50% 이하인 경우 Scale In 하게 됩니다.
위의 매니페스트 파일을 적용한 후 다음 명령어를 입력하여 같이 HPA를 관찰합니다. -w 옵션을 주었기 때문에 변화가 생기는 경우 바로 터미널에 바로 출력합니다.
1
2
3
|
$ kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-resource-cpu Deployment/stateless-cpu1 5%/50% 2 10 2 2m25s
|
cs |
그리고 터미널을 하나 더 열어서 해당 Deployment에 curl 명령어를 보내서 리소스에 부하를 줍니다. (0.01초에 한번 curl 명령어를 보냅니다.)
1
|
while true;do curl 192.168.56.30:30001/hostname; sleep 0.01; done
|
cs |
그리고 나서 hpa를 관찰하고 있는 터미널을 살펴보면 다음과 같이 CPU의 사용량이 높아져 Replicas를 높인 것을 확인할 수 있습니다.
1
2
3
4
5
6
7
8
9
|
$ kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpa-resource-cpu Deployment/stateless-cpu1 0%/50% 2 10 2 5m15s
hpa-resource-cpu Deployment/stateless-cpu1 100%/50% 2 10 2 5m30s
hpa-resource-cpu Deployment/stateless-cpu1 165%/50% 2 10 4 5m45s
hpa-resource-cpu Deployment/stateless-cpu1 110%/50% 2 10 7 6m
hpa-resource-cpu Deployment/stateless-cpu1 70%/50% 2 10 7 6m15s
hpa-resource-cpu Deployment/stateless-cpu1 77%/50% 2 10 7 6m30s
hpa-resource-cpu Deployment/stateless-cpu1 68%/50% 2 10 10 6m45s
|
cs |
기존 2개에서 4개.. 7개... 그리고 최대 개수인 10개까지 파드가 늘어난 것을 확인할 수 있습니다. (REPLICAS 필드 확인) 파드를 Scale Out한 것입니다.
이제 curl 명령어의 전송을 중단하고 약 5분 정도가 지나면 Scale In 되는 것을 확인할 수 있습니다. (HPA는 Scale Out한 파드가 삭제조건이 되어도 바로 삭제하지 않습니다.
1
2
3
4
5
6
7
|
hpa-resource-cpu Deployment/stateless-cpu1 2%/50% 2 10 10 11m
hpa-resource-cpu Deployment/stateless-cpu1 4%/50% 2 10 7 12m
hpa-resource-cpu Deployment/stateless-cpu1 6%/50% 2 10 5 12m
hpa-resource-cpu Deployment/stateless-cpu1 10%/50% 2 10 3 12m
hpa-resource-cpu Deployment/stateless-cpu1 5%/50% 2 10 2 12m
hpa-resource-cpu Deployment/stateless-cpu1 10%/50% 2 10 2 13m
hpa-resource-cpu Deployment/stateless-cpu1 5%/50% 2 10 2 13m
|
cs |
CPU 사용량이 줄어들어 10->7->5->3->2개로 파드 개수를 줄인 것을 확인할 수 있습니다.
쿠버네티스에서 HorizontalPodAutoscaler(HPA)의 개념을 알아보고 실습을 이용하여 파드를 수평으로 Scale Out 해보았습니다.
HPA는 기동이 빠르게 되는 App 그리고 Stateless App을 좀 더 안정적으로 운영할 수 있도록 해주는 컨트롤러입니다. 애플리케이션 서비스 시 유용하게 사용할 수 있을 것 같습니다.
참고