지난 글(# 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 |