{"id":"IL-0081","org":"Cresta","date":"2025-03-05","docs":[],"title":{"en":"API requests timed out during deployment rollouts because the ingress-nginx enable-serial-reloads option held back endpoint updates while a long NGINX reload was running","ko":"ingress-nginx 의 enable-serial-reloads 옵션이 NGINX 리로드 중에 엔드포인트 동적 갱신을 막아, 배포 중 트래픽이 이미 없는 파드로 가면서 API 요청이 타임아웃됐다."},"domain":["kubernetes","networking"],"impact":{"scope":"API requests through the NGINX Ingress controller during deployment rollouts","users":"unknown","region":"unknown"},"review":{"written_by":"session","reviewed_at":null,"reviewed_by":null},"lessons":{"en":"A flag meant only to serialise full reloads also delayed endpoint updates, which opened a window during rollouts in which the ingress routed to pods that no longer existed. Options that change how the ingress controller applies configuration need to be checked against what happens to endpoint updates during a long reload.","ko":"자원 소모를 막으려고 켠 무해해 보이는 플래그 하나가, 라우팅이 실제 배포 상태와 어긋나는 구간을 만들 수 있다. 엔드포인트 동적 갱신이 리로드에 묶이면 배포 중 트래픽이 사라진 파드로 간다."},"related":[],"sources":[{"url":"https://lorenzhw.substack.com/p/our-last-kubernetes-ingress-production","kind":"blog","license":"unknown","archived":null}],"summary":{"en":"Cresta runs the NGINX Ingress controller in front of its Kubernetes services. NGINX applies big configuration changes with a full reload, which starts new worker processes and drains the old ones, and applies backend endpoint changes dynamically inside the running workers without a reload.\n\nCresta had enabled enable-serial-reloads, which allows only one full reload at a time so that a burst of configuration changes does not start too many worker processes. The intended behaviour is that endpoint updates still go through immediately. Because of a bug, while workers are reloading the controller returns an error early and stops all processing, so dynamic endpoint updates wait until the running reload has finished. During a rollout this meant traffic could be sent to outdated or terminated pods, and some API requests timed out.\n\nAn engineer restarted the ingress controller while trying to resolve the problem, and an issue was opened in the kubernetes/ingress-nginx project as a result of the incident.","ko":"Cresta 는 클러스터로 들어오는 트래픽을 NGINX Ingress 컨트롤러로 받는다. NGINX 는 설정 변경을 두 가지 방식으로 반영한다. 큰 변경은 전체 리로드로 처리하는데, 마스터 프로세스가 새 설정으로 워커 프로세스를 새로 띄우고 옛 워커를 정상 종료한다. 백엔드 엔드포인트 변경 같은 것은 리로드 없이 기존 워커에 바로 반영하는 동적 설정으로 처리한다.\n\nCresta 는 enable-serial-reloads 옵션을 켜 두었다. 이 옵션은 설정 변경이 연달아 들어올 때 워커 프로세스가 한꺼번에 너무 많이 뜨지 않도록 전체 리로드를 한 번에 하나씩만 하게 한다. 원래 의도대로라면 엔드포인트 변경은 리로드를 기다리지 않고 바로 반영돼야 한다. 하지만 이 옵션에는 버그가 있었다. 워커가 리로드 중이면 컨트롤러가 오류를 내고 모든 처리를 멈췄다. 그래서 진행 중인 리로드가 끝날 때까지 엔드포인트 변경이 반영되지 않았다.\n\n오래 걸리는 리로드가 도는 동안 배포 롤아웃으로 엔드포인트가 바뀌자, 라우팅이 실제 배포 상태를 따라가지 못했다. 트래픽이 이미 종료됐거나 더 이상 유효하지 않은 파드로 갈 수 있었고, 일부 API 요청이 타임아웃됐다. 엔지니어가 문제를 풀려고 Ingress 를 재시작했다. 이 일로 kubernetes/ingress-nginx 에 GitHub 이슈가 열렸다."},"trigger":{"en":"A deployment rollout changed backend endpoints while a long-running NGINX full reload was in progress, with the enable-serial-reloads option enabled on the ingress-nginx controller.","ko":"오래 걸리는 NGINX 전체 리로드가 진행되는 동안 배포 롤아웃으로 백엔드 엔드포인트가 바뀌었다. ingress-nginx 컨트롤러에는 enable-serial-reloads 옵션이 켜져 있었다."},"severity":"unknown","symptoms":["intermittent-timeouts","stale-service-routing","high-latency"],"timeline":{"detected_after":null,"resolved_after":null},"date_kind":"published","detection":null,"components":["ingress"],"root_cause":"software-bug","remediation":[{"text":{"en":"restarted the NGINX Ingress controller as an attempt to resolve the problem","ko":"문제를 풀어 보려고 NGINX Ingress 컨트롤러를 재시작했다."}}],"action_items":[{"text":{"en":"Open an issue in kubernetes/ingress-nginx describing how enable-serial-reloads blocks dynamic endpoint updates","ko":"enable-serial-reloads 가 엔드포인트 동적 갱신을 막는 문제를 kubernetes/ingress-nginx 에 이슈로 올린다."}}],"contributing":[],"recurrence_of":null,"symptoms_text":{"en":"During a deployment, traffic into the Kubernetes cluster started hitting dead ends: some API requests timed out and requests were slow and disrupted while the rollout ran.\n\nEndpoint changes from the rollout were not applied until a running NGINX reload had finished, so requests could be sent to outdated or already terminated pods.","ko":"배포 도중 쿠버네티스로 들어오는 트래픽이 갈 곳을 잃기 시작했다. 일부 API 요청이 타임아웃됐다.\n\n배포 중에 불필요한 지연과 서비스 끊김이 생겼다. 원인을 따라가 보니 Ingress 컨트롤러의 설정 플래그가 문제였다."},"updated_at":"2026-11-10T00:00:31.832878Z","url":"https://benchlet.com/incidentlib/app/cases/IL-0081","org_slug":"cresta"}