망지로그

Kubernetes pod 오토스케일링- HPA( Horizontal Pod Autoscaler) 본문

Kubernetes

Kubernetes pod 오토스케일링- HPA( Horizontal Pod Autoscaler)

망지v 2022. 12. 22. 17:34

Docker 기반 컨테이너 오케스트레이션  도구인 쿠버네티스!

쿠버네티스 환경에서도 할당된 자원의 부하상태에 따라

자동으로 pod의 scale in-out이 가능한데, HPA를 통해서 오토스케일링을 설정해주면 된다.

교육동안 진행했던 포스트를 재정리하고자 한다.

 

yaml 파일 apply 시 오류가 뜬다면 아래 코드에 있는 주석을 잘 삭제하였는지 확인하기 바랍니당.


 

 

📌k8s HPA

📙 deployment를 통한 pod생성 및 Cluster IP 서비스 생성

*deploy로 pod를 생성하면 가용성 확보와 롤링 업데이트, 롤백이 가능하다.

✔️1. vi 편집기를 이용하여 yaml파일로 deployment와 service apply.

[root@master ~]# mkdir hpa && cd $_
[root@master hpa]#
[root@master hpa]# vi php-apache.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  replicas: 2 ## desired capacity 시작 갯수
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: k8s.gcr.io/hpa-example ##부하 올리기 좋은 이미지. 검토할때는 이미지만 바꿔주면 됨.
        ports:
        - containerPort: 80 ## 정보성
        resources:
          limits:
            cpu: 500m ## 단일 pod cpu한도
          requests:
            cpu: 200m ## 단일 pod cpu최소
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80 ##실제 포트 설정
  selector:
    run: php-apache ##deployment meta data

[root@master hpa]# kubectl apply -f php-apache.yaml

✔️2. 상태 확인 ( pod2개와Cluster IP가 정상적으로 생성되었다.)

replicaset은 deployment 하윗단에 존재하는 워크로드 리소스이다.

[root@master hpa]# kubectl get all
NAME                             READY   STATUS    RESTARTS   AGE
pod/php-apache-d4cf67d68-ppkbl   1/1     Running   0          54s
pod/php-apache-d4cf67d68-rdjj5   1/1     Running   0          54s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   8d
service/php-apache   ClusterIP   10.98.204.31   <none>        80/TCP    54s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/php-apache   2/2     2            2           54s

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/php-apache-d4cf67d68   2         2         2       54s

📙 HPA  apply

✔️1.yaml 파일 apply로 hpa 워크로드 리소스 생성

[root@master hpa]# vi hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  maxReplicas: 4 ##최대 pod 갯수
  minReplicas: 1 ##최소 pod 갯수
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache ##위에서 생성한 deployment name
  targetCPUUtilizationPercentage: 50 ##스케일링 인-아웃 기준 CPU사용률
status:
  currentCPUUtilizationPercentage: 0
  currentReplicas: 2
  desiredReplicas: 2

[root@master hpa]# kubectl apply -f hpa.yaml

✔️2. 상태 확인

[root@master hpa]# kubectl get all
NAME                             READY   STATUS    RESTARTS   AGE
pod/php-apache-d4cf67d68-ppkbl   1/1     Running   0          25m
pod/php-apache-d4cf67d68-rdjj5   1/1     Running   0          25m

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP   8d
service/php-apache   ClusterIP   10.98.204.31   <none>        80/TCP    25m

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/php-apache   2/2     2            2           25m

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/php-apache-d4cf67d68   2         2         2       25m

NAME                                             REFERENCE               TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/php-apache   Deployment/php-apache   <unknown>/50%   1         4         0          14s


[root@master hpa]# kubectl get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         4         2          64s

✔️3. 부하 발생시키기


[root@master ~]# kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"

->부하 발생시키기 ; http://php-apache 쿠버네티스의 자체 dns ; coredns .

✔️4. 부하 발생시켜 놓고, 원격접근 툴(필자의 경우, mobaxterm)의 탭 하나 더 생성하여 마스터노드로 접근해서 hpa 상태 확인

=> 부하가 50%넘자 REPLICAS가 4개로 늘어난 것 확인가능.

 

✔️5. 부하 발생시켰던 탭으로 돌아가 control + c (부하중단) 후 hpa 상태 확인

[root@master ~]# kubectl get hpa
NAME         REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   0%/50%    1         4         1          23m

=> 부하가 줄어들고 REPLICAS가 1(최소 파드 갯수)로 돌아온 모습

 

📌 왜 deployment의 replicaset이 아닌 HPA의 최소 용량으로 줄어드는가?

✔️ 가장 기본적인 관점에서, HorizontalPodAutoscaler 컨트롤러는 원하는(desired) 메트릭 값과 현재(current) 메트릭 값 사이의 비율로 작동한다.

원하는 레플리카 수 = ceil[현재 레플리카 수 * ( 현재 메트릭 값 / 원하는 메트릭 값 )]

우리 예시의 경우, 현재 메트릭(CPU) 값이 0%이므로,  HPA의 원하는 레플리카 수 = 최소 레플리카 수로 정해진다.

HorizontalPodAutoscaler는 디플로이먼트 및 디플로이먼트의 레플리카셋의 크기를 조정하기 때문에 HPA의 알고리즘대로 replicaset의 갯수가 정해진다.

출처 :&nbsp;https://kubernetes.io/ko/docs/tasks/run-application/horizontal-pod-autoscale/

가용성을 생각해 보았을 때 HPA 의 최소 레플리카스는 2개 이상은 되어야 할 것이다. 

 

'Kubernetes' 카테고리의 다른 글

CKA- RBAC ; role, rolebinding  (0) 2024.06.26
CKA- Kubeconfig  (0) 2024.06.25
CKA - Certificates API  (0) 2024.06.25
CKA - View Certificate Details  (0) 2024.06.24
CKA- backup and restore  (0) 2024.06.24