mingming

Kubernetes - Autoscaling 본문

새싹 하이브리드 클라우드/Kubernetes

Kubernetes - Autoscaling

mingming_96 2023. 11. 26. 23:10

파드의 리소스 관리 

 

파드 및 컨테이너에 최소 필요한 리스스의 양을 요청할 수 있는 Requests와 최대 사용량을 제한할 수 있는 Limits를 구성할 수 있습니다. 이 기능은 쿠버네티스의 기능이라기 보다 컨테이너 런타임의 기능입니다. 

 

1. Requests

requests는 특정 파드 전용으로 사용할 수 있는 리소스를 보장합니다. 다른 리소스가 사용하지 못하도록 예약된 리소스입니다. 

 

현재 리소스 샤용량 확인 

kubectl top nodes | pods

kubectl top 명령어를 통해 현재 리소스 사용량을 확인할 수 있습니다. 해당 명령을 사용하기 위해선 metirc-server 가 설치되어 있어야합니다. 

 

Requests Template

apiVersion: v1
kind: Pod
metadata:
  name: request-pod
spec:
  containers:
  - name:
    image:
    resources:
      reqeusts:
        cpu: 200m
        memory: 10Mi

pod.spec.containers.resources.requests : 리소스 요청 선언

pod.spec.containers.resources.requests.cpu : CPU 리소스 요청

pod.spec.containers.resources.requests.memory : Memory 리소스 요청  

 

CPU 

CPU는 두가지 방식으로 리소스 요청을 할 수 있습니다. 숫자만 표기하는 경우 코어의 개수를 의미하며, 200m의 m은 밀리코어를 의미합니다. 1코어는 1000m으로 표기할 수있습니다.    

 

Memory

Memory는 SI 표준 단위와 IEC 표준 단위로 표기할 수 있습니다.

  • SI 표준 단위 : K, M, G, T, P, E 
  • IEC 표준 단위 : Ki, Mi, Gi, Ti, Pi, Ei

2. Limits

limits는 파드가 사용할 수 있는 한계를 지정합니다. 리소스 제한은 리소스 요청이 있는경우 요청한 리소스와 같거나 그보다 더 커야 합니다. 

 

Limits Template 

apiVersion: v1
kind: Pod
metadata:
  name: limits-pod
spec:
  containers:
  - name: limits-app
    image: ghcr.io/c1t1d0s7/go-myweb:alpine
    resources:
      limits:
        cpu: 200m
        memory: 10Mi

pod.spec.containers.resources.limits : 리소스 제한 선언

pod.spec.containers.resources.limits.cpu : CPU 리소스 제한

pod.spec.containers.resources.limits.memory : Memory 리소스 제한  

 

리소스 제한 확인

위에서 작성한 테스트 템플릿을 배포합니다. 

kubectl apply -f limits.yaml

 

현재 파드가 사용하는 리소스를 확인합니다.

kubectl top pods limits-pod

 

새로운 터미널을 열어 파드에 부하를 줍니다.

kubectl exec limits-pod -- sha256sum /dev/zero

 

sha256sum 해시를 계산하는 도구이며 /dev/zero 장치의 해시를 계산함으로 부하를 최대한 늘릴 수 있습니다. 

부하를 준 파드의 리소스 사용량을 확인합니다. limits 에서 정의한 리소스 제한이 제대로 동작하는지 확인합니다.

kubectl top pods limits-pod

 

 

3. Autoscaling

수평적 파드 오토스케일러 ( Horizontal Pod Autoscaler )를 줄여서 HPA라고 합니다. 오토스케일이 가능한 컨트롤러는 Replication Controller , ReplicaSet, Deployment, StatefulSet 입니다. 

vagrant@kube-control1:~/requests$ kubectl api-resources | grep hpa
horizontalpodautoscalers          hpa          autoscaling/v2         true         HorizontalPodAutoscaler

 

HPA 동작 단계

  • 관리되는 모든 파드의 메트릭을 측정해 가져옵니다.
  • 지정한 목표값에 부합하도록 필요한 파드 수를 계산합니다.
  • 파드를 관리하는 컨트롤러의 복제본을 조정합니다.

파드의 메트릭은 각 노드에 있는 kubelet 에서 cAdvisor의 에이전트를 실행시키고 cAdvisor 에이전트가 메트릭을 수집해 이를 메트릭 서버에 전달합니다. 메트릭 서버는 메트릭 API를 통해 HPA 리소스에 해당 메트릭을 전달합니다. 

 

HPA Template

---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: myap-hpa-cpu
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hpa-deploy
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 30

 

HPA 생성 및 Deployment 연동 

 HPA를 테스트하기 위한 Deployment 매니페스트 파일입니다. 

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: hpa
  name: hpa-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hpa
  template:
    metadata:
      labels:
        app: hpa
    spec:
      containers:
      - image: ghcr.io/c1t1d0s7/go-myweb:alpine
        name: myapp
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 10m
            memory: 10Mi

 

위에서 정의한 HPA 와 Deployment를 생성합니다.

kubectl apply -f hpa.yaml -f deployment.yaml

 

HPA 리소스 확인

kubectl get hpa 
NAME           REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
myap-hpa-cpu   Deployment/hpa-deploy   10%/30%   1         5         1          3m7s

 

Deployment의 복제본 개수를 3개로 지정했지만 HPA에 의해 개수가 조절되는 것을 확인할 수 있습니다. 

 

특정 파드에 부하를 줍니다. 

kubectl exec hpa-deploy-f5b58f644-4pfgj -- sha256sum /dev/zero

 

HPA에 의해 파드의 복제본이 늘어난 것을 확인할 수 있습니다. 

 

부하 종료

부하 종료 후 파드의 개수가 다시 줄어든 것을 확인할 수 있습니다.  

kubectl exec hpa-deploy-f5b58f644-t9q9b -- pkill -9 sha256sum

 

 

명령어를 통한 autoscale 생성

Usage:
  kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS
[--cpu-percent=CPU] [options]

 

매니페스트 파일을 작성하지 않고 위와 같이 kubectl autoscale 명령어를 통해 생성할 수 있습니다.   

'새싹 하이브리드 클라우드 > Kubernetes' 카테고리의 다른 글

Kubernetes - PV & PVC  (1) 2023.11.23
Kubernetes - Storage  (0) 2023.11.23