DevOps Tasks
[Kubernetes] Karpenter Spot Node 모니터링을 위한 EventBridge 설정 본문
Karpenter는 AWS에서 노드 프로비저닝을 자동화하는 강력한 오픈소스 툴로, 효율적인 자원 관리와 비용 최적화를 위해 Spot 인스턴스를 활용합니다.
하지만 Spot 인스턴스는 가격 변화와 자원 가용성에 따라 중단될 수 있기 때문에 안정적인 서비스 운영을 위해 Spot 인스턴스의 라이프사이클을 모니터링하는 것은 필수적입니다.
AWS EventBridge를 활용하면 Spot 인스턴스와 관련된 이벤트를 실시간으로 모니터링하고 적절한 대응을 자동화할 수 있습니다.
이 글에서는 `aws.ec2`와 `aws.ec2fleet` 두 가지 이벤트 소스를 결합하여 Karpenter 노드의 Spot 인스턴스를 효과적으로 모니터링하는 방법을 설명합니다.
자세한 AWS EventBridge 에 대한 글은 아래를 참고하시면 됩니다.
EventBridge를 활용한 Spot 인스턴스 모니터링 개요
Spot 인스턴스 모니터링을 위해 설정할 주요 소스와 이벤트 타입은 다음과 같습니다.
`aws.ec2` Source
이 Source는 개별 Spot 인스턴스와 관련된 주요 이벤트를 제공합니다.
- 모니터링할 이벤트 타입
{
"source": ["aws.ec2"],
"detail-type": ["EC2 Spot Instance Interruption Warning"]
}
`EC2 Spot Instance Interruption Warning`
AWS에서 Spot 인스턴스를 종료할 예정임을 사전 경고.
최대 2분의 대응 시간을 제공하며 서비스 장애를 예방하는 데 매우 중요.
`aws.ec2fleet` Source
Spot Fleet 또는 EC2 Fleet과 관련된 이벤트를 제공합니다.
Karpenter는 EC2 Fleet을 활용하지 않더라도 Spot 인스턴스와 유사한 이벤트를 사용할 수 있습니다.
- 모니터링할 이벤트 타입 및 크리티컬 서브타입
{
"source": ["aws.ec2fleet"],
"detail-type": ["EC2 Fleet State Change", "EC2 Fleet Instance Change", "EC2 Fleet Information", "EC2 Fleet Error"],
"detail": {
"$or": [{
"sub-type": ["deleted_terminating"]
}, {
"sub-type": ["expired"]
}, {
"sub-type": ["terminated"]
}, {
"sub-type": ["termination_notified"]
}, {
"sub-type": ["launchSpecUnusable"]
}, {
"sub-type": ["fleetProgressHalted"]
}, {
"sub-type": ["iamFleetRoleInvalid"]
}, {
"sub-type": ["spotInstanceCountLimitExceeded"]
}, {
"sub-type": ["spotFleetRequestConfigurationInvalid"]
}]
}
}
상태 변경 (State Change)
- `deleted_terminating` : Fleet 요청이 삭제되면서 인스턴스 종료가 진행 중인 상태.
- `expired` : Fleet 요청이 만료된 상태.
인스턴스 변경 (Instance Change)
- `terminated` : Spot 인스턴스가 종료된 상태.
- `termination_notified` : Spot 인스턴스가 스케일 다운 또는 목표 용량 조정을 위해 종료될 예정임.
정보 (Information)
- `launchSpecUnusable` : 시작 사양이 유효하지 않아 Spot 인스턴스를 시작할 수 없는 상태.
- `fleetProgressHalted` : 모든 시작 사양이 유효하지 않아 Fleet 진행이 중단된 상태.
오류 (Error)
- `iamFleetRoleInvalid` : EC2 Fleet에 필요한 IAM 권한이 유효하지 않음.
- `spotInstanceCountLimitExceeded` : 인스턴스 한도를 초과함.
- `spotFleetRequestConfigurationInvalid` : Fleet 요청의 구성이 유효하지 않음.
특정 sub-type만 모니터링하는 이유
`aws.ec2fleet` 소스의 모든 sub-type 이벤트를 모니터링하는 대신, 운영에 직접적인 영향을 미치는 크리티컬 이벤트에만 집중하는 이유는 다음과 같습니다
운영 효율성
- 중요 이벤트에 집중: `active` , `submitted` 와 같은 정보성 이벤트는 시스템 안정성에 영향을 주지 않아 모니터링 대상에서 제외.
- 효율적인 관리: 불필요한 알림을 줄여 중요한 경고에 더 빠르게 대응 가능.
크리티컬 이벤트에 집중
- 서비스 가용성 관련: `deleted_terminating` , `expired, terminated`는 리소스 종료와 관련되어 가용성에 직접적 영향을 미침.
- 사전 경고 및 오류 관리
- `termination_notified` : Spot 인스턴스 종료를 사전에 알림.
- `launchSpecUnusable` , `iamFleetRoleInvalid` : 프로비저닝 실패나 Fleet 설정 오류를 나타냄.
비용 및 리소스 최적화
- 비용 절감: 불필요한 데이터 처리와 저장을 줄여 모니터링 비용 절감.
- 시스템 안정성: 처리량을 줄여 모니터링 시스템의 성능 유지.
알림 피로 방지
- 중요 알림 우선: 과도한 알림을 줄여 운영팀이 더 빠르게 문제를 인지하고 대응 가능.
Spot 모니터링 이벤트의 중요성
각 이벤트는 운영 안정성을 위해 반드시 모니터링해야 할 이유가 있습니다.
EC2 Spot Instance Interruption Warning
- Spot 인스턴스가 AWS 리소스 부족이나 가격 변동으로 인해 종료될 때 사전 경고를 제공.
- Karpenter의 노드가 중단되기 전에 새로운 노드를 프로비저닝하거나 워크로드를 재분배할 수 있는 기회를 제공.
termination_notified
- Fleet 스케일 다운 또는 목표 용량 조정으로 인해 Spot 인스턴스가 종료될 때 발생.
- 노드 종료로 인해 워크로드가 중단되지 않도록 미리 대비 가능.
Fleet 관련 오류 및 정보
- `launchSpecUnusable` , `fleetProgressHalted` : Fleet 구성 문제로 인해 인스턴스를 프로비저닝하지 못하는 상태.
- `iamFleetRoleInvalid` , `spotFleetRequestConfigurationInvalid` : Fleet 요청이 실행되지 않는 크리티컬 오류.
- 이러한 이벤트를 통해 Fleet 구성을 사전에 점검하고 장애를 예방 가능.
EventBridge로 Spot 모니터링 최적화
AWS EventBridge를 통해 위 이벤트들을 실시간으로 모니터링하며 필요한 경우 자동화된 대응을 설정할 수 있습니다.
- 구성 방법:
- `aws.ec2`와 `aws.ec2fleet` 이벤트 소스를 각각 설정.
- 위의 JSON 패턴을 기반으로 이벤트 필터링 규칙 생성.
- Lambda, SNS, 또는 AWS Step Functions와 연계하여 이벤트 발생 시 알림 또는 자동 복구 프로세스 실행.
- 사용 사례:
- Spot 인스턴스 종료 경고 발생 시, Karpenter를 통해 새로운 노드를 프로비저닝.
- Fleet 구성 오류 발생 시, 알림을 통해 운영자가 문제를 즉시 확인.
- 만료된 Fleet 요청을 정리하여 리소스 낭비 방지.
결론
Spot 인스턴스는 비용 최적화의 핵심 전략이지만, 특유의 휘발성으로 인해 안정적인 운영을 위해 정교한 모니터링이 요구됩니다.
AWS EventBridge를 활용해 `aws.ec2` 및 `aws.ec2fleet` 기반의 크리티컬 이벤트 필터링을 구성하면 Karpenter의 Spot 노드를 효율적으로 관리하며, 장애 예방 및 자동화된 복구 프로세스를 구축할 수 있습니다.
'Kubernetes' 카테고리의 다른 글
AWS Fargate에서 Pod Disruption Budget(PDB)로 OS 패치 대응하기 (0) | 2024.12.03 |
---|---|
[Kubernetes] AWS EKS에서 Kubernetes Pod별 보안 그룹 설정: 네트워크 보안 강화 (0) | 2024.12.03 |
[Kubernetes] Karpenter 를 이용한 EKS 노드 그룹 관리 (0) | 2024.12.01 |
[Kubernetes] EKS CoreDNS 및 Kubelet 통신 문제 (0) | 2024.11.30 |
Kubernetes 에서 Finalizer로 인한 리소스 삭제 지연 처리 방법 (1) | 2024.09.28 |