Ssoon

[5주차] EKS Autoscaling - KARPENTER - EC2 SPOT DEPLOYMENTS 본문

AWS EKS Workshop Study

[5주차] EKS Autoscaling - KARPENTER - EC2 SPOT DEPLOYMENTS

구구달스 2023. 5. 25. 12:20
CloudNet@ 팀의 AWS EKS Workshop Study 5주차 정리입니다.
# Karpenter Workshop 의 내용입니다.

Karpenter는 애플리케이션의 요구 사항과 클러스터의 가용성을 고려하여 Spot 인스턴스를 적절하게 사용하여 리소스를 할당하고 파드를 배치합니다.

EC2 Spot Deployments를 사용하면 애플리케이션을 보다 비용 효율적으로 실행할 수 있습니다. Karpenter는 Spot 인스턴스의 가용성과 가격을 모니터링하고, Spot 인스턴스의 가격이 허용 가능한 범위 내에 있을 때 애플리케이션을 Spot 인스턴스에 배치합니다. 이를 통해 AWS의 저렴한 리소스를 활용하여 비용을 절감할 수 있습니다.


  • EC2 Spot 을 사용할 때 카펜터는 다양한 인스턴스 목록을 선택하고 price-capacity-optimized 전략을 사용하여 Spot 종료 빈도를 줄이는 데 최적이면서 배치 대기 중인 pending pods 의 낭비를 줄이는 데 이상적인 EC2 Spot pools 을 선택합니다.
  • 현재 rebalancing recommendation 을 지원하지 않으므로 rebalancing recommendation signals 를 정상적으로 처리하도록 node termination handler 를 설정합니다. 이 구성을 지원하기 위해 default 프로비저너를 사용합니다.

Spot Interruptions은 어떻게 작동하나요?

사용자가 pool 에서 pool 이 고갈될 때까지 On-Demand 인스턴스를 요청하면 시스템은 pool 에서 종료할 Spot Instances 집합을 선택합니다. Spot Instance pool 은 인스턴스 유형(예: m5.large), 운영 체제, 가용 영역 및 네트워크 플랫폼이 동일한 미사용 EC2 instances 집합입니다. Spot Instances 에는 2분 전에 중단 알림이 전송되어 정상적으로 종료됩니다.

Amazon EC2가 용량을 다시 필요로 할 때(또는 스팟 가격이 요청에 대한 최대 가격을 초과할 때) Spot Instance가 종료됩니다. 최근에는 Spot Instance 가 인스턴스 rebalance recommendations 도 지원합니다. Amazon EC2는 인스턴스 rebalance 권장 신호를 전송하여 스팟 인스턴스가 중단될 위험이 높다는 것을 알려줍니다. 이 신호는 2분 동안 Spot Instance interruption 알림을 기다릴 필요 없이 기존 또는 새로운 Spot Instance 전반에서 워크로드의 균형을 사전에 rebalance 할 수 있는 기회를 제공합니다.


Karpenter and Spot Interruptions

  • Karpenter는 기본적으로 EventBridge 를 통해 Spot Interruption Notifications 으로 채워진 SQS 대기열에서 이벤트를 소비하여 Spot Interruption Notifications 을 처리합니다.
  • 카펜터가 Spot Interruption Notifications 을 수신하면 실행 중인 모든 파드의 중단된 노드를 정상적으로 비우는 동시(drain)에 해당 파드가 신속하게 스케줄링할 수 있는 새 노드를 프로비저닝합니다.

  • Karepnter는 아직 Rebalance Recommendation signals 를 지원하지 않으므로 이러한 신호를 캡처하고 노드를 정상적으로 종료 처리하기 위해 AWS Node Termination Handler 라는 프로젝트를 배포할 수 있습니다.
  • Node termination handler Queue Mode Instance Metadata Mode 의 두 가지 모드로 작동합니다.
  • Instance Metadata Mode 를 사용하는 경우, aws-node-termination-handler 는 각 호스트에서 (DaemonSet)으로 실행되는 작은 파드로 Instance Metadata Service 를 모니터링합니다.
  • DaemonSet 은 /spot 및 /events와 같은 IMDS 경로를 모니터링하고 그에 따라 해당 노드를 drain 및/또는 cordon 합니다.

  • 이 워크샵에서는 Karpenter의 기본 Spot Interruption handling 를 사용하므로 Node-Termination-Handler 를 배포하지 않습니다.
  • 그러나 Rebalance Recommendation signals 를 처리해야 하는 경우 Node-Termination-Handler 가 필요하며 Karpenter의 Spot Interruption Handling 를 통해 안전하게 실행할 수 있습니다.

Create a Spot Deployment

cat <<EOF > inflate-spot.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: inflate-spot
spec:
  replicas: 0
  selector:
    matchLabels:
      app: inflate-spot
  template:
    metadata:
      labels:
        app: inflate-spot
    spec:
      nodeSelector:
        intent: apps
        karpenter.sh/capacity-type: spot
      containers:
      - image: public.ecr.aws/eks-distro/kubernetes/pause:3.2
        name: inflate-spot
        resources:
          requests:
            cpu: "1"
            memory: 256M
EOF
kubectl apply -f inflate-spot.yaml

  • EventBridge > Rules


Spot replicas 수를 2로 늘립니다.

kubectl scale deployment inflate-spot --replicas 2

  • inflate-spot deploy 를 2개의 replicas 로 확장하는 것에 대한 응답으로 프로비저닝된 spot 노드를 확인합니다.
kubectl get node --selector=intent=apps -L kubernetes.io/arch -L node.kubernetes.io/instance-type -L karpenter.sh/provisioner-name -L topology.kubernetes.io/zone -L karpenter.sh/capacity-type


Spot replicas 수를 0로 변경합니다.

kubectl scale deployment inflate-spot --replicas 0

 

 

Comments