[KUBERNETES] HPA(오토스케일링) 활용법


1. 개요

  • 애플리케이션을 자동으로 Scale-out 할수 있는 Horizontal Pod Autoscaler 기능

CPU 자원설정에 따라 자동으로 pod의 숫자를 scale-up 한다.


2. deployment 작성

  • back-end-rolling-deployment.yaml
    apiVersion: apps/v1beta2
    kind: Deployment
    metadata:
    name: rolling-update-test
    labels:
      app: web-front-end
    spec:
    replicas: 1
    minReadySeconds: 10
    strategy:
      type: RollingUpdate
      rollingUpdate:
        maxUnavailable: 50%
    selector:
      matchLabels:
        app: web-front-end
    template:
      metadata:
        labels:
          app: web-front-end
          department: group3
      spec:
        containers:
        - name: m-client-rolling
          image: skarl/client:latest
          env:
          - name: PORT_ARGS
            value: "--port=80"
          ports:
          - containerPort: 80
            name: web-port
            protocol: TCP
          resources:
            requests:
              memory: "256Mi"
              cpu: "200m"
            limits:
              memory: "1Gi"
              cpu: "500m"
    

Resources Requests 사용량 설정 필수
resources.requests.cpu 부분에 CPU 자원을 200m(milli-cores) 또는 0.2로 요청


2. hpa 작성

  • hpa-deployment.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: rolling-update-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta2
    kind: Deployment
    name: rolling-update-test
  maxReplicas: 10
  minReplicas: 1
  targetCPUUtilizationPercentage: 10

scaleTargetRef: 대상설정
minReplicas: 최소pod
maxReplicas: 최대pod
targetCPUUtilizationPercentage: CPU 사용 임계치 %로설정 넘어서면 업스케일 동작

3. 모니터링 및 테스트

  • 부하테스트를 통해 cpu 사용량 늘리고

while true; do wget q -O https://rolling.test.com:30100/coin/list; done

  • 명령어로 모니터링 kubectl get hpa -w

Alt text

  • 대쉬보드에서 확장된 pods 확인

Alt text


4. 사용중 CPU -> UNKnown 일때 해결방법

  • 메트릭 api 존재유무 확인
kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes
  • 메트릭 서버 설치

git clone https://github.com/kubernetes-incubator/metrics-server.git
cd metrics-server/
kubectl create -f deploy/1.8+/

  • 설치 후 확인

[root@tweb01 ~] kubectl get –raw “/apis/metrics.k8s.io/v1beta1/nodes” {“kind”:”NodeMetricsList”,”apiVersion”:”metrics.k8s.io/v1beta1”,”metadata”:{“selfLink”:”/apis/metrics.k8s.io/v1beta1/nodes”},”items”:[{“metadata”:{“name”:”tweb01.freebex.com”,”selfLink”:”/apis/metrics.k8s.io/v1beta1/nodes/tweb01.freebex.com”,”creationTimestamp”:”2018-06-28T07:27:00Z”},”timestamp”:”2018-06-28T07:26:00Z”,”window”:”1m0s”,”usage”:{“cpu”:”116m”,”memory”:”2454816Ki”}},{“metadata”:{“name”:”tweb02.freebex.com”,”selfLink”:”/apis/metrics.k8s.io/v1beta1/nodes/tweb02.freebex.com”,”creationTimestamp”:”2018-06-28T07:27:00Z”},”timestamp”:”2018-06-28T07:26:00Z”,”window”:”1m0s”,”usage”:{“cpu”:”76m”,”memory”:”1818256Ki”}}]}

  • kubernetes 설정파일 수정

vi /etc/kubernetes/manifests/kube-controller-manager.yaml

controller-manager 옵션에 추가

  • –horizontal-pod-autoscaler-use-rest-clients=true

그래도 unknown이 나오면 재실행 해보고 부하를 줘보고 기다려보면 나온다.