개발/Infra

[k8s] Autoscaler

devriver 2021. 8. 5. 23:06
대세는 쿠버네티스 [초급~중급] 강의를 보고 정리한 글입니다.
[중급 편] Autoscaler

Autoscaler 종류

replicas가 1인 Controller가 관리하는 Pod가 있고 Service 트래픽의 100%가 이 Pod로 들어온다. 이 상태에서 트래픽이 증가한다면 어떻게 될까? Pod의 Memory, CPU 리소스가 고갈되고 심지어 죽을 수도 있다. 아래 3가지 방법으로 이를 대비해보자.

HPA(Horizontal Pod Autoscaler) : Pod 개수 증가

  • HPA는 Pod의 리소스 상태를 감지하고 있다가 위험한 상황 발생 시 Controller의 replicas를 1 -> 2로 증가시킨다. Controller는 Pod를 하나 더 만들게 되고 Pod는 수평적으로 증가하게 된다. 이를 Scale Out(<-> Scale In)이라고 한다. 결과적으로 Service의 트래픽은 50%, 50%로 분산돼서 Pod로 전달된다.
  • 기동이 빠른 앱, Stateless 앱에 사용한다. (Stateful 앱은 Pod마다 역할이 있는데 HPA는 이 역할을 상관없이 Pod를 만들기 때문)

VPA(Vertical Pod Autoscaler) : Pod 리소스 증가

  • VPA는 Pod의 리소스 상태를 감지하고 있다가 Pod의 리소스를 증가시킨다. 이를 Scale Up(<-> Scale Down)이라고 한다.
    예) Memory 1G -> 2G, CPU 1C -> 2C
  • Stateful App에 사용한다.
  • 하나의 Controller에 HPA, VPA를 동시에 사용할 수 없다.

CA(Cluster Autoscaler) : Cluster에 Worker Node 추가

Pod Scheduler에 의해 pod가 Node1, Node 2에 생성된다. Pod가 계속 생성되어 각 Node의 자원이 고갈된다면 어떻게 될까? CA를 이용해 이 상황을 대비해보자.

  • Scheduler는 CA에 Node 생성을 요청하고 사전에 CA에 연결해둔 Clode Provider(AWS)에 Node를 만든다. Scheduler는 이제 Cloud Provider Node에 Pod를 만들게 된다.
  • 로컬 Node의 자원에 다시 여유가 생긴다면 Scheduler는 CA에 Node 삭제를 요청하고 Node가 삭제되며 안에 있던 Pod는 로컬 Node로 옮겨진다.

HPA Architecture

  • k8s 주요 컴포넌트는 Pod 형태로 돌아가고 Controller Manager의 Deployment, ReplicaSet 등은 스레드 형태로 돌아간다.
  • apiserver는 모든 통신의 길목 역할을 한다. 사용자뿐만 아니라 k8s 컴포넌트도 db, 타 컴포넌트 접근 시 사용한다.
  • 워커 노드 컴포넌트에 설치되는 kubelet은 agent 역할을 하며 pod를 관리한다.
  • Controller Runtime(docker)은 실제로 컨테이너를 생성/삭제하는 구현체다.

Pod가 만들어지는 과정

  1. 사용자가 ReplicaSet을 만들고 replicas를 1로 설정한다.
  2. kube-apiserver에 pod 생성을 요청한다.
  3. kube-apiserver는 worker node의 kublet에 요청한다.
  4. kublet은 pod의 container만 빼서 docker에 container 생성을 요청한다.
  5. docker는 노드 위에 container를 만든다.

HPA 가 리소스 상태 감지하는 방법

  1. cAdvisor는 docker의 성능, 메모리를 측정하고 kubelet에 전달한다.
  2. metrics-server는 각 노드의 kubelet의 메트릭 정보를 저장한다.
  3. kube-apiserver는 Resource API를 통해 metrics-server 정보를 조회할 수 있고 HPA는 이 API를 15초마다 호출하여 체크한다.
    • kubectl top을 통해 외부에서 Rosource API 호출할 수 있다.
    • Prometheus를 설치하면 더 다양한 메트릭 정보를 수집할 수 있다. 이 정보를 트리거로 해서 HPA를 발동시킬 수 있다.
  4. pod의 리소스 사용률이 높아지면 HPA는 ReplicaSet에 replicas 증가를 요청한다.

HPA YAML

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