개발강의정리/DevOps

[데브옵스를 위한 쿠버네티스 마스터] 애플리케이션 스케줄링과 라이프사이클 관리 - 오토 스케일링 HPA

nineDeveloper 2021. 1. 19.
728x90

오토 스케일링 HPA


포드 스케일링의 두 가지 방법

  • HPA: 포드 자체를 복제하여 처리할 수 있는 포드의 개수를 늘리는 방법
  • VPA: 리소스를 증가시켜 포드의 사용 가능한 리소스를 늘리는 방법
  • CA: 번외로 클러스터 자체를 늘리는 방법(노드 추가)

HPA(Horizontal Pod Autoscaler)

  • 쿠버네티스에는 기본 오토스케일링 기능 내장
  • CPU 사용률을 모니터링하여 실행된 포드의 개수를 늘리거나 줄임


VPA와 CA는 어떻게!?


HPA(Horizontal Pod Autoscaler) 설정 방법

  • 명령어를 사용하여 오토 스케일 저장하기

    $ kubectl autoscale deployment my-app --max 6 --min 4 --cpu-percent 50
  • HPA yaml을 작성하여 타겟 포드 지정

autoscaling.yaml

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
  namespace: default
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment
    name: myapp
  targetCPUUtilizationPercentage: 30

php-apache 서버 구동 및 노출

GKE 에서는 kube-system 에 모니터링 할 수 있는 metrics-server 서비스등이 이미 떠있음 아직 진도가 거기까지 나가지 않았으므로
GKE 에서 실습 진행

$ kubectl get pod -n kube-system
NAME                                                        READY   STATUS    RESTARTS   AGE
event-exporter-gke-77cccd97c6-hpcd6                         2/2     Running   0          13d
fluentd-gke-2z487                                           2/2     Running   0          13d
fluentd-gke-qsqtr                                           2/2     Running   0          13d
fluentd-gke-rw29v                                           2/2     Running   0          13d
fluentd-gke-scaler-54796dcbf7-82xg4                         1/1     Running   0          13d
gke-metrics-agent-2lx9b                                     1/1     Running   0          13d
gke-metrics-agent-nj5h2                                     1/1     Running   0          13d
gke-metrics-agent-xjftg                                     1/1     Running   0          13d
kube-dns-7bb4975665-2wfx9                                   4/4     Running   0          13d
kube-dns-7bb4975665-4trkb                                   4/4     Running   0          13d
kube-dns-autoscaler-645f7d66cf-262h5                        1/1     Running   0          13d
kube-proxy-gke-cluster-1-default-pool-f6cef6fa-hbbq         1/1     Running   0          13d
kube-proxy-gke-cluster-1-default-pool-f6cef6fa-hmlx         1/1     Running   0          13d
kube-proxy-gke-cluster-1-default-pool-f6cef6fa-m8cn         1/1     Running   0          13d
l7-default-backend-678889f899-hqkpg                         1/1     Running   0          13d
metrics-server-v0.3.6-64655c969-b29rr                       2/2     Running   0          13d
prometheus-to-sd-7kwz6                                      1/1     Running   0          13d
prometheus-to-sd-bhqrs                                      1/1     Running   0          13d
prometheus-to-sd-gfzzb                                      1/1     Running   0          13d
stackdriver-metadata-agent-cluster-level-5667846b58-qvglq   2/2     Running   0          13d

dockerfile

FROM php:5-apache
ADD index.php /var/www/html/index.php
RUN chmod a+rx index.php

index.php

<?php
  $x = 0.0001;
  for ($i = 0; $i <= 1000000; $i++) {
    $x += sqrt($x);
  }
  echo "OK!";
?>

https://kubernetes.io/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/#php-apache-%EC%84%9C%EB%B2%84-%EA%B5%AC%EB%8F%99-%EB%B0%8F-%EB%85%B8%EC%B6%9C

php-apache.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  replicas: 1
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: k8s.gcr.io/hpa-example
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m

---

apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80
  selector:
    run: php-apache

kubectl 로 실행
php-apache 서비스를 만들면 pod에 대한 ip가 변경되어도 pod를 자동으로 찾아서 이어주는 역할을 하면서 dns 서비스의 역할도 함
php-apache 로 요청을 하면 서비스에 접근이 됨

$ kubectl apply -f https://k8s.io/examples/application/php-apache.yaml
deployment.apps/php-apache created
service/php-apache created

Horizontal Pod Autoscaler 생성

$ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/php-apache autoscaled

hpa 확인
hipster 나 metrics 서비스가 없다면 리소스에 대한 정보를 획득하지 못해서 TARGETS 가 unknown 임
장시간 대기해도 변경사항이 없다면 metrics 서비스가 없는 것임

$ kubectl get hpa
NAME         REFERENCE               TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   <unknown>/50%   1         10        0          19s

$ kubectl get hpa -w
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         10        1          59s

오토스케일링을 적용한 서비스에 무한 루프 쿼리를 통해 공격 수행

$ kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
If you don't see a command prompt, try pressing enter
OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!...

1분 후 확인(중간에 unknown이 발생할 수도 있음, 수집까지 시간이 걸림)

트래픽을 분산해 부하를 낮추기 위헤 REPLICAS를 증가 시킴
증가 시키고 부하가 제어가 가능한지 모니터링 하다가 필요에 따라서 REPLICAS를 더 증가 시킴
안정화가 되면 MAXPODS 에 도달하지 않고 현재의 REPLICAS 갯수를 유지함

$ kubectl get hpa -w
NAME         REFERENCE               TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%     1         10        1          59s
php-apache   Deployment/php-apache   37%/50%    1         10        1          8m48s
php-apache   Deployment/php-apache   250%/50%   1         10        4          9m34s
php-apache   Deployment/php-apache   250%/50%   1         10        5          9m39s
php-apache   Deployment/php-apache   76%/50%    1         10        5          10m
php-apache   Deployment/php-apache   61%/50%    1         10        5          10m
php-apache   Deployment/php-apache   53%/50%    1         10        7          11m
php-apache   Deployment/php-apache   46%/50%    1         10        7          11m
php-apache   Deployment/php-apache   57%/50%    1         10        7          11m
php-apache   Deployment/php-apache   53%/50%    1         10        7          12m
php-apache   Deployment/php-apache   54%/50%    1         10        7          13m
php-apache   Deployment/php-apache   47%/50%    1         10        7          13m
php-apache   Deployment/php-apache   46%/50%    1         10        7          14m

부하를 중지 시키면 CPU 부하가 떨어졌다고 바로 REPLICAS를 축소시키지는 않고 갯수를 유지함
네트워크 상의 병목현상등 트래픽이 안오는 것일 수 있고 유저가 잠시 줄어든 것일 수도 있기때문에
pod 생성과 파괴가 더 부하가 발생할 수 있으므로 일정시간 기간을 두면서 REPLICAS 의 갯수를 줄여감

$ kubectl get hpa -w
NAME         REFERENCE               TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   22%/50%    1         10        7          14m
php-apache   Deployment/php-apache   0%/50%     1         10        7          14m
php-apache   Deployment/php-apache   0%/50%     1         10        7          19m
php-apache   Deployment/php-apache   0%/50%     1         10        3          19m
php-apache   Deployment/php-apache   0%/50%     1         10        3          19m
php-apache   Deployment/php-apache   0%/50%     1         10        1          19m

연습문제

  • 이미지 nginx를 생성하고 HPA가 적용하라
    • 최대 스케일링 개 수: 10
    • 최소 스케일링 개 수: 2
    • 스케일링을 수행할 CPU 활동량: 30%
728x90

댓글

💲 추천 글