Kubernetes Time based Scaling

2020, Jul 06    

Kubernetes AutoScale

Kubernetes에서는 CPU 사용률에 따라 확장되는 HorizontalPodAutoscaler를 사용하여 자동확장을 할 수 있습니다. 일반적인 상황에서는 문제없이 작동할 수 있지만 예상된 트래픽보다 몰리는 상황에서는 대응하지 못할 수 있습니다. HPA에 의해 Pod가 생성되는 시간이 길진 않지만 트래픽을 수용할 수 있는 시간보다는 길 수 있기 때문입니다. 이러한 대규모 트래픽이 예상되는 이벤트가 있을 경우, HPA보다는 Timebased의 Pod 확장이 필요합니다.

Job/CronJob

Kubernetes의 Job/CronJob을 사용하면 Timebased로 Pod를 확장할 수 있습니다. 그리고 args에 kubectl을 이용하여 scale 조정을 합니다. Container에서 kubectl을 사용하기 위해서는 사전에 kubectl CLI를 Dockerfile를 통해서 추가시켜줘야합니다.

  • kubectl 설치 방법(https://kubernetes.io/ko/docs/tasks/tools/install-kubectl/)

그리고 kubectl를 사용하기 위한 kubeadm config가 필요합니다.

Dockerfile

FROM debian:buster-slim

RUN apt-get update && apt-get install curl -y; \
    curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.16.0/bin/linux/amd64/kubectl; \
    chmod +x ./kubectl; \
    mv ./kubectl /usr/local/bin/kubectl; \
    kubectl version --client

SclaeUp

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: nginx-scaleup
  namespace: demo
spec:
  failedJobsHistoryLimit: 1
  jobTemplate:
    metadata:
      creationTimestamp: null
    spec:
      template:
        metadata:
          creationTimestamp: null
        spec:
          containers:
          - command:
            - /bin/sh
            - -c
            - kubectl scale deploy nginx -n demo --replicas=3
            image: okcp/kubectl:latest
            imagePullPolicy: Always
            name: scaleup
            volumeMounts:
              - mountPath: /root/.kube
                name: kube-config            
          dnsPolicy: ClusterFirst
          restartPolicy: OnFailure
          schedulerName: default-scheduler
          volumes:
            - name: kube-config
              secret:
                defaultMode: 420
                secretName: kube-config          
  schedule: 30 14 * * *

이렇게 하면 Timebased 의 Scaleup뿐만 아니라 ScaleDown도 가능합니다.