{"id":"IL-0019","org":"UK Ministry of Justice","date":"2023-09-18","docs":[],"title":{"en":"An EKS Terraform module upgrade shrank node root disks from 100 GB to 20 GB and image pulls failed with no space left on device","ko":"EKS 모듈 18 업그레이드로 새 노드의 디스크가 20Gb 로 줄어 이미지 풀이 no space left on device 로 실패했다"},"domain":["kubernetes","aws"],"impact":{"scope":"Several nodes in the cluster ran short of disk space; deployments might not be scheduled consistently and might fail","users":"unknown","region":"unknown"},"review":{"written_by":"session","reviewed_at":null,"reviewed_by":null},"lessons":{"en":"The write-up lists review actions rather than lessons. They aim at two gaps: the launch template changes brought by a module upgrade were not compared or drift-tested before rollout, and there were no CNI or ipamd logs or alerts to show the IP prefix starvation the team suspected during the drain.","ko":"이 글은 교훈 대신 후속 조치를 적었다. 조치를 보면 팀에는 빈틈이 두 가지 있었다. 하나는 모듈 업그레이드가 바꾼 런치 템플릿을 배포 전에 비교하지도, 드리프트 테스트로 잡지도 않은 것이다. 다른 하나는 drain 중 팀이 의심한 IP 접두사 부족을 확인할 CNI 와 ipamd 로그도, 알림도 없었던 것이다."},"related":["IL-0017"],"sources":[{"url":"https://runbooks.cloud-platform.service.justice.gov.uk/incidents/2023-09-18-lack-of-diskspace.html","kind":"runbook","license":"unknown","archived":"http://web.archive.org/web/20260712181416/https://runbooks.cloud-platform.service.justice.gov.uk/incidents/2023-09-18-lack-of-diskspace.html"}],"summary":{"en":"On 18 September 2023 the Ministry of Justice Cloud Platform team upgraded its EKS Terraform module to version 18. The new module version changed the node launch template so that new nodes got a 20 GB root volume instead of 100 GB. As workloads were drained onto the new nodes, several nodes ran short of disk space, image pulls failed with \"no space left on device\", and numerous pods were in the Evicted and ContainerStateUnKnown states.\n\nAt 15:34 the team uncordoned the old default node group and at 15:35 started draining the new nodes to move workloads back. The incident was repaired at 17:54, 4h 12m after the first alert. On 19 September the team validated the fix and worked through the launch template changes, and on 20 September applied the fix to the manager cluster and then the live cluster and started draining the old node group again.\n\nThat second drain ran into pod IP allocation: more pods sat in ContainerCreating, with \"failed to assign an IP address to container\" ENI errors, which the team thought might be IP prefix starvation that eases as draining the old nodes frees prefixes. At 19:18 on 20 September all nodes were drained, no pods were in an error state and the disk space issue was resolved; the write-up gives the time to resolve as 35h 36m. The review actions cover comparing launch template changes during module upgrades, drift tests on the launch template, image pull tests at realistic sizes, a disk space configuration check in the RootVolUtilisation alert runbook, scaling CoreDNS with the number of nodes, IPv6 as a way out of prefix starvation, and logging and alerts for the CNI and ipamd.","ko":"2023-09-18, UK Ministry of Justice 의 Cloud Platform 팀은 EKS 모듈을 버전 18 로 올리고 노드를 새 노드 그룹으로 옮기고 있었다. 이 변경으로 런치 템플릿이 바뀌면서 새 노드의 디스크가 100Gb 에서 20Gb 로 줄었다. 여러 노드에서 디스크가 모자라 이미지 풀이 no space left on device 로 실패했고, Evicted 나 ContainerStateUnKnown 상태의 파드도 여럿 보였다.\n\n팀은 15:34 에 예전 기본 노드 그룹을 uncordon 하고, 15:35 부터 새 노드를 drain 해 워크로드를 예전 노드 그룹으로 되돌렸다. 17:54 에 복구됐고, 첫 감지부터 4시간 12분이 걸렸다. 다음 날 팀은 런치 템플릿 변경 내용을 검토해 고칠 곳을 찾았고, 9월 20일 manager 클러스터에 먼저, 이어서 live 클러스터에 수정을 적용했다.\n\n수정한 노드로 옮기려고 예전 노드 그룹을 drain 하는 동안 ContainerCreating 에 머무는 파드가 늘었고, 팀은 IP 접두사가 모자란 탓일 수 있다고 봤다. 19:18 에 모든 노드의 drain 이 끝나고 오류 상태의 파드가 없어지면서 장애가 종료됐다. 종료까지는 35시간 36분이 걸렸다."},"trigger":{"en":"Upgrading the EKS Terraform module to version 18, which changed the node launch template, and draining workloads onto the new nodes it created.","ko":"EKS 모듈을 버전 18 로 올리면서 런치 템플릿이 바뀌었고, 새 노드의 디스크가 100Gb 에서 20Gb 로 줄었다."},"severity":"unknown","symptoms":["node-disk-full","image-pull-failures","pods-evicted","pod-stuck-container-creating","no-available-ip"],"timeline":{"detected_after":null,"resolved_after":"4h 12m"},"date_kind":"incident","detection":{"en":"The RootVolUtilisation-Critical alert fired in the high-priority alerts channel at 13:42, and a user reported \"no space left on device\" image pull errors at 14:03.","ko":"13:42 에 High-priority-alert 채널로 RootVolUtilisation-Critical 알림이 왔다. 14:03 에 사용자가 이미지 풀 실패를 보고했고, 장애 선언은 15:12 였다."},"components":["node-disk","launch-template","node-pool","vpc-cni","coredns"],"root_cause":"config-change","remediation":[{"text":{"en":"Uncordoned the old default node group and drained the new nodes to move workloads back","ko":"예전 기본 노드 그룹을 uncordon 하고, 새 노드를 drain 해 워크로드를 예전 노드 그룹으로 되돌렸다."}},{"text":{"en":"Identified the launch template change that cut the root volume to 20 GB and applied a fix on the manager and live clusters","ko":"루트 볼륨을 20Gb 로 줄인 런치 템플릿 변경을 찾아, manager 클러스터와 live 클러스터에 수정을 적용했다."}},{"text":{"en":"Drained the old node group onto the fixed nodes","ko":"예전 노드 그룹을 drain 해 워크로드를 수정한 노드로 옮겼다."}}],"action_items":[{"text":{"en":"Update the runbook to compare launch template changes during an EKS module upgrade","ko":"EKS 모듈을 올릴 때 런치 템플릿 변경을 비교하는 절차를 런북에 넣는다."}},{"text":{"en":"Create a test setup that pulls images of different sizes, like live","ko":"live 클러스터처럼 크기가 다양한 이미지를 받아 보는 테스트 환경을 만든다."}},{"text":{"en":"Update the RootVolUtilisation alert runbook to check the disk space configuration","ko":"RootVolUtilisation 알림 런북에 디스크 크기 설정을 확인하는 단계를 넣는다."}},{"text":{"en":"Scale CoreDNS dynamically based on the number of nodes","ko":"노드 수에 따라 CoreDNS 를 자동으로 늘리고 줄인다."}},{"text":{"en":"Investigate whether IPv6 can solve the IP prefix starvation problem","ko":"IP 접두사 부족을 IPv6 로 풀 수 있는지 조사한다."}},{"text":{"en":"Add drift testing to identify when a terraform plan shows a change to the launch template","ko":"terraform plan 에서 런치 템플릿이 바뀌면 알아챌 수 있게 드리프트 테스트를 추가한다."}},{"text":{"en":"Set up logging for the CNI and ipamd logs and alerts on errors related to IP prefix starvation","ko":"CNI 와 ipamd 로그를 볼 수 있게 로깅을 갖추고, IP 접두사 부족 오류가 나면 알림을 보낸다."}}],"contributing":["review-missed","no-config-tests","no-alert-on-limit"],"recurrence_of":null,"symptoms_text":{"en":"At 13:42 the RootVolUtilisation-Critical alert fired in the high-priority alerts channel. At 14:03 a user reported image pull errors with the message \"no space left on device\".\n\nThe team was in the middle of upgrading the EKS Terraform module to version 18 and draining nodes. At 14:27 numerous pods were in the Evicted and ContainerStateUnKnown states, and the write-up notes that deployments might not be scheduled consistently and might fail. At 15:26 the team compared the disk allocated to an old node with that of a new node and found the new node had only 20 GB.\n\nThe second attempt two days later showed a different symptom. While the old node group was being drained on 20 September, more pods than usual sat in ContainerCreating at 15:04, and at 15:25 there were many \"failed to assign an IP address to container\" ENI errors. The CNI logs said \"Unable to get IP address from CIDR: no free IP available in the prefix\". The team read this as IP prefix starvation that eased as draining the old nodes freed prefixes.","ko":"2023-09-18 13:42, 팀은 High-priority-alert 채널에서 RootVolUtilisation-Critical 알림을 봤다. 14:03 에는 한 사용자가 이미지 풀이 no space left on device 오류로 실패한다고 알렸다.\n\n그때 팀은 EKS 모듈을 버전 18 로 올리면서 노드를 drain 하고 있었다. 14:27 에는 Evicted 와 ContainerStateUnKnown 상태의 파드가 여럿 보였다. 클러스터의 여러 노드에서 디스크가 모자라, 배포가 노드에 고르게 스케줄되지 않거나 실패할 수 있었다.\n\n15:26 에 팀이 예전 노드와 새 노드에 할당된 디스크 크기를 비교해 보니, 새 노드에는 20Gb 만 할당돼 있었다.\n\n9월 20일 팀이 고친 설정을 적용하고 예전 노드 그룹을 drain 하는 동안에는 다른 증상이 나타났다. 15:04 에 ContainerCreating 상태의 파드가 늘었고, 15:25 에는 \"failed to assign an IP address to container\" eni 오류가 늘었다. CNI 로그에는 Unable to get IP address from CIDR: no free IP available in the prefix 가 찍혔다. 팀은 IP 접두사가 모자란 탓으로 봤고, 예전 노드를 drain 하면 접두사 일부가 풀려날 것으로 판단했다."},"updated_at":"2026-11-10T00:00:37.123630Z","url":"https://benchlet.com/incidentlib/app/cases/IL-0019","org_slug":"uk-ministry-of-justice"}