티스토리 뷰
본 포스팅은 Kubernetes Horizontal Pod Autoscaler 사용 가이드입니다.
Kubernetes & Docker Install 과정을 살펴보며, 추후 CICD 구축에 활용될 수 있도록 하는데 목적이 있습니다.
HPA는 지정된 CPU 사용률을 기반으로 Replication Controller, Deployment 또는 Replica Set의 Pod 수를 자동으로 조정합니다.
Kubernetes는 CPU 자원에 대한 사용량을 다음과 같은 식으로 계산하여 Pod를 자동 Scale-out 할 수 있습니다.
TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)
주기적으로 Pod의 자원 사용을 체크하고, 특정 시간의 여유를 두고 downscale/upscale이 이루어지는데, 이는 kube-controller-manager가 담당합니다. 아래와 같은 설정은 HPA 개별적으로 적용할 수 있는 부분은 아니고 kube-controller-manager에 적용이 된다면 클러스터 환경에 전체적으로 적용이 됩니다.
kube-controller-manager는 Kubernetes 내 daemon 중 하나이고, default로 설정된 사항은 다음과 같습니다.
– horizontal-pod-autoscaler-downscale-delay : 마지막 다운스케일 후 n시간 경과 후 다음 다운스케일 가능 (디폴트 5분)
– horizontal-pod-autoscaler-upscale-delay : 마지막 업스케일 후 m시간 경과 후 다음 업스케일 가능 (디폴트 3분)
– horizontal-pod-autoscaler-sync-period : 필요한 Pod 수 계산을 위한 시간 간격 설정 가능 (디폴트 30초)
지금부터는 Horizontal Pod Autoscaler 적용방법에 대해 알아보겠습니다.
1. Resources Requests 설정 및 애플리케이션 배포
부하 발생에 따른 필요한 Pod의 수를 계산하기 위해 기준이 되는 Resources Requests 사용량을 설정해야 합니다.
최대 자원 사용량도 Deployment yaml에 작성할 수 있습니다.
- gs-spring-boot-docker-deployment.yaml
apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
name: gs-spring-boot-docker-deployment
labels:
app: gs-spring-boot-docker
spec:
replicas: 1
minReadySeconds: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
selector:
matchLabels:
app: gs-spring-boot-docker
template:
metadata:
labels:
app: gs-spring-boot-docker
spec:
containers:
- name: gs-spring-boot-docker
image: nara0617/gs-spring-boot-docker:1.0
imagePullPolicy: Always
ports:
- containerPort: 8080
resources:
requests:
memory: "256Mi"
cpu: "200m"
limits:
memory: "1Gi"
cpu: "500m"
- gs-spring-boot-docker-service.yaml
apiVersion: v1
kind: Service
metadata:
name: gs-spring-boot-docker-service
spec:
ports:
- name: http
port: 8081
targetPort: 8080
selector:
app: gs-spring-boot-docker
type: NodePort
2. yaml 파일 반영
- 작성한 yaml 파일은 CLI (kubectl apply) 또는 대시보드에서 반영이 가능합니다.
[root@k8s-master HPA]# kubectl apply -f ./gs-spring-boot-docker-deployment.yaml
deployment.apps/gs-spring-boot-docker-deployment created
[root@k8s-master HPA]# kubectl apply -f ./gs-spring-boot-docker-service.yaml
service/gs-spring-boot-docker-service unchanged
[root@k8s-master HPA]#
3. 확인
- 정상적으로 추가되었는 지 CLI 또는 대시보드에서 확인합니다.
[root@k8s-master HPA]# kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
gs-spring-boot-docker-deployment 1 1 1 1 96s
[root@k8s-master HPA]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gs-spring-boot-docker-service NodePort 10.106.48.153 <none> 8081:30490/TCP 28h
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d21h
[root@k8s-master HPA]#
다음으로 HPA를 생성해 보도록 하겠습니다.
1. yaml 파일 작성
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: gs-spring-boot-docker-hpa
spec:
maxReplicas: 10
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1beta2
kind: Deployment
name: gs-spring-boot-docker-deployment
targetCPUUtilizationPercentage: 50
주요 설정을 살펴보겠습니다.
- kind : 어떤 Object를 생성할 것인지에 대한 내용입니다. HorizontalPodAutoscaler를 지정하여 생성합니다.
- maxReplicas, minReplicas : 업스케일, 다운스케일 시 생성할 수 있는 최대, 최소값을 설정합니다.
- targetCPUUtilizationPercentage : 업스케일을 진행할 CPU 임계치를 설정합니다.
2. HPA 생성
- 먼저 kubectl autoscale 명령어를 사용한 생성방법입니다.
[root@k8s-master HPA]# kubectl autoscale deployment gs-spring-boot-docker-deployment --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/gs-spring-boot-docker-deployment autoscaled
[root@k8s-master HPA]#
위와 같이 지정한 deployment의 CPU 임계치, 업스케일, 다운스케일을 위한 설정을 입력하여 HPA를 생성합니다.
생성을 확인하는 방법은 다음과 같습니다.
먼저 CLI입니다.
[root@k8s-master HPA]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
gs-spring-boot-docker-deployment Deployment/gs-spring-boot-docker-deployment <unknown>/50% 1 10 1 2m30s
[root@k8s-master HPA]#
다음으로 Dashboard에서 확인하는 방법입니다.
- 다음으로 yaml파일을 사용한 생성방법입니다.
[root@k8s-master HPA]# kubectl apply -f ./gs-spring-boot-docker-hpa.yaml
horizontalpodautoscaler.autoscaling/gs-spring-boot-docker-hpa created
[root@k8s-master HPA]#
위와 같이 손쉽게 추가할 수 있습니다.
차이를 두기 위해 YAML 파일의 targetCPUUtilizationPercentage로 생성하였습니다.
위와 같이 정상추가 된것을 볼 수 있습니다.
이를 기반으로 정리해보면
CPU를 70%이상 사용할 경우 자동 AutoScale을 일으켜 최대 10개까지 업스케일 할 수 있고 다운스케일할 수 있다는 의미입니다.
자 그럼 HPA의 동작방식에 대해 테스트를 수행해 보도록 하겠습니다.
현재 Pod는 하나로 고정되어 있고
http://172.21.70.22:30490 호출 시 Hello Docker World를 출력하는 애플리케이션이 Deploy되어 있습니다.
테스트 과정은 다음과 같습니다.
- 먼저 해당 URL로 반복 요청을 진행합니다.
- CPU 임계치를 50%로 셋팅 후 사용량에 따른 POD의 AutoScale UP, DOWN의 추이를 지켜봅니다.
호출에 앞서 모니터링은 kubectl get hpa -w로 수행합니다.
[root@k8s-master HPA]# kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
gs-spring-boot-docker-hpa Deployment/gs-spring-boot-docker-deployment <unknown>/70% 1 10 1 11m
초기 상태입니다.
[root@k8s-master ~]# while true; do wget -q -O- http://172.21.70.22:30490; done
Hello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker WorldHello Docker World....
위와 같이 wget을 사용하여 요청을 늘려줍니다.
[root@k8s-master HPA]# kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
gs-spring-boot-docker-hpa Deployment/gs-spring-boot-docker-deployment 28% / 50% 1 10 1 25m
gs-spring-boot-docker-hpa Deployment/gs-spring-boot-docker-deployment 41% / 50% 1 10 1 1d
gs-spring-boot-docker-hpa Deployment/gs-spring-boot-docker-deployment 96% / 50% 1 10 1 1d
gs-spring-boot-docker-hpa Deployment/gs-spring-boot-docker-deployment 74% / 50% 1 10 3 1d
gs-spring-boot-docker-hpa Deployment/gs-spring-boot-docker-deployment 52% / 50% 1 10 3 2d
gs-spring-boot-docker-hpa Deployment/gs-spring-boot-docker-deployment 21% / 50% 1 10 3 2d
gs-spring-boot-docker-hpa Deployment/gs-spring-boot-docker-deployment 31% / 50% 1 10 3 3d
결과적으로 AutoScale이 발생하여 위와 같이 총 7개의 Pod가 기동 된것을 확인할 수 있습니다.
오토스케일 인/아웃은 클라우드에서 매우 중요한 개념입니다.
사실상 클라우드의 이유라고도 볼 수 있을 정도로.
그럼 학습하시구요. 다음시간에는 Ingress에 대해 살펴보도록 하겠습니다.
'③ 클라우드 > ⓚ Kubernetes' 카테고리의 다른 글
- Total
- Today
- Yesterday
- SWA
- JEUS7
- wildfly
- JBoss
- jeus
- TA
- Da
- node.js
- openstack tenant
- aws
- 마이크로서비스
- SA
- kubernetes
- openstack token issue
- Architecture
- 쿠버네티스
- 아키텍처
- JEUS6
- aa
- nodejs
- git
- 마이크로서비스 아키텍처
- Docker
- MSA
- 오픈스택
- apache
- API Gateway
- k8s
- webtob
- OpenStack
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |