본문 바로가기

About/Kubernetes

[k8s] 파드를 수평으로 Scale Out 하기(HorizontalPodAutoscaler, HPA)

HorizontalPodAutoscaler(HPA)

쿠버네티스에서는 CPU 사용량 이나 기타 메트릭을 체크하여 파드의 개수를 스케일하는 기능을 가지고 있습니다.

HorizontalPodAutoscaler

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.01done
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을 좀 더 안정적으로 운영할 수 있도록 해주는 컨트롤러입니다. 애플리케이션 서비스 시 유용하게 사용할 수 있을 것 같습니다.

참고