1. 들어가며
EKS 노드 운영비용을 줄이기 위해, karpenter에 on-demand:spot 비율로 노드를 생성하게 설정했습니다. 하지만 약 2달간 잘 동작했던 karpenter에서 갑자기 배포가 안되는 장애가 발생했습니다.
이 글은 어떤 원인 때문에 karpenter 장애가 발생했는지 설명합니다. 이 글을 읽기 위해 karpenter on-demand:spot비율 설정을 알아야 합니다. 설정 방법은 저의 이전 글을 참고해주세요.
이 글에서 재현한 장애 예제는 저의 github에 공개되어 있습니다.
2.장애 증상
패치내역을 배포하기 위해 pod 컨테이너 이미지 태그를 업데이트 했습니다. 노드 리소스가 없어 pending pod가 생겼고 karpenter가 노드를 생성하는 것을 기다렸습니다. 하지만, 몇 분을 기다려도 노드가 생성되지 않았습니다.
pod를 describe를 해보니 처음 보는 capacity-spread오류가 보였습니다.
$ kubectl describe pod
unsatisfiable topology constraint for topology spread, key=capacity-spread (counts = 2: 0 1: 1 3: 0 , podDomains = capacity-spread Exists, nodeDomains = capacity-spread In [1]
3. 장애 발생 원인
karpenter가 on-demand:spot를 1:2비율로 노드를 생성하도록 capacity-spread를 설정했습니다. 그런데, 배포문제가 있던 pod는 on-demand만 사용하도록 설정해서 배포 장애가 발생했습니다.
karpenter는 on-demand:spot분배 설정을 하면, on-demand, spot인스턴스를 모두 생성해야 합니다. 하지만 장애가 발생한 pod는 on-demand만 생성하도록 설정했기 때문에 더 이상 karpenter가 노드를 생성하지 못했던 겁니다.
4. 장애 해결방법
해결 방법은 2가지가 있습니다.
- on-demand:spot분배 설정을 제거
- on-demand만 배포하는 새로운 Nodepool를 생성
1번 방법을 선택하면 다른 pod에도 영향이가므로 2번 방법을 선택했습니다.