IL-0055 Target · 2018-09-20 (게시일)kubernetes
Target 에서 일했던 발표자가 쿠버네티스 클러스터가 내려간 원인이 된 실수들을 소개했다. 이 사례는 발표자가 가장 흔하게 본 원인으로 꼽은 CronJob 건이다.
CronJob 의 concurrencyPolicy 기본값은 작업을 동시에 실행하도록 허용한다. 그래서 작업이 실패해 재시작하는 동안에도 다음 작업이 새로 만들어졌고, 새 작업이 앞선 작업을 대신하지 않고 나란히 쌓였다. 발표자의 계산으로는 매분 실행되는 작업 하나가 사흘 동안 실패하면 재시작하는 파드가 4320개가 된다. 이 클러스터에서는 파드가 약 4천 개에 이르렀다.
클러스터는 오토스케일링을 쓰고 있어서 파드가 늘어나는 만큼 커졌고, 가상 CPU 수백 개 규모가 됐다. 클러스터는 내려갔고 비용도 크게 들었다.
발표자는 CronJob 의 concurrencyPolicy 를 Replace 나 Forbid 로 정하고, 애플리케이션이 실패를 안전하게 다루도록 만들라고 권했다. init 컨테이너와 readiness 검사, liveness 검사를 쓰고, 데이터베이스 같은 의존 대상이 없을 때는 바로 죽어 재시작을 반복하지 말고 지수 백오프로 정해진 시간 동안 재시도하라고 했다.
CronJob 하나가 계속 실패했다. 실패한 작업이 끝나지 않은 채 다음 작업이 계속 만들어졌고, 재시작을 거듭하는 파드가 수천 개로 쌓였다. 발표자의 계산으로는 매분 실행되는 작업 하나가 사흘 동안 실패하면 재시작하는 파드가 4320개가 된다.
클러스터는 오토스케일링을 쓰고 있어서 파드 수를 따라 커졌다. 파드가 약 4천 개에 이르렀을 때 클러스터의 가상 CPU 는 수백 개까지 늘어 있었고, 비용도 크게 들었다. 결국 클러스터가 내려갔다.
증상 서비스 중단
–
–
–
CronJob 을 배포할 때는 concurrencyPolicy 를 Replace 나 Forbid 로 정한다. 기본값에서는 실패한 작업이 쌓여 한꺼번에 재시작한다. 오토스케일링이 켜진 클러스터에서는 이렇게 늘어난 파드가 그대로 노드 증가와 비용 증가로 이어진다. 발표자는 의존 대상에 연결하지 못할 때 바로 죽어 재시작을 반복하기보다 지수 백오프로 일정 시간 재시도한 뒤 종료하라고 권했다. readiness 검사와 liveness 검사도 쓰라고 했다.
IL-0114 클러스터 용량을 늘리던 중 버전이 고정되지 않은 VPC CNI 플러그인이 자동으로 업데이트돼 새 파드가 IP 를 받지 못하고 Pending 에 머물렀고, 메인넷 운영 환경의 정산이 약 3.5시간 멈췄다.CoW Protocol · 2024같은 원인 · 공통 노드 풀
IL-0019 EKS 모듈 18 업그레이드로 새 노드의 디스크가 20Gb 로 줄어 이미지 풀이 no space left on device 로 실패했다UK Ministry of Justice · 2023같은 원인 · 공통 노드 풀
IL-0017 live 클러스터 노드 6대에서 VPC CNI 가 IP 주소를 할당하지 못해 새 파드가 ContainerCreating 에 멈췄다UK Ministry of Justice · 2023같은 원인 · 공통 노드 풀
IL-0091 Terraform 으로 노드 인스턴스 타입을 바꾸자 노드가 한꺼번에 교체되어 사용자 운영 파드가 모두 지워지고 서비스가 내려갔다UK Ministry of Justice · 2023같은 원인 · 공통 노드 풀
IL-0109 로그 수집을 고치려던 EKS 노드 롤오버가 꼬이면서 Auto Scaling 그룹이 정상 워커 노드를 모두 종료해 클러스터에 노드가 하나도 남지 않았다.DFDS · 2023 · sev1같은 원인 · 공통 노드 풀
https://incidentlib-mcp.benchlet.com/mcpAPI 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.