인프라/시스템 구축

[ AWS ] NTH(Node Termination Handler)

김붕어87 2023. 2. 13. 13:50
반응형
개요
AWS-node-termination-handler를 통해 EKS Cluster Node로 Spot instance가 셧다운될 경우,
다른 Spot instance로 자동 배치될 수 있게 컨트롤할 수 있다.

https://github.com/aws/aws-node-termination-handler

 

 

Spot Instance ?
AWS Spot Instance를 왜 사용해야할까?
장점
      AWS Spot instance는 EC2 인스턴스를 사전 약정 없이 on-demand 가격보다 70 ~90% 저렴한 비용으로,
      이용할 수 있어서 워크로드에 적절하게 배포하여 사용한다면 서버 비용을 크게 절감할 수 있다.
단점
      수요/공급에 비례하여 더 높은 가격을 책정하는 쪽으로 스팟 인스턴스가 할당됨.
            인스턴스가 강제 종료(회수) 될 수 있음. => 리소스 사용불가
       이 부분을 보완할 수 있게 aws-node-termination-handler를 이용하여 회수되기 전에
       다른 Spot instance를 요청하여 미리 배치할 수 있게 구성할 수 있다.

 

spot 사용 조건

 

 

aws-node-termination-handler (NTH)
NTH를 통해 k8s control-plane 이 EC2 관리 이벤트, EC2 Spot/instance 중지, AutoScalingGroup(ASG)의 scale-in AGS AZ를 재조정하거나 하는 등 이벤트에 대응할 수 있어서 (스팟) 인스턴스가 중지되어도 다른 노드가 자동으로 배치될 수 있도록 구성할 수 있음.

Spot Instance가 중지되기 2분 전에 이벤트 메세지가 발생하는데 이를 SQS → EventBridge로 받아서
사전에 신규 SPOT을 띄우고, 중지될 Node의 pod를 다른 노드로 Drain 해준다.

 

  • 아래 AWS > EC2 > 스팟 요청 페이지에서 확인할 수 있음.

 

 

SPOT 적용 절감액 요약 (Comdev)

  • comdev 환경에 spot instance로 사용하면서 절감된 금액을 표시 (on-demand 대비 )

 

 

 

 

 

 

 

 

NTH Queue 모드 구성

Components

  • SQS (Amazone Simple Queue Service)
  • AutoScaling Group Termination lifecycle hook
  • Amazon EventBridge Rule
  • IAM Role (NTH가 컨트롤 할 수 있는 )

SQS Queue 구성

## Queue Policy
$ QUEUE_POLICY=$(cat <<EOF
{
    "Version": "2012-10-17",
    "Id": "MyQueuePolicy",
    "Statement": [{
        "Effect": "Allow",
        "Principal": {
            "Service": ["events.amazonaws.com", "sqs.amazonaws.com"]
        },
        "Action": "sqs:SendMessage",
        "Resource": [
            "arn:aws:sqs:${AWS_REGION}:${ACCOUNT_ID}:${SQS_QUEUE_NAME}"
        ]
    }]
}
EOF
)

## make sure the queue policy is valid JSON
$ echo "$QUEUE_POLICY" | jq .

## Save queue attributes to a temp file
$ cat << EOF > /tmp/queue-attributes.json
{
  "MessageRetentionPeriod": "300",
  "Policy": "$(echo $QUEUE_POLICY | sed 's/\"/\\"/g' | tr -d -s '\n' " ")"
}
EOF

$ aws sqs create-queue --queue-name "${SQS_QUEUE_NAME}" \
--attributes file:///tmp/queue-attributes.json

{
    "QueueUrl": "https://sqs.ap-southeast-1.amazonaws.com/xxx/nthqueue"
}

 

 

 

note-termination role 생성

 

 

 

ASG Termination Lifecycle Hook 구성

aws autoscaling put-lifecycle-hook \
  --lifecycle-hook-name=terminate-lc-hook \
  --auto-scaling-group-name=eks-infra-node-group-xxx \
  --lifecycle-transition=autoscaling:EC2_INSTANCE_TERMINATING \
  --default-result=CONTINUE \
  --heartbeat-timeout=300 \
  --notification-target-arn arn:aws:sqs:ap-southeast-1:xxx:nthqueue \
  --role-arn arn:aws:iam::xxx:role/nth-notification-role

aws autoscaling put-lifecycle-hook \
  --lifecycle-hook-name=launch-lc-hook \
  --auto-scaling-group-name=eks-infra-node-group-xxx \
  --lifecycle-transition=autoscaling:EC2_INSTANCE_LAUNCHING \
  --default-result=CONTINUE \
  --heartbeat-timeout=300 \
  --notification-target-arn arn:aws:sqs:ap-southeast-1:xxx:nthqueue \
  --role-arn arn:aws:iam::xxx:role/nth-notification-role

 

 

인스턴스 Tagging

key=aws-node-termination-handler/managed 가 있어야 함.

PODs용 IAM Role 생성

  • IAM Role Name : irsa-aws-node-termination-handler
  • 아래 권한 정책 생성(aws-node-termination-handler) 후 연결.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "autoscaling:CompleteLifecycleAction",
                "autoscaling:DescribeAutoScalingInstances",
                "autoscaling:DescribeTags",
                "ec2:DescribeInstances",
                "sqs:DeleteMessage",
                "sqs:ReceiveMessage"
            ],
            "Resource": "*"
        }
    ]
}

 

 

 

install by helm

❯ helm install aws-node-termination-handler . -f values-queue.yaml -n kube-system 
NAME: aws-node-termination-handler
LAST DEPLOYED: Thu Dec  1 22:55:02 2022
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
***********************************************************************
* AWS Node Termination Handler                                        *
***********************************************************************
  Chart version: 0.20.1
  App version:   1.18.1
  Image tag:     public.ecr.aws/aws-ec2/aws-node-termination-handler:v1.18.1
  Mode :         IMDS
***********************************************************************
반응형