IL-0101 Wealthy · 2025-09-14kubernetesgcp
Wealthy 의 GKE 클러스터는 노드 풀 자동 업그레이드를 꺼 둔 상태였다. 그러나 쓰던 버전의 지원 종료 기한이 오자 Google 이 컨트롤 플레인을 v1.32.x 에서 v1.33.2 로 강제로 올렸다. 기존 노드는 계속 돌았지만, 그 뒤 새로 만든 노드는 v1.32 든 v1.33 이든 모두 제대로 초기화되지 않았다. 새 노드에서는 NodeLocalDNS 가 크래시 루프에 빠졌다. netd 가 초기화되지 않아 파드 네트워킹이 안 됐고, CSI 드라이버 문제로 영구 볼륨 마운트가 실패했으며, 시스템 ConfigMap 마운트도 실패했다.
중요한 백그라운드 워커를 비용 때문에 스팟 인스턴스에 많이 올려 두어서 피해가 컸다. 스팟 노드가 선점되면 새 노드가 클러스터에 들어오지 못했고, 워커가 하나씩 사라지면서 서비스가 점점 나빠졌다. 일반 인스턴스도 같은 문제를 겪어 새 노드가 필요한 워크로드는 전부 멈췄다. 백그라운드 작업 처리, 리포트 생성, 주문 할당과 처리가 멈췄다. 클러스터는 GKE 지원 기한에 가까운 버전이었고, GCP 안에는 넘어갈 대기 클러스터가 없었다. 개발 클러스터는 다른 클라우드에 있었다.
파드와 노드 재시작, 노드 버전 롤백, NodeLocalDNS 애드온 끄고 켜기, 노드 풀 재생성을 모두 해 봤지만 새 노드는 초기화되지 않았다. 팀은 강제 업그레이드와 같은 v1.33 으로 새 GKE 클러스터를 만들고 모든 운영 워크로드를 옮겼다. 이 과정에서 쿠버네티스 1.33 에 맞추려면 Istio 를 1.27.1 로 올리고 cert-manager 도 갱신해야 한다는 것을 알게 됐다. 장애는 모두 15시간 이어졌다.
2025년 9월 14일, 이미 떠 있던 노드는 계속 돌았지만 새로 만들어지는 노드는 하나도 클러스터에 제대로 들어오지 못했다. 스팟 인스턴스에서 돌던 백그라운드 워커, 리포트 서비스, 주문 할당 시스템이 완전히 멈췄다. API 는 기존 노드에서 계속 응답했지만 부하가 늘어도 확장할 수 없었다.
새 노드에서는 시스템 파드가 줄줄이 실패했다. NodeLocalDNS 파드는 크래시 루프에 빠졌고, 네트워크 플러그인 netd 는 초기화하지 못해 파드 네트워킹이 되지 않았다. CSI 드라이버가 초기화되지 않아 영구 볼륨이 마운트되지 않았고, 중요한 시스템 ConfigMap 도 마운트에 실패했다. API 서버 연결 오류도 보였다.
CSI node-driver-registrar 는 07:11:29에 /csi/csi.sock 으로 gRPC 연결을 열려고 했다. 로그에는 그 뒤 10초마다 "Still connecting to unix:///csi/csi.sock" 이 이어졌고, 07:11:59에 "error connecting to CSI driver: context deadline exceeded" 로 끝났다.
스팟 노드가 선점되어 다시 만들어질 때마다 클러스터에 돌아오지 못해 서비스가 점점 더 나빠졌다. 일반 인스턴스도 마찬가지여서 노드 오토스케일링이 모두 실패했다. 새 노드는 v1.32 로 만들어도 v1.33 으로 만들어도 똑같이 실패했다.
처음에는 실패한 파드와 노드를 재시작해 봤지만 효과가 없었다. 노드 버전을 되돌려도 새 노드는 여전히 초기화되지 않았다. NodeLocalDNS 애드온을 껐다가 다시 켜 보려 했는데, 끄기는 됐지만 DNS 조회가 느려졌고 다시 켜기는 "Error: INVALID_ARGUMENT: Node pool "t2d-64gb-standard" requires recreation" 으로 실패했다. 노드 풀을 다시 만들어도 같은 초기화 문제로 실패했고, 팀은 클러스터 손상을 되돌릴 수 없다고 결론 내렸다.
원인 ? 업그레이드로 깨진 호환성
–
Google 은 자동 업그레이드를 꺼 두어도 버전 지원 종료 기한이 되면 컨트롤 플레인을 강제로 올린다. 강제 업그레이드를 피하려면 지원 버전 범위 안에 머물러야 한다. 기존 노드가 멀쩡해도 새 노드 초기화는 완전히 실패할 수 있다. 선점된 스팟 노드가 클러스터에 돌아오지 못하면 장애가 연쇄로 번진다. 컨트롤 플레인을 올린 뒤 노드 초기화가 되돌릴 수 없게 망가지면 클러스터를 통째로 다시 만들어야 할 수도 있다. 예측할 수 있고 검증된 릴리스 주기를 원하면 GKE stable 채널을 쓴다. 쿠버네티스를 올릴 때는 Istio, cert-manager 같은 의존 구성 요소를 함께 맞춰야 한다. 같은 클라우드에 대기 클러스터가 없으면 바로 넘어갈 곳이 없다. SRE 가 롤아웃을 단계적으로 관리하면 업그레이드 위험이 줄어든다.
같은 원인 · 공통 GKE 컨트롤 플레인
같은 원인 · 공통 클라이언트 쪽 DNS 리졸버와 캐시