IL-0404 PortSwigger · 2024-10-24kubernetesaws
Karpenter 가 운영 EKS 노드를 Bottlerocket v1.26.0 으로 바꾼 뒤 BSEE SaaS 고객 인스턴스의 파드가 모두 crash loop back off 에 빠졌다
2024년 10월 16일 Bottlerocket 저장소의 기본 브랜치에 PR-158 이 머지됐다. 이 변경은 모든 서비스에 기본 보안 설정 MemoryDenyWriteExecute=yes 를 넣었다. 이 설정은 쓰기와 실행이 함께 가능한 메모리를 막는다. 10월 24일 02:00 에 이 PR 을 담은 v1.26.0 이 나왔고, AWS 는 02:00 부터 04:30 사이 eu-west-1 에서 v1.26.0 을 최신 Bottlerocket AMI 로 내놓았다. 04:00 에 Karpenter 가 새 버전을 알아채고 운영 EKS 클러스터의 EC2 노드 갱신을 시작했다. 이 설정 때문에 Java 처럼 JIT 컴파일에 기대는 애플리케이션이 실행되지 못했다. systemd 문서도 이 옵션이 JIT 실행 엔진처럼 실행 중에 코드를 만드는 프로그램과 맞지 않는다고 분명히 적고 있다.
04:45 에 SaaS 가용률 지표가 크게 떨어졌지만, 기술팀이 장애를 안 것은 08:07 Growth 팀의 채널 메시지와 08:15 Product 팀원의 구두 알림 뒤였다. 기술팀은 파드 로그의 오류를 보고 OS 문제를 의심했다. EC2 노드가 05:33 에 갱신됐고 OS 가 v1.26.0 이라는 것을 확인한 뒤, Bottlerocket 저장소에서 Issue 4260 을 찾았다. 기술팀은 SaaS 운영 계정의 EC2 인스턴스를 모두 v1.25.0 으로 되돌리기 시작했고, 09:15 에 고객 인스턴스가 다시 올라왔다. 모든 고객이 3시간 45분 동안 영향을 받았고, 지원 문의는 1건이었으며 고객 데이터 손실은 없었다.
- 심각도
- –
- 영향 범위
- Every BSEE SaaS customer instance was unavailable and showed the Environment Unavailable message; one support case was raised and no customer data was lost
- 영향 사용자
- all BSEE SaaS customers
- 지역
- eu-west-1
- 감지까지
- –
- 복구까지
- 3h 45m
증상
2024년 10월 24일 BSEE SaaS 고객 인스턴스가 모두 Environment Unavailable 메시지를 띄웠다. 04:45 에 SaaS Uptime Over Time 지표의 가용률이 크게 떨어졌고, 08:07 에 Growth 팀이 장애를 채널에 알렸다.
고객의 Kubernetes 파드는 모두 crash loop back off 상태였다. 로그에는 keystore 를 만드는 createKeystore 명령 직후 "Error occurred during initialization of VM" 과 "Failed to mark memory page as executable - check if grsecurity/PaX is enabled" 가 찍혔고, init-enterprise-server-keystore 컨테이너의 스트림이 "Stream closed EOF" 로 닫혔다.
기술팀은 오류 문구를 보고 OS 문제를 의심했다. AWS EC2 콘솔에서 EC2 노드가 05:33 에 갱신됐고 그 뒤 워크로드가 새 노드로 옮겨간 것을 확인했다. OS 버전이 v1.26.0 인 것을 보고 Bottlerocket GitHub 저장소를 찾아, Java 기반 애플리케이션을 v1.26.0 에서 돌릴 때의 호환성 문제를 다룬 Issue 4260 을 찾았다.
원인
- 촉발
- 2024년 10월 24일 eu-west-1 에 Bottlerocket v1.26.0 이 최신 AMI 로 나오자, Karpenter 가 이를 알아채고 04:00 부터 운영 EKS 클러스터의 EC2 노드를 새 버전으로 바꾸기 시작했다.
감지
04:45 에 SaaS Uptime Over Time 지표의 가용률이 크게 떨어졌다. 08:07 에 Growth 팀이 BSEE cloud onboarding issues 채널에 장애를 알렸고, 08:15 에 Product 팀원이 기술팀에 구두로 알렸다.
조치
- 기술팀이 SaaS 운영 계정의 EC2 인스턴스를 모두 Bottlerocket v1.25.0 으로 되돌리기 시작했고, 09:15 에 고객 인스턴스가 다시 올라와 서비스가 복구됐다.
- 모든 EKS 클러스터에 Bottlerocket 1.25.0 을 배포하고 새 EKS 노드로 교체했다.
후속 조치
- Karpenter 리소스를 바꿔 최신 AMI 대신 버전을 고정한 Bottlerocket AMI 를 배포하게 했다. 이 방식은 기술팀의 유지 보수 부담을 늘리고 중요한 보안 패치 배포를 늦출 수 있다.
- Bottlerocket 릴리스 ATOM 피드를 내부 도구 릴리스 대시보드에 넣었다.
- 고객에게 투명하게 알리는 공개 상태 페이지를 만든다.
교훈
–
출처
참고 문서
- https://github.com/bottlerocket-os/bottlerocket-core-kit/pull/158
- https://github.com/bottlerocket-os/bottlerocket/releases/tag/v1.26.0
- https://github.com/bottlerocket-os/bottlerocket/issues/4260
- https://github.com/bottlerocket-os/bottlerocket/issues/4253
- https://github.com/bottlerocket-os/bottlerocket/releases/tag/v1.25.0
- https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html
관련 사례
IL-0120클라우드 GPU 서버의 정기 OS 업데이트가 systemd-networkd 를 재시작해 자체 네트워크 에이전트와 충돌했고, 많은 GPU 노드의 라우트가 모두 지워져 ChatGPT 와 API 의 오류율이 크게 올랐다.OpenAI · 2025같은 원인 · 공통 노드 운영체제 이미지
IL-0079GKE 노드가 새 ubuntu_containerd 이미지로 자동 업그레이드된 뒤 커널에서 kube-proxy 가 쓰는 iptables 확장이 빠져, 여러 GKE 클러스터의 인그레스 트래픽이 완전히 끊겼다.Altinity · 2025같은 원인 · 공통 노드 운영체제 이미지
IL-0198systemd 보안 패치가 Ubuntu 22.04 노드의 systemd-networkd 를 재시작해 Cilium 이 넣은 IP 규칙을 지웠고, 여러 리전과 세 클라우드의 Kubernetes 노드가 한꺼번에 네트워크를 잃었다.Datadog · 2023같은 원인 · 공통 노드 운영체제 이미지
같은 원인 · 공통 노드 운영체제 이미지
IL-0144Ubuntu 18.04 의 systemd 보안 업데이트가 DNS 설정을 날려 AKS 노드의 kubelet 이 레지스트리 이름을 해석하지 못하고 파드가 ImagePullBackoff 에 빠졌다.Microsoft Azure · 2022같은 원인 · 공통 노드 운영체제 이미지
같은 원인 · 공통 노드 운영체제 이미지
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0404
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0404/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.