쿠버네티스 Auto Scaling

log.yunsik·2022년 3월 24일
0
post-custom-banner

VPA

Kubernetes에서 지원하는 autoscaler로 파드에 대한 CPU 및 메모리를 자동으로 조정할 수 있게 지원한다. VPA를 사용하기 위해서는 메트릭 서버를 클러스터에 설치해 놓아야 한다.
https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler/hack 에 vpa-up.sh를 실행하여 VPA를 클러스터에 배포한다.

설치하게 될 경우 kube-system 네임스페이스에 VPA파드들이 설치된다.

파드가 조정이 필요한 경우 vpa-updater가 업데이트된 값으로 파드를 다시 시작한다.
반영되는데 꽤 많은 시간이 소요되었다.
테스트 결과 limit이 걸려있는 파드는 조정하지 못했다.

참고자료

HPA

파드의 수를 리소스 사용률에 따라 자동으로 조정한다.
HPA를 사용하기 위해선 메트릭 서버가 설치되어 있어야 한다.

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

# 최소 1개에서 최대 10개의 파드로 배포에 대해 50%의 사용률을 달성하려는 autoscaler가 생성된다.

리소스의 사용량과 파드의 최소 최대 크기를 명시해줘야한다.

kubectl get hpa

참고자료

CA

파드가 실패하거나 다른 노드로 예약될 때 클러스터의 노드 수를 자동으로 조정한다.
kubernetes에서 제공하는 오픈소스이지만 클라우드와 연동되어 작동하기 때문에 몇가지 사전 조건이 필요하다.
다음 조건은 AWS 기준이다.

  • 클러스터 OIDC 공급자 생성
  • Auto Scaling 태그 지정
  • IAM 정책 및 역할 생성

kubernetes에 올라와있는 yaml파일을 다운받아 몇가지 커스텀해서 클러스터에 배포하면 된다.
https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
자동으로 노드를 Scale out하고 싶은 경우에는 HPA와 연동하여 사용하면 된다.

주의사항

  • 정책에 지정된 첫 번째 인스턴스 유형으로 스케줄링한다.
  • 원래 인스턴스 유형보다 리소스가 적은 인스턴스가 있는 경우 파드가 배포되지 않을 수 있다.
  • 원래 인스턴스 유형보다 리소스가 큰 경우 리소스가 낭비될 수 있다.

참고자료

Karpenter

쿠버네티스를 위해 노드를 프로비저닝 해주는 AWS의 오픈소스 프로젝트이다.
CA와 마찬가지로 노드의 사용량에 따라 자동으로 수를 조정해준다.

사전 조건

  • 클러스터 OIDC 공급자 생성
  • IAM 정책 생성
  • Helm 설치

추가적으로 로드벨런스를 노출하기 위해선 CA와 마찬가지로 보안 그룹에 태그를 지정해주어야 한다.

카핀터 설치하기

helm repo add karpenter https://charts.karpenter.sh/
helm repo update


helm upgrade --install --namespace karpenter --create-namespace \
  karpenter karpenter/karpenter \
  --version ${KARPENTER_VERSION} \
  --set serviceAccount.annotations."eks\.amazonaws\.com/role-arn"=${KARPENTER_IAM_ROLE_ARN} \
  --set clusterName=${CLUSTER_NAME} \
  --set clusterEndpoint=${CLUSTER_ENDPOINT} \
  --set aws.defaultInstanceProfile=KarpenterNodeInstanceProfile-${CLUSTER_NAME} \
  --wait # for the defaulting webhook to install before creating a Provisioner

위 코드를 따라 helm차트를 배포한다.

apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
  name: default
spec:
  requirements:
    - key: karpenter.sh/capacity-type
      operator: In
      values: ["spot"]
  limits:
    resources:
      cpu: 1000
  provider:
    subnetSelector:
      karpenter.sh/discovery: ${CLUSTER_NAME}
    securityGroupSelector:
      karpenter.sh/discovery: ${CLUSTER_NAME}
  ttlSecondsAfterEmpty: 30
EOF

쿠버네티스에 Provisioner를 배포해야 한다.

CA와 차이점은 CA의 경우 노드가 증가하거나 늘 때 노드의 수를 조정하는데 karpenter의 경우 JIT방식으로 항상 관찰하고 있다.
JIT방식으로 노드를 관찰하고 있기 때문에 scale 조정이 ca에 비해 매우 빠르다.
karpenter의 가장 큰 장점은 노드의 인스턴스의 크기를 자동으로 조절해준다.
하지만 현재는 AWS에서만 공식적으로 지원하고있다.

post-custom-banner

0개의 댓글