{"id":"IL-0114","org":"CoW Protocol","date":"2024-04-19","docs":["https://twitter.com/CoWSwap/status/1781406819006464111"],"title":{"en":"An unpinned AWS VPC CNI plugin was updated automatically during a capacity expansion, leaving new pods Pending without IP addresses and stopping CoW Protocol settlements for about 3.5 hours","ko":"클러스터 용량을 늘리던 중 버전이 고정되지 않은 VPC CNI 플러그인이 자동으로 업데이트돼 새 파드가 IP 를 받지 못하고 Pending 에 머물렀고, 메인넷 운영 환경의 정산이 약 3.5시간 멈췄다."},"domain":["kubernetes","aws","networking"],"impact":{"scope":"mainnet production environment: core services down and no settlements","users":"unknown","region":"unknown"},"review":{"written_by":"session","reviewed_at":null,"reviewed_by":null},"lessons":{"en":"Versions in IaC scripts should be specified explicitly so an automation run cannot update a component such as the CNI plugin unintentionally. Changes in production need change management that is easy to revert.","ko":"IaC 스크립트에 버전을 명시해야 의도치 않은 업데이트를 막을 수 있다. 운영 환경일수록 쉽게 되돌릴 수 있는 변경 관리가 필요하다."},"related":[],"sources":[{"url":"https://hackmd.io/@fleupold/SkWpH9L-C","kind":"blog","license":"unknown","archived":null}],"summary":{"en":"A change to the liquidity fetching logic of CoW Protocol's baseline liquidity caused a performance regression. Higher memory and CPU use got core services evicted frequently, so the team expanded the capacity of the production Kubernetes cluster. The Infrastructure as Code (IaC) run for that expansion also updated the VPC CNI plugin, the AWS component that gives each pod an IP address from the VPC. The CNI version was not hardcoded in the IaC, package versions were not properly pinned, and the IaC library version had recently changed, so the plugin was updated automatically and the result was a CNI version mismatch.\n\nWith the mismatched CNI, newly deployed pods never received an IP address and stayed Pending, and updates and pod terminations no longer worked. Settlements stopped at 16:40 UTC. The team identified the CNI version mismatch as the cause at 17:03 UTC, started a cluster upgrade around 19:00 UTC, and set up new node groups with a new version of the networking plugin. Services were restored at 20:08 UTC, about 3.5 hours after the outage began.","ko":"2024년 4월 19일 CoW Protocol 은 기본 유동성의 유동성 조회 로직을 바꾼 뒤 성능 회귀를 겪었다. 메모리와 CPU 사용량이 늘어 핵심 서비스가 자주 축출됐다. 팀은 이를 해결하려고 운영 쿠버네티스 클러스터의 용량을 늘렸다.\n\n용량 확장은 IaC 자동화로 이루어졌는데, 이때 VPC CNI 플러그인이 예기치 않게 업데이트됐다. IaC 에 CNI 버전이 고정돼 있지 않았고, 최근 IaC 라이브러리 버전도 바뀐 상태였다. 패키지 버전을 제대로 고정하지 않은 데다 이 변화가 겹쳐 네트워크 리소스가 자동으로 업데이트됐다. 호환되는 CNI 버전이 없어서 새로 배포된 파드는 IP 주소를 받지 못해 Pending 에 머물렀고, 업데이트와 파드 종료도 막혔다. 재시작하는 파드마다 Pending 에 걸리면서 시스템은 점점 더 쓸 수 없게 됐다.\n\n장애는 16:40 UTC 에 정산이 멈추면서 시작됐다. 팀은 17:03 UTC 에 CNI 버전 불일치를 원인으로 찾았다. 19:00 UTC 쯤에는 클러스터 업그레이드를 시작해 새 버전의 네트워크 플러그인을 쓰는 노드 그룹을 새로 만들었다. 서비스는 20:08 UTC 에 돌아왔다. 메인넷 운영 환경은 약 3.5시간 멈췄고 그동안 정산이 이루어지지 않았다."},"trigger":{"en":"During a cluster capacity expansion, the Infrastructure as Code automation updated the AWS VPC CNI plugin, because the CNI version was not hardcoded in the IaC and the IaC library version had recently changed.","ko":"클러스터 용량을 늘리는 IaC 자동화가 돌면서, IaC 에 버전이 고정되지 않은 VPC CNI 플러그인이 자동으로 업데이트됐다."},"severity":"unknown","symptoms":["pod-pending","no-available-ip","pods-evicted","service-unavailable"],"timeline":{"detected_after":null,"resolved_after":"3h 28m"},"date_kind":"incident","detection":{"en":"The CNI version mismatch was identified as the cause at 17:03 UTC, 23 minutes after settlements stopped.","ko":"장애는 16:40 UTC 에 정산이 멈추면서 시작됐다. 팀은 23분 뒤인 17:03 UTC 에 CNI 버전 불일치를 원인으로 짚었다."},"components":["vpc-cni","node-pool"],"root_cause":"config-change","remediation":[{"text":{"en":"upgraded the Kubernetes cluster","ko":"19:00 UTC 쯤 쿠버네티스 클러스터 업그레이드를 시작했다."}},{"text":{"en":"set up new node groups with a new version of the networking plugin","ko":"새 버전의 네트워크 플러그인을 쓰는 노드 그룹을 새로 만들었다."}}],"action_items":[],"contributing":["unpinned-version","overlapping-failures"],"recurrence_of":null,"symptoms_text":{"en":"At 16:40 UTC on 19 April 2024 CoW Protocol's mainnet production environment stopped producing settlements; the outage officially began then.\n\nCore services had already been evicted often, because a change to the liquidity fetching logic of the baseline liquidity had raised memory and CPU use. After the networking plugin was updated, every restarted pod stayed in Pending because it could not get an IP address, so each restart left the system less available than before. Updates and pod terminations stopped working as well.","ko":"2024년 4월 19일 16:40 UTC 에 메인넷 운영 환경에서 정산이 멈췄다. 핵심 서비스가 내려가 있었다.\n\n그 전부터 성능 회귀 때문에 메모리와 CPU 사용량이 늘어 핵심 서비스가 자주 축출되고 있었다. 팀은 이를 해결하려고 클러스터 용량을 늘리던 참이었다.\n\n용량을 늘리는 과정에서 CNI 가 의도치 않게 업데이트된 뒤로는 파드가 재시작할 때마다 Pending 상태에 머물렀다. 새로 배포된 파드는 IP 주소를 받지 못했고, 업데이트와 파드 종료도 되지 않았다. 시스템은 점점 더 쓸 수 없는 상태가 됐다. 팀은 17:03 UTC 에 CNI 버전 불일치를 원인으로 짚었다."},"updated_at":"2026-11-09T11:55:46.682239Z","url":"https://benchlet.com/incidentlib/app/cases/IL-0114","org_slug":"cow-protocol"}