Cloud/Kubernates

# k8s Horizontal Pod Autoscaler (HPA) 실습 - 2

skysoo1111 2019. 10. 31. 17:46

지난 글 (# k8s Horizontal Pod Autoscaler (HPA) 실습 - 1)에 이어서 이번엔 Memory 부하 테스트에 따른 Autoscaling을 실습을 진행하겠다.

 

사실 k8s를 공부하면서 가장 힘든 것은 버전 up에 따른 이슈들인데, 버전 up에 따른 API 변경 사항이 너무 많다. 물론 기본 예제들은 공식 사이트에 잘 나와있으나, k8s 입문자들이 관련 예제를 블로그 등의 정보를 가지고 조금 응용해보려고 하면 버전 문제 등으로 금방 막혀버린다.

 

그래서 내가 겪어봤을 때 가장 좋은 방법은 무턱대고 블로그 자료를 복붙 하기 보다 역시나 공식 문서를 활용하는 것이다. k8s의 API 문서를 보고 적어도 내가 적용하려는 버전의 해당 기능과 관련된 필드에는 어떤 값들이 들어가는지, 바뀐 것은 없는지 등 확인을 하는 것이 초반 삽질을 줄여주는 가장 확실한 방법일 것이다.

 

실습은 아래 순서를 따를 것이다.

 

[실습 순서]

1. Memory 부하 테스트용 이미지 작성 및 배포

2. 테스트용 이미지 배포

3. Memory를 Target으로 하는 HPA yaml 작성

4. JMeter Stress 툴을 활용해서 Pod Memory 부하 발생

5. Memory 부하량에 따른 HPA Pod Scaling 확인

6. 테스트 종료

 

Step 1. Memory 부하 테스트용 이미지 작성 및 배포

# nodejs 설치
$ yum install epel-release
$ yum install npm nodejs
$ node -v
$ npm -v 

# 간단한 web 접속 js 작성
$ vi server.js
var os = require("os");
var http = require('http');
var handleRequest = function(request, response) {
  response.writeHead(200);
  response.end("Hello World! I'm Server version 1 .  "+os.hostname() +" \n");
  //log
  console.log("["+
                Date(Date.now()).toLocaleString()+
                "] "+os.hostname());
}
var www = http.createServer(handleRequest);
www.listen(8080);


# 이미지 등록할 Docker file 작성
$ vi Dockerfile
FROM node:carbon
EXPOSE 8080
COPY server.js .
CMD node server.js

# server.js 이미지 생성
$ docker build . -t <docker registry>:5000/hello/client:v1

# docker 이미지 정상 여부 확인
$ docker run -d -p 8080:8080 <docker registry>:5000/hello/client:v1
=> web으로 접속 ( http://<k8s서버>:8080 )

# 테스트 컨테이너 kill
$ docker ps | grep 8080
$ docker kill <pid>

# registry에 이미지 push
# docker image registry에 push
$ docker push <docker registry>:5000/hello/client:v1

 

Step 2. 테스트용 이미지 배포

$ vi 1.hello-deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: hello-deployment
spec:
  replicas: 1
  minReadySeconds: 5
  selector:
    matchLabels:
      app: hello-deployment
  template:
    metadata:
      name: hello-deployment-pod
      labels:
        app: hello-deployment
    spec:
      containers:
      - name: hello-deployment
        image: <docker registry>:5000/pss/hello:v1
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
      nodeSelector:
        master: "numberone"
---
apiVersion: v1
kind: Service
metadata:
  name: hello-deployment-svc
spec:
  selector:
    app: hello-deployment
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 8080
  type: LoadBalancer

$ kubectl create -f hello-deployment.yaml

# deployment / svc 확인
$ kubectl get svc
$ kubectl get pods

 

Step 3. Memory를 Target으로 하는 HPA yaml 작성

$ vi 4.hello-v2beta2.yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: hello-deployment-v2beta2
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hello-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
    - resource:
        name: cpu
        target:
          averageUtilization: 50
          type: Utilization
      type: Resource
    - resource:
        name: memory
        target:
          averageValue: 30Mi
          type: AverageValue
      type: Resource
	  
# k8s HPA 확인
$ kubectl get hpa -w

 

Step 4. JMeter Stress 툴을 활용해서 Pod Memory 부하 발생

 

아래 사이트에 아주 잘 나와 있다.

https://m.blog.naver.com/PostView.nhn?blogId=jga0674&logNo=221020364286&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

stress 정도와 그 대상 IP:Port만 잘 설정하면 될 것이다. <Port는 Pod의 NodePort>

stress 정도 설정
stress 대상 IP:Port
JMeter툴 실행 결과

=> 초록 라인이 Request 실패 선이다. 부하를 많이 받았다는 뜻

 

Step 5. Memory 부하량에 따른 HPA Pod Scaling 확인

$ kubectl get hpa -w

=> TARGETS ( Memory , CPU )에 Memory 설정치 30MB를 넘기니까 REPLICAS가 1->2개로 증가하는 것 확인

 

Step 6. 테스트 종료

CTRL + C

 

<테스트 후 확인 사항>

1. Memory 부하 발생으로 REPLICAS 수가 MAX인 10까지 늘었다가 Memory가 정상 수치로 돌아온 뒤, REPLICAS 수가 2까지 줄고 난 뒤, 1까지 떨어지지 않는 것에 대해 확인 필요

 

2. Cpu 값이 <unknown>이 잡히는 Pod 존재, 어떤 배포 파일은 정상적으로 잡히는 이슈에 대한 확인 필요

 

 

 

<참고 사이트>

https://m.blog.naver.com/PostView.nhn?blogId=jga0674&logNo=221020364286&proxyReferer=https%3A%2F%2Fwww.google.com%2F

https://kubernetes.cn/docs/reference/generated/kubernetes-api/v1.15/#horizontalpodautoscalerstatus-v2beta2-autoscaling