[클라우드/K8S 기본(7) -오토스케일링 HPA]

SooYeon Yeon·2022년 9월 13일
0

클라우드 K8S

목록 보기
9/18

오토스케일링(AutoScaling)

HPA(Horizontal Pod Autoscaler)

매트릭 서버

  • 각 포드의 자원 사용량 정보를 수집하기 위한 도구
  • HPA가 자원을 요청할 때 매트릭 서버를 통해 계측값을 전달 받는다.

포드의 autoscale은 지정된 자원사용량의 제한을 확인하고 이를 넘어서는 경우 수평적인 확장을 하게 된다. 따라서 포드가 어느정도의 자원을 할당받았는 지 미리 지정해두어야 한다.

참고 : 1000m이 1개의 CPU

limits:

cpu: 500m → 0.5개 cpu

requests:

cpu: 200m → 0.2개 cpu

최소 보장값은 0.2개, 만약 다른 포드에서 CPU를 사용하고 있지 않아 물리자원(CPU)에 여유가 있다면 이를 확장하여 최대 0.5개 까지 사용하겠다는 뜻

gke에서 0.5~2(VM)

cpu사용량을 봐서 20%가 넘는다면 min은1이고 10개까지 늘린다는 뜻. 만약 3개를 배포했는데 min이 1이고 max가 10이면

Quiz

  1. hpa 배포
  2. deployment + svc
    1. deployment : replicas 3
    2. svc : lb 사용
  3. http://211.183.3.201 로드밸런서 연결되는 지 확인
  4. HPA 이용하여 pod의 CPU 사용량이 10%를 넘어서게 되면 수평확장을 통해 최대 20개까지 사용가능하도록 하라. 단, min → 1개로 지정

Quiz. 그렇다면 replicas는 몇이 되는건가 ? 3 or 1? → 1이 된다.

  1. 외부에서 트래픽을 보내본다.
    1. 외부에서 http://211.183.3.201로 ab를 이용하여 트래픽을 보내본다. 몇개까지 늘어나고 ab 중지된 뒤 줄어드는 지 확인
  1. 매트릭 서버 배포

매트릭 서버를 인터넷으로부터 직접 설치하게 되면 인증된 공인인증서를 통한 인증이 먼저 수행 되어야한다. 하지만 우리는 해당 인증서 발급을 하지 않은 상태이므로 이 단계를 bypass 하더라도 문제없도록 —kubelet-insecure-tls를 작성해준다.

wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
vi components.yaml

136번째 줄 추가

  • 배포
root@manager:~/k8slab# kubectl apply -f components.yaml
  1. pod & service 배포

autoscaletest.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:           # 아래는 ReplicaSet 설정
  replicas: 3
  selector:     # 아래의 라벨 개수를 확인하여 관리
    matchLabels:
      app: webserver
  template:     # 아래는 Pod 구성
    metadata:
      name: my-webserver
      labels:
        app: webserver
    spec:       # 아래 부분은 컨테이너 구성 내용
      containers:
      - name: my-webserver
        image: nginx
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-lb
spec:
  ports:
  - name: web-port
    port: 80
  selector:
    app: webserver
  type: LoadBalancer
  • 배포
root@manager:~/k8slab# kubectl apply -f autoscaletest.yaml
deployment.apps/autoscaletest created
service/autoscaletest-lb created
  • 확인
root@manager:~# kubectl get deploy,svc
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/autoscaletest   1/1     1            1           22m

NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
service/autoscaletest-lb   LoadBalancer   10.99.245.166   211.183.3.202   80:31060/TCP   22m
service/kubernetes         ClusterIP      10.96.0.1       <none>          443/TCP        4h35m
  • HPA 통한 오토스케일 구성
root@manager:~/k8slab# kubectl autoscale deploy autoscaletest --cpu-percent=10 --min=1 --max=20
horizontalpodautoscaler.autoscaling/autoscaletest autoscaled
  • 트래픽 발생과 오토스케일 확인
root@manager:~# kubectl top no --use-protocol-buffers ; kubectl get hpa
NAME      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
manager   335m         8%     1605Mi          42%
worker1   183m         4%     953Mi           51%
worker2   165m         4%     890Mi           48%
worker3   198m         4%     997Mi           54%
NAME            REFERENCE                  TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
autoscaletest   Deployment/autoscaletest   0%/10%    1         20        1          18m

kubectl top ~ 이 안된다면, kubectl edit deploy -n kube-system metrics-server 을 입력하고,

nodeSelector: 윗줄에 hostNetwork: true 하고 재부팅도 해보기

  • 부하 발생시키기
ab -c 1000 -n 200 -t 60 http://211.183.3.101:31060/

동시 사용자 수 -n, 각 사용자당 -c 회, -t 초동안 실행

  • 상태 재 확인
root@manager:~# kubectl top no --use-protocol-buffers ; kubectl get hpa
NAME      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
manager   830m         20%    1694Mi          44%
worker1   629m         15%    937Mi           50%
worker2   345m         8%     862Mi           46%
worker3   404m         10%    930Mi           50%
NAME            REFERENCE                  TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
autoscaletest   Deployment/autoscaletest   30%/10%   1         20        20         29m
root@manager:~# kubectl get pod
NAME                             READY   STATUS    RESTARTS   AGE
autoscaletest-7c7986bdcb-4nl87   1/1     Running   0          52s
autoscaletest-7c7986bdcb-5c7nh   1/1     Running   0          52s
autoscaletest-7c7986bdcb-5jdtj   1/1     Running   0          6m23s
autoscaletest-7c7986bdcb-8wp86   1/1     Running   0          6m23s
autoscaletest-7c7986bdcb-94bwd   1/1     Running   0          6m38s
autoscaletest-7c7986bdcb-9cg68   1/1     Running   0          6m53s
autoscaletest-7c7986bdcb-bshv8   1/1     Running   0          6m53s
autoscaletest-7c7986bdcb-c8zm8   1/1     Running   0          6m38s
autoscaletest-7c7986bdcb-d6tn9   1/1     Running   0          6m23s
autoscaletest-7c7986bdcb-gss7f   1/1     Running   0          6m53s
autoscaletest-7c7986bdcb-jsl64   1/1     Running   0          52s
autoscaletest-7c7986bdcb-lxr9g   1/1     Running   0          6m23s
autoscaletest-7c7986bdcb-m2mht   1/1     Running   0          31m
autoscaletest-7c7986bdcb-m8zvk   1/1     Running   0          6m23s
autoscaletest-7c7986bdcb-pvq6w   1/1     Running   0          6m23s
autoscaletest-7c7986bdcb-svjt5   1/1     Running   0          6m38s
autoscaletest-7c7986bdcb-t4rcz   1/1     Running   0          52s
autoscaletest-7c7986bdcb-t4t99   1/1     Running   0          6m38s
autoscaletest-7c7986bdcb-thjc9   1/1     Running   0          6m23s
autoscaletest-7c7986bdcb-thzng   1/1     Running   0          6m23s
  • 줄어들고나서 다시 보면 1개까지로 내려온다.
root@manager:~# kubectl top no --use-protocol-buffers ; kubectl get hpa
NAME      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
manager   360m         9%     1703Mi          44%
worker1   183m         4%     895Mi           48%
worker2   187m         4%     809Mi           43%
worker3   206m         5%     877Mi           47%
NAME            REFERENCE                  TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
autoscaletest   Deployment/autoscaletest   0%/10%    1         20        1          41m
root@manager:~# kubectl get pod
NAME                             READY   STATUS    RESTARTS   AGE
autoscaletest-7c7986bdcb-m2mht   1/1     Running   0          43m

0개의 댓글