Cloud/Kubernates

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

skysoo1111 2019. 10. 23. 14:24

지난 글(# k8s Pod Autoscaling 개념)에서 쿠버네티스의 Pod Autoscaling 개념에 대해 간단히 알아보았으니, 이번엔 실제 예제를 통해 어떻게 동작하는지 확인해보자.

 

[실습 순서]

1. Metrics Server 기동

2. k8s 공식 문서 예제 실습

 

k8s의 Pod Autoscaling 기능을 구현하려면 반드시 선행되어야 하는 작업이 있다.

 

바로 Metrics Server 기동이다. Autoscaling을 하려면 k8s가 각 pod, node의 리소스 상태를 모니터링 할 수 있어야 한다.

이때, 리소스 상태 모니터링을 위해 사용되는 것이 Metrics Server이다.

 

Metrics Server 없이 Autoscaler를 사용하려고 하면 아래와 같은 에러가 발생할 것이다.

failed to get cpu utilization: unable to get metrics for resource cpu: no metrics returned from resource metrics API

 

Metrics Server는 아래 yaml 파일로 기동해주면 된다. 바로 이어서 CPU 부하 테스트를 진행하여 HPA가 어떻게 동작되는지 살펴보자.

 

1. Mestrics Server yaml 파일 생성

$ vi metrics-server.yaml

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: system:aggregated-metrics-reader
  labels:
    rbac.authorization.k8s.io/aggregate-to-view: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
rules:
- apiGroups: ["metrics.k8s.io"]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: apiregistration.k8s.io/v1beta1
kind: APIService
metadata:
  name: v1beta1.metrics.k8s.io
spec:
  service:
    name: metrics-server
    namespace: kube-system
  group: metrics.k8s.io
  version: v1beta1
  insecureSkipTLSVerify: true
  groupPriorityMinimum: 100
  versionPriority: 100
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: metrics-server
  namespace: kube-system
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    k8s-app: metrics-server
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  template:
    metadata:
      name: metrics-server
      labels:
        k8s-app: metrics-server
    spec:
      serviceAccountName: metrics-server
      volumes:
      # mount in tmp so we can safely use from-scratch images and/or read-only containers
      - name: tmp-dir
        emptyDir: {}
      containers:
      - name: metrics-server
        image: k8s.gcr.io/metrics-server-amd64:v0.3.1
        args:
        - --kubelet-insecure-tls
        imagePullPolicy: Always
        volumeMounts:
        - name: tmp-dir
          mountPath: /tmp
	  nodeSelector:                 // metrics server pod가 기동될 Node 선택
        master: "numberone"         // Node를 특정할 필요가 없다면 없어도 되는 config
---
apiVersion: v1
kind: Service
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    kubernetes.io/name: "Metrics-server"
spec:
  selector:
    k8s-app: metrics-server
  ports:
  - port: 443
    protocol: TCP
    targetPort: 443
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  - nodes/stats
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
 

 

2. Mestrics Server yaml 파일 등록 및 확인

# yaml 파일 등록
$ kubectl create -f metrics-server.yaml

# metrics server 기동 확인  # metrics server가 활성화 되기까지 시간이 걸릴 수 있다.
$ kubectl top pod
$ kubectl top node

3. k8s 실습 예제 deployment 및 service 등록

kubectl run php-apache --image=k8s.gcr.io/hpa-example --requests=cpu=200m --limits=cpu=500m --expose --port=80

 

4. k8s Horizontal Pod Autoscaler (HPA) 생성

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

 

5. k8s HPA 확인

kubectl get hpa -w

6. k8s HPA 동작 테스트 - 부하 증가

# 부하 발생용 컨테이너 기동
$ kubectl run -i --tty load-generator --image=busybox /bin/sh

# 부하 발생
$ while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

 

7. 약 1~5분이 지나면 CPU 부하가 올라가는 것을 확인할 수 있다.

    => CPU 부하가 오르자 1개였던 REPLICA 수가 5개까지 증가하였다.

같은 내용을 k8s dashboard에서도 확인

8. 부하 테스트 종료

CTRL + C

9. 테스트가 끝나면 시간이 지나고 늘어나 Pod 수가 줄어든다.

Auto Scaling 시간은 Up / Down에 따라 아래 옵션으로 쿨타임을 줄 수 있다.

--horizontal-pod-autoscaler-upscale-delay 옵션
--horizontal-pod-autoscaler-downscale-delay 옵션

 

Up Scaling시 기본 쿨타임은 3분, Down Scaling시 기본 쿨타임은 5분이다.

 

참고로 Autoscaling 계산식은 아래와 같다.

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

# currentReplicas = 1
# currentMetricValue = 200m
# desiredMetricValue = 100m
# desiredReplicas = 1 * (100m/200m)
                  = 2

=> Pod 수는 2개가 된다.                  

 

추후에 # k8s Horizontal Pod Autoscaler (HPA) 실습 - 2 에서는 memory 부하에 따른 autoscaling을 실습 결과를 포스팅 할 것이다.

 

<참조 사이트>

https://kubernetes.io/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

https://bunjang.github.io/2019/02/27/binjang-k8s-autoscaling-1.html

'Cloud > Kubernates' 카테고리의 다른 글

# k8s 유용한 명령어  (0) 2019.10.31
# k8s Horizontal Pod Autoscaler (HPA) 실습 - 2  (0) 2019.10.31
# k8s Pod Autoscaler 개념  (2) 2019.10.23
# docker + k8s + tensorflow-gpu 구성  (0) 2019.09.26
# k8s 외부 ETCD HA 구성  (0) 2019.09.10