EKS AutoScaling - 1. HPA 설정하기
HPA가 어떤 조건에서 움직이는지, 어떠한 옵션이 있는지 아래 링크에서 확인할 수 있습니다.
github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md
아래와 같은 준비과정이 필요합니다.
1. Metric Server 구성
각 파드의 리소스 메트릭을 읽을 수 있어야 하기 때문에, Metric Server를 구성하시거나 커스텀 매트릭을 수집하여 세팅하셔야합니다.
https://aws-diary.tistory.com/54에서 메트릭 서버를 설치하는 부분을 참고해주세요
2. Resource Limit, Request
Deployment.yaml에서 Request나 Limit을 설정하지 않으면 % 계산을 할 수 없기 때문에 Yaml에 세팅을 해야합니다.
다른 많은 게시글에 예시가 있지만 제가 이 게시글에서 사용한 예시는 아래와 같습니다.
저는 블루/그린 배포를 ArgoCD를 통해 구현하여 아래와 같이 작성되어있습니다.
apiVersion: argoproj.io/v1alpha1 # Changed from apps/v1
kind: Rollout # Changed from Deployment
# ----- Everything below this comment is the same as a deployment -----
metadata:
name: phh-fo
namespace: phh-test-fo
spec:
selector:
matchLabels:
app: phh-fo
replicas: 2
template:
metadata:
labels:
app: phh-fo
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: nodegroup-type
operator: In
values:
- FRONTEND
terminationGracePeriodSeconds: 30
containers:
- image: {YOUR ECR IMAGE URL}
imagePullPolicy: Always
name: phh-fo
ports:
- containerPort: 9000
resources:
requests:
cpu: "125m"
memory: "256Mi"
limits:
cpu: "250m"
memory: "512Mi"
lifecycle:
preStop:
exec:
command:
- sh
- -c
- curl --silent http://localhost:9000/change/readiness/refuse
livenessProbe:
exec:
command:
- sh
- -c
- curl --silent http://localhost:9000/sys/healthz/liveness | grep -q '^{\"status\"\:\"UP\".*}$'
- echo $?
initialDelaySeconds: 15
periodSeconds: 30
failureThreshold: 3
timeoutSeconds: 1
readinessProbe:
exec:
command:
- sh
- -c
- curl --silent http://localhost:9000/sys/healthz/readiness | grep -q '^{\"status\"\:\"UP\".*}$'
- echo $?
initialDelaySeconds: 15
periodSeconds: 10
failureThreshold: 3
timeoutSeconds: 1
env:
- name: LOG_TYPE
valueFrom:
configMapKeyRef:
name: spring-info
key: log-type
- name: PROJECT
valueFrom:
configMapKeyRef:
name: spring-info
key: project
- name: BO_CORE_DNS
valueFrom:
configMapKeyRef:
name: spring-info
key: bo-core-dns
- name: FULENTD_SERVER_IP
valueFrom:
configMapKeyRef:
name: spring-info
key: fluentd-sever-ip
minReadySeconds: 30
revisionHistoryLimit: 3
strategy:
# ----- Everything above this comment are the same as a deployment -----
blueGreen: # A new field for the Blue Green strategy options
previewService: phh-fo-prv # Reference to a service
activeService: phh-fo # Reference to a service
autoPromotionEnabled: true
previewReplicaCount: 1
scaleDownDelaySeconds: 60 #전환후 이전 active pod 삭제 대기 시간
3. HPA Yaml
어떠한 리소스를 가지고 기준을 삼아 파드를 늘리고 죽일 것인지에 대한 상세 옵션으로, 아래와 같습니다.
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: phh-fo-hpa
namespace: phh-test-fo
spec:
scaleTargetRef:
apiVersion: argoproj.io/v1alpha1
kind: Rollout
name: phh-fo
minReplicas: 1
maxReplicas: 4
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Pods
value: 1
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 60
간단하게 설명드리면,
Replicas의 값을 통해 min max pod 개수를 설정할 수 있고
metrics type을 통해 기본적인 metric server를 통해 수집된 cpu mem와 같은 메트릭이나
혹은 Custom metric을 직접 구성하여서 사용하실 수 도 있습니다.
그리고 마지막으로 hpa v2부터 추가되고있는 (kubernetes version 1.18 이상) behavior를 통해
파드를 줄이고 늘릴 때, 조건을 줄 수 있습니다.
type에서 percent는 deployment의 레플리카 수의 100% 만큼
min or max replicas가 될 때 까지 periodSeconds 마다 100%씩 더 띄우거나 줄이는 상태라고 볼 수 있습니다.
type에서 pods는 values의 개수만큼 줄이거나 늘린다고 보시면 되겠습니다.
마지막으로 stabilizationWindowsSeconds는 어느정도 기간동안 지켜본 후 적용할 것인지 입니다.
실제 적용하였을 경우 저의 경우에는 2개가 구성되어야 하나
사용하지 않는 서비스이기 때문에 Min 값으로 줄어있는 것을 볼 수 있습니다.
또한 ArgoCD에서 이를 Sync를 맞춰 2개를 늘리려하더라도, HPA에 의해 바로 종료되는 것을 아래서 볼 수 있습니다.
HPA에 대해서 간략하게 알아봤습니다.
behavior의 정책을 잘 정해서 구성한다면, 어려움 없이 트래픽을 소화하는 서비스를 구성하실 수 있습니다.
다음 포스트에서 EKS AutoScaler에 대해 알아보겠습니다.