이 프로젝트 는 API 또는 콘솔을 통한 EC2 유지 관리 이벤트 , EC2 스팟 중단 , ASG Scale-In , ASG AZ 재조정 및 EC2 인스턴스 종료 와 같이 EC2 인스턴스를 사용할 수 없게 만들 수 있는 이벤트에 Kubernetes 컨트롤 플레인이 적절하게 응답하도록 합니다. . 처리하지 않으면 애플리케이션 코드가 정상적으로 중지되지 않거나 전체 가용성을 복구하는 데 시간이 더 오래 걸리거나 중단되는 노드에 대한 작업을 실수로 예약할 수 있습니다. - https://github.com/aws/aws-node-termination-handler
EKS 환경에서 Karpenter를 도입하여 인프라를 운영하고자 할때, 많이 고민하는 부분중에 하나가 Spot EC2를 사용하고자 하는 요구사항에 부딫히게 됩니다.
카펜터는 워크로드가 중단될 수 있는 이벤트들에 대해서 감시합니다.
카펜터는 각종 워크로드가 중단 될 수 있는 이벤트에 대해서 감시하지만, 아직까지는 Spot Rebalance Recommendations
에 대해서는 지원하지 않습니다.
Note
Karpenter publishes Kubernetes events to the node for all events listed above in addition to Spot Rebalance Recommendations.
Karpenter does not currently support cordon, drain, and terminate logic for Spot Rebalance Recommendations. - karpenter docs
AWS NTH를 사용하여 Spot Rebalance Recommendations
에 대한 이벤트를 수신하여 운영에 적용할 수 있습니다.
Spot Rebalance Recommendations
신호는 스팟 인스턴스 중단 2분 전 공지보다 일찍 도착할 수 있으므로 스팟 인스턴스를 사전에 관리할 수 있는 기회를 제공합니다.
중단 위험이 높아지지 않는 신규 또는 기존 스팟 인스턴스에 대한 워크로드를 리밸런싱하도록 결정할 수 있습니다.
스팟 종료 이벤트에 보다 민감하게 반응하여 새로운 워크로드를 생성하여 인프라를 관리할 수 있습니다.
본 블로그에서는 IMDS 프로세서를 통해 배포하는 방법만을 기술하였습니다.
Instance Metadata Service Processor
각각의 Spot 인스턴스에 aws-node-termination-handler
를 Daemonset
으로 배치하여 인스턴스의 수명 주기와 같이 관리합니다.
Queue Processor
출처 - awsdocs
Spot 이벤트를 감지하는 파드를 여러개 배치하여 AWS의 SQS와 연동해 인스턴스의 수명주기를 관리합니다.
Yaml과 Helm 차트를 이용하여 두가지 방법을 통해 AWS NTH를 배포할 수 있습니다.
kubectl apply -f https://github.com/aws/aws-node-termination-handler/releases/download/v1.20.0/all-resources.yaml
export CHART_VERSION=0.22.0
echo $CHART_VERSION
aws ecr-public get-login-password \
--region us-east-1 | helm registry login \
--username AWS \
--password-stdin public.ecr.aws
helm upgrade --install aws-node-termination-handler \
--namespace kube-system \
-f values.yaml \
oci://public.ecr.aws/aws-ec2/helm/aws-node-termination-handler --version $CHART_VERSION
# values.yaml
# Create node OS specific daemonset(s). (e.g. "linux", "windows", "linux windows")
targetNodeOs: linux
# K8s DaemonSet update strategy.
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
# enableSpotInterruptionDraining If false, do not drain nodes when the spot interruption termination notice is received. Only used in IMDS mode.
enableSpotInterruptionDraining: true
# enableScheduledEventDraining If false, do not drain nodes before the maintenance window starts for an EC2 instance scheduled event. Only used in IMDS mode.
enableScheduledEventDraining: true
# enableRebalanceMonitoring If true, cordon nodes when the rebalance recommendation notice is received. Only used in IMDS mode.
enableRebalanceMonitoring: true
# enableRebalanceDraining If true, drain nodes when the rebalance recommendation notice is received. Only used in IMDS mode.
enableRebalanceDraining: true
# deleteSqsMsgIfNodeNotFound If true, delete the SQS Message from the SQS Queue if the targeted node(s) are not found. Only used in Queue Processor mode.
deleteSqsMsgIfNodeNotFound: false
daemonsetAffinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "eks.amazonaws.com/compute-type"
operator: NotIn
values:
- fargate
nodeSelector:
"karpenter.sh/capacity-type": spot
"karpenter.sh/initialized": "true"
helm uninstall aws-node-termination-handler --namespace kube-system
Karpenter 공식 문서 FAQ에 따르면, 동일한 이벤트를 처리하는 두 구성 요소에서 발생할 수 있는 충돌 가능성 때문에 AWS node termination handler는 동시에 운영하는 것을 지양하고 있습니다.
아직은 Karpenter가 공식적으로 Spot Rebalance Recommendations
를 지원하지 않으므로 NTH를 병행하여 인프라를 운영하고 있습니다.
Spot 종료 이벤트는 인스턴스가 종료되기 2분전에만 알람이 발생하므로, AWS NTH를 이용하여 예상치 못한 종료에 대비할 수 있습니다.