IL-0008 Jetstack · 2019-09-05 (게시일)kubernetesgcp
Jetstack 은 고객의 멀티테넌트 쿠버네티스 플랫폼을 구축하면서, 기본 쿠버네티스 설정으로 다룰 수 없는 요구를 처리하려고 Open Policy Agent, 줄여서 OPA 를 어드미션 컨트롤러로 쓰기 시작했다. 이 장애는 그 연동 설정이 잘못되어 생겼다.
Jetstack 은 europe-west1 의 GKE 리전 개발 클러스터에서 마스터를 업그레이드하고 있었다. 팀들에게 업그레이드를 미리 알렸고 API 중단은 예상하지 않았다. 같은 날 앞서 다른 사전 운영 환경에서 같은 업그레이드를 마쳤다. GKE 는 첫 번째 마스터 인스턴스 업그레이드를 끝냈고, 나머지 마스터를 업그레이드하는 동안 그 인스턴스가 모든 API 서버 트래픽을 받았다.
두 번째 마스터의 API 서버는 ca-registration PostStartHook 을 실행하지 못했다. 이 훅은 kube-system 의 extension-apiserver-authentication ConfigMap 을 갱신하는데, 설정해 둔 OPA 검증 웹훅의 백엔드가 응답하지 않아 요청이 타임아웃 났다. 이 작업이 끝나야 마스터가 헬스 체크를 통과하므로, 두 번째 마스터는 계속 실패하며 재시작을 반복했고 업그레이드가 멈췄다.
그 결과 API 가 간헐적으로 끊겼고 kubelet 은 노드 상태를 보고하지 못했다. GKE 노드 자동 복구는 약 10분 동안 상태를 보고하지 않는 노드를 비정상으로 보고 다시 만든다. 그래서 모든 노드가 끝없이 재생성됐고 모든 테넌트가 서비스를 쓸 수 없게 됐다. 팀은 웹훅이 원인이라는 것을 찾은 뒤, API 서버에 간헐적으로 접근될 때를 이용해 ValidatingAdmissionWebhook 리소스를 지워 클러스터를 복구했다.
Jetstack 은 europe-west1 에 있는 GKE 리전 클러스터의 마스터를 업그레이드하고 있었다. 이 개발 클러스터는 여러 팀이 낮 동안 앱을 시험하는 데 쓴다. GKE Terraform 파이프라인으로 업그레이드를 시작했는데, 마스터 업그레이드가 20분으로 잡아 둔 Terraform 타임아웃 안에 끝나지 않았다. GKE 콘솔에는 클러스터가 여전히 업그레이드 중으로 나왔다.
파이프라인을 다시 돌리자 다음 오류가 났다: google_container_cluster.cluster: Error waiting for updating GKE master version: All cluster resources were brought up, but the cluster API is reporting that: component "kube-apiserver" from endpoint "gke-..." is unhealthy
그동안 API 서버가 간헐적으로 타임아웃 났고 팀들은 앱을 배포할 수 없었다. 조사를 시작하자 모든 노드가 끝없이 삭제되고 다시 만들어지기 시작했다. 테넌트를 가리지 않고 모두 서비스를 쓸 수 없게 됐다.
Google Support 와 함께 확인해 보니 두 번째 마스터가 계속 실패하며 재시작을 반복해 업그레이드가 멈춰 있었다. API 가 간헐적으로 끊기자 kubelet 이 노드 상태를 보고하지 못했고, GKE 노드 자동 복구가 이 노드들을 고치려고 다시 만들고 있었다.
GKE Terraform 파이프라인으로 시작한 마스터 업그레이드가 20분으로 잡아 둔 Terraform 타임아웃 안에 끝나지 않은 것이 첫 신호였다. 파이프라인을 다시 돌리자 kube-apiserver 가 unhealthy 라는 오류가 났다. 원인은 Google Support 의 도움을 받아 찾았다.
API 서버 응답 시간에 알림을 걸어 두었다면, OPA 웹훅을 처음 배포한 뒤 모든 CREATE 와 UPDATE 요청의 응답 시간이 늘어난 것을 알아챘을 수도 있다.
모든 워크로드에 프로브를 설정하는 것이 중요하다. 팀은 OPA 배포가 너무 간단해 보여서 Helm 차트를 쓰지 않았는데, 그 차트에는 어드미션 컨트롤러 컨테이너의 livenessProbe 를 포함해 튜토리얼 기본 설정에 없는 조정이 여럿 들어 있었다.
노드 자동 복구를 끄는 것도 검토했지만 끄지 않기로 했다. 같은 문제를 겪은 것은 Jetstack 이 처음이 아니며, 관련 업스트림 이슈는 아직 열려 있다.
같은 원인 · 공통 쿠버네티스 API 서버, 어드미션 웹훅
IL-0005 새 텔레메트리 서비스가 모든 노드에서 무거운 쿠버네티스 API 요청을 보내 대형 클러스터의 컨트롤 플레인이 무너졌고, DNS 기반 서비스 디스커버리가 깨져 OpenAI 의 모든 서비스가 멈췄다OpenAI · 2024같은 원인 · 공통 쿠버네티스 API 서버
IL-0118 쿠버네티스 네임스페이스 라벨을 전역으로 바꾸자 네트워크 계층이 메타데이터를 다시 계산하면서 가장 큰 GPU 클러스터들 가운데 세 곳의 컨트롤 플레인이 과부하에 빠졌고, ChatGPT 와 API 가 타임아웃과 503 오류를 냈다.OpenAI · 2024같은 원인 · 공통 쿠버네티스 API 서버
IL-0152 정비 작업 중 FRA1 내부 인프라 클러스터에 잘못된 설정이 들어가 그 위에서 돌던 DOKS 클러스터 200개의 컨트롤 플레인이 자동으로 삭제됐다.DigitalOcean · 2024같은 원인 · 공통 쿠버네티스 API 서버
IL-0153 DOKS 1.27.6-do.0 과 1.28.2-do.0 워커 노드에서 매일 아침 도는 apt 자동 업그레이드가 15분 타임아웃에 걸려 강제 종료되면서 노드 네트워킹이 망가지고, 노드가 사흘 연속 NotReady 가 됐다.DigitalOcean · 2023같은 원인 · 공통 kubelet
https://incidentlib-mcp.benchlet.com/mcpAPI 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.
IL-0068 익명 요청을 허용한 쿠버네티스 API 서버로 공격자가 들어와 RBAC 로 백도어를 만들고, DaemonSet 으로 Monero 채굴기를 모든 노드에 띄웠다.Aqua Security · 2023같은 원인 · 공통 쿠버네티스 API 서버
IL-0061 Terraform 상태 파일이 리뷰 빌드에서 바뀐 데다 권한 차이까지 겹쳐 Terraform 이 운영 GKE 클러스터 세 개 중 두 개를 삭제했다Spotify · 2019같은 원인 · 공통 GKE 컨트롤 플레인