본문 바로가기

EKS/EKS Cluster

EKS AutoScaling - 1. HPA 설정하기

HPA가 어떤 조건에서 움직이는지, 어떠한 옵션이 있는지 아래 링크에서 확인할 수 있습니다.

 

github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md

 

kubernetes/autoscaler

Autoscaling components for Kubernetes. Contribute to kubernetes/autoscaler development by creating an account on GitHub.

github.com

 

아래와 같은 준비과정이 필요합니다.

 

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에 대해 알아보겠습니다.