Ssoon

[5주차] EKS Autoscaling - Scaling App and Cluster - USE FIS TO INTERRUPT A SPOT INSTANCE 본문

AWS EKS Workshop Study

[5주차] EKS Autoscaling - Scaling App and Cluster - USE FIS TO INTERRUPT A SPOT INSTANCE

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

스팟 인스턴스 사용자가 묻는 한 가지 질문은 spot instances 가 종료되고 용량이 사용 가능한 pools 의 다른 인스턴스로 교체될 때 애플리케이션에 성능 저하 또는 문제가 발생하는 경우 자격을 갖추도록 인스턴스 종료의 영향을 reproduce 할 수 있는 방법입니다.


AWS Fault Injection Simulator (FIS) 를 사용하여 Amazon EC2 Spot Instances 중단을 트리거하는 실험을 생성하고 실행합니다.

스팟 인스턴스를 사용할 때는 중단될 것을 대비해야 합니다.

FIS를 사용하면 인스턴스를 종료하기 전에 워크로드의 복원력을 테스트하고 애플리케이션이 EC2가 전송하는 중단 알림에 반응하는지 확인할 수 있습니다.

개별 Spot Instances 또는 clusters 의 인스턴스 하위 집합을 대상으로 지정할 수 있습니다(예: ASG, EC2 Fleet, EKS 등 인스턴스에 태그를 지정하는 서비스에서 관리하는 인스턴스).


What do you need to get started?

  • FIS로 스팟 중단을 시작하기 전에 먼저 experiment template 을 만들어야 합니다. 여기서 중단할 리소스(targets)와 인스턴스를 중단할 시기를 정의합니다.

  • 인스턴스를 중단하는 데 필요한 최소한의 권한이 있는 IAM 역할(FISSpotRole)과 스팟 중단을 트리거하는 데 사용할 experiment template(FISExperimentTemplate) 을 생성하는 CloudFormation 템플릿을 만듭니다.
export FIS_EXP_NAME=fis-karpenter-spot-interruption
cat <<EoF > fis-karpenter.yaml
AWSTemplateFormatVersion: 2010-09-09
Description: FIS for Spot Instances
Parameters:
  InstancesToInterrupt:
    Description: Number of instances to interrupt
    Default: 1
    Type: Number

  DurationBeforeInterruption:
    Description: Number of minutes before the interruption
    Default: 3
    Type: Number

Resources:

  FISSpotRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
        - Effect: Allow
          Principal:
            Service: [fis.amazonaws.com]
          Action: ["sts:AssumeRole"]
      Path: /
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action: 'ec2:DescribeInstances'
                Resource: '*'
              - Effect: Allow
                Action: 'ec2:SendSpotInstanceInterruptions'
                Resource: 'arn:aws:ec2:*:*:instance/*'

  FISExperimentTemplate:
    Type: AWS::FIS::ExperimentTemplate
    Properties:       
      Description: "Interrupt a spot instance with EKS label intent:apps"
      Targets: 
        SpotIntances:
          ResourceTags: 
            IntentLabel: apps
          Filters:
            - Path: State.Name
              Values: 
              - running
          ResourceType: aws:ec2:spot-instance
          SelectionMode: !Join ["", ["COUNT(", !Ref InstancesToInterrupt, ")"]]
      Actions: 
        interrupt:
          ActionId: "aws:ec2:send-spot-instance-interruptions"
          Description: "Interrupt a Spot instance"
          Parameters: 
            durationBeforeInterruption: !Join ["", ["PT", !Ref DurationBeforeInterruption, "M"]]
          Targets: 
            SpotInstances: SpotIntances
      StopConditions:
        - Source: none
      RoleArn: !GetAtt FISSpotRole.Arn
      Tags: 
        Name: "${FIS_EXP_NAME}"

Outputs:
  FISExperimentID:
    Value: !GetAtt FISExperimentTemplate.Id
EoF
  • InstancesToInterrupt parameter 를 사용하여 중단할 인스턴스 수를 구성할 수 있습니다. 템플릿에서는 하나의 인스턴스를 중단하도록 정의되어 있습니다.
  • DurationBeforeInterruption parameter 를 사용하여 실험을 실행할 시간을 구성할 수도 있습니다. 기본적으로 2분이 소요됩니다. 즉, 실험을 시작하자마자 인스턴스는 2분 후 스팟 중단 경고 알림을 받게 됩니다.
  • 가장 중요한 섹션은 experiment template 의 대상입니다. 리소스 태그 아래에는 실험에 intent: apps 으로 레이블을 지정한 EKS 노드 중에서만 선택하도록 지시하는 IntentLabel: apps가 있습니다. 이 레이블로 실행 중인 인스턴스가 두 개 이상 있는 경우 중단할 인스턴스가 무작위로 선택됩니다.

FIS로 EC2 Spot 중단 실험 생성

  • 다음 명령을 실행하여 템플릿에서 FIS 실험을 생성합니다.
aws cloudformation create-stack --stack-name $FIS_EXP_NAME --template-body file://fis-karpenter.yaml --capabilities CAPABILITY_NAMED_IAM
aws cloudformation wait stack-create-complete --stack-name $FIS_EXP_NAME

Spot 중단 실험 실행

  • 다음 명령을 실행하여 스팟 중단 실험을 ​​실행합니다.
FIS_EXP_TEMP_ID=$(aws cloudformation describe-stacks --stack-name $FIS_EXP_NAME --query "Stacks[0].Outputs[?OutputKey=='FISExperimentID'].OutputValue" --output text)
FIS_EXP_ID=$(aws fis start-experiment --experiment-template-id $FIS_EXP_TEMP_ID --no-cli-pager --query "experiment.id" --output text)
  • 몇 초 후에 실험이 완료됩니다. 이는 인스턴스 중 하나가 2분 동안 인스턴스 중단 알림을 받았으며 종료된다는 의미입니다. 실험을 실행하면 실험 상태를 확인할 수 있습니다:

aws fis get-experiment --id $FIS_EXP_ID --no-cli-pager
  • 실험이 성공적으로 완료되면 다음과 같은 응답이 표시됩니다.

  • 상태가 "running" 중으로 표시되면 몇 초 동안 기다렸다가 명령을 다시 실행합니다.
  • spot 인스턴스가 중지되고 다시 시작되는 과정을 아래와 같이 확인 할 수 있습니다.

 

 

Comments