#1.Summary.
K8S 관련 업무를 보면서 CronHPA에 대해 알게 되었다. CronHPA, Karpenter, Cluster AutoScaler, Keda 등 자동 스케일링 도구들이 많지만 이번 글에서는 CronHPA에 대해서 언급하고 나머지들은 추후 다른 글에서 언급하겠다.
#2.Purpose & Result.
1.야간 및 주말 트랜잭션 유입 최소 시간에 자원 사용량 최적화를 위한 스케줄러 적용.
2.각 시스템 Pod, 즉 컨테이너 개수를 최소화하여 Node 개수를 줄여 비용 절감. 다시 말해, EKS 노드는 EC2 서버로 기동되며, Node 1개 감소는 EC2 서버 1대 감소와 동일.
3.서비스 트랜잭션 유입 적은 시간대 CronHPA 기능을 이용한 스케쥴러 적용.
4.Pod HPA Min/Max 중 Min 값을 최소화하여 트랜잭션 유입 최소 시간대 자원 최적화.
5.야간 / 주말 시간대 대량의 트랜잭션이 유입된 경우 자동으로 자원이 증가되도록 설정 유지.
6.시스템 Pod 및 Node 개수 최소화 운영으로 클라우드 리소스 비용 절감.
7.AWS Auto-Scaling / Karpenter / Keda 등의 스케줄러를 이용한 Node 종료 방식보다 Pod 개수를 최소화하여 Node가 자연스럽게 축소되는 방식이 안정적임을 확인.
8.대량 트랜잭션 유입 전 pod 개수를 증가하여 응답 시간 지연 및 병목 현상 미발생.
9.야간 / 휴일 등 트랜잭션 유입 최소 시간대 시스템 자원 최소화 운영 가능.
#3.Main.
CronHPA는 Kubernetes 환경에서 사용되는 Custom Resource Definition, 즉 CRD로, Cron 표현식을 기반으로 Horizontal Pod Autoscaler (HPA)를 스케줄링하는 데 사용.
다시 말해 CronHPA는 Kubernetes 클러스터에서 실행되는 애플리케이션의 Horizontal Pod Autoscaling을 CronJob으로 활성화하는 기능. 기본적으로 Kubernetes는 HPA를 사용하여 CPU 사용량 또는 기타 메트릭을 기준으로 파드를 자동으로 확장하거나 축소하지만, CronHPA는 특정 시간 또는 일정한 간격으로 발생하는 작업을 기반으로 파드의 수를 조정 가능.
#4.Guide
1.CronHPA API 및 Controller 설치.
- API : autoscaling.alibabacloud.com/v1beta1
- kubectl 명령어 이용하여 설치 확인 Command 참고.
==> https://github.com/AliyunContainerService/kubernetes-cronhpa-controller
- kubectl api-resources -n (namespace) | grep cronhpa
- 정상 설치 되면 AWS Console EKS 대시보드에서 확인.
- 오픈소스이기에 [확장프로그램] => [CustomResourceDefinitions]에서 확인.
2. CronHPA 적용을 위한 Auto-scaling 방식 yaml 파일 Example
- HPA의 minReplicas 개수를 조정하여 POD/NODE 개수를 최소화함.
- Auto-scaling 방식 yaml이랑 deployment.yaml이랑 따로 text로 Save.
Sample Yaml.
1.CronHPA Auto-Scaling Yaml
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
name:xxxxx <== 지정하기 나름
namespace:xxxxx <== 지정하기 나름
spec:
scaleTargetRef:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
name: xxxxx <== 지정하기 나름
jobs:
- name: "scale-down"
schedule: "*0 20** 1-5" // 월 ~ 금까지 오후 20시에서 1개로 pod 적용
targetSize:1
- name:"scale-up"
schedule: "0 7** 1-5" // 월 ~ 금까지 오전 07시에 2개로 pod 적용
targetSize:2
2.CronHPADeployment Yaml
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
name:xxxxx <== 지정하기 나름
namespace:xxxxx <== 지정하기 나름
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: xxxxx <== 지정하기 나름
excludeDates:
_"*****"
jobs:
- name: "scale-down"
schedule: "*0 20 ** 1-5"
targetSize:1
- name:"scale-up"
schedule: "0 7 ** 1-5"
targetSize:2
3. CronHPA yaml 파일 컴파일 kubectl apply -f xxxxx.yaml
4. CronHPA 등록 확인 è kubectl get cronhpa -n (namespace)
5. AWS Console EKS 대시 보드에서 확인. 즉 cron xxxx ~~~ autoscaling.alibabacloud.com 안에 위치.
6. CronHPA 삭제 kubectl delete cronhpa -n (namespace)
#5.Conclusion
결국 스케쥴링과 연관된 것이기 때문에 Karpenter, Cluster AutoScaler, Keda 보다 무조건 100% 좋다고는 볼 수 없다.
수동으로 설정 값 변경 후 다시 Apply 해야 되는 경우가 종종 존재.
==> 날짜 연계가 지원되지 않아 명절 및 장기 연휴 시 스케줄러 시간 수동 조정.
==> 명절 및 장기 연휴 등 장시간 휴일일 때는 공휴일을 체크하는 기능이 없어 yaml 파일의 날짜를 수정하여 컴파일 및 재적용 필요.
그래도 가장 큰 임팩트는 대량 Push 및 Event 등으로 Auto Scaling 발생됨에 따라 Node 재분배 되어 큰 문제는 없었으나, 대량 Transaction 유입 시 일시적으로 Node CPU/MEM 등 자원 증가할 경우, CronHPA 적용 시 해당 현상을 인지 및 고려할 필요 X
결론 : 리소스를 좀 타이트하게 완전 최적화로 사용하고 싶다면 CronHPA 적용도 나쁘지 않다고 생각.
다음에는 Karpenter에 대해 언급하겠다.
'#Container > #Kubenetes' 카테고리의 다른 글
Stern? (2) | 2024.08.28 |
---|---|
EKS AWS Auth (0) | 2024.05.27 |
Understanding Kubernetes. (0) | 2020.04.23 |