{"id":"IL-0107","org":"DFDS","date":"2022-08-03","docs":[],"title":{"en":"Kyverno stuck in a crash loop behind a webhook with failurePolicy fail blocked every change to Kubernetes Service objects for 88 minutes","ko":"오래된 Kyverno 가 서드파티 인증서 체인 만료로 크래시 루프에 빠졌고, failurePolicy 가 fail 인 웹훅이 응답하지 않아 Service 리소스의 생성, 수정, 삭제가 88분 동안 막혔다."},"domain":["kubernetes"],"impact":{"scope":"create, update and delete of Service resources in all non-exempted namespaces of one production Kubernetes cluster","users":"end-user teams deploying to the affected cluster","region":"unknown"},"review":{"written_by":"session","reviewed_at":null,"reviewed_by":null},"lessons":{"en":"Operational issues should be added to the 'Ops Day to Day' board from the start.","ko":"운영 문제는 처음부터 'Ops Day to Day' 보드에 올려야 한다."},"related":[],"sources":[{"url":"https://github.com/dfds/postmortems/blob/master/PM2022-008%20-%20CRUD%20operations%20on%20K8s%20Service%20resources%20unavailable.md","kind":"github","license":"unknown","archived":null}],"summary":{"en":"DFDS runs Kyverno, a policy engine for Kubernetes, with a ClusterPolicy whose admission webhook checks Service resources. Kyverno had not been kept up to date because of a code freeze. When a certificate chain expired in a third-party application, Kyverno got stuck in a crash loop. The ClusterPolicy's failurePolicy was left at the default, fail, so with the webhook unresponsive the Kubernetes API server rejected Service operations instead of letting them through, in every namespace that was not exempted. With failurePolicy set to ignore, the postmortem says, the issue would not have occurred.\n\nThe platform team started looking at the report at 11:50 UTC, identified the issue at 12:08 and reproduced it in a sandbox cluster at 12:18. The fix was to update Kyverno to a newer Helm chart version; it went into the sandbox first and reached the affected production cluster at 13:06. At 13:25 the user team confirmed that it worked. The postmortem gives 12 minutes to detection and 88 minutes to recovery.\n\nThe postmortem also lists that Kyverno went into production too early, without monitoring and without enough communication and coordination beforehand, that the problem had been raised but was not on the 'ops day to day' board, and that the team saw signs of Kyverno not being a mature project.","ko":"2022년 8월 3일 DFDS 의 운영 쿠버네티스 클러스터 하나에서 예외 처리된 네임스페이스를 뺀 모든 곳의 Service 리소스 생성, 수정, 삭제가 막혔다. 정책 엔진 Kyverno 가 크래시 루프에 빠져 웹훅이 응답하지 않았기 때문이다. Kyverno 는 코드 동결 때문에 최신 버전으로 올리지 못한 상태였다. 문제는 DFDS 가 아무것도 하지 않았는데 서드파티 애플리케이션의 인증서 체인이 만료되면서 시작됐다.\n\nKyverno ClusterPolicy 의 failurePolicy 가 기본값 fail 이어서, 웹훅이 응답하지 않으면 요청이 거부됐다. 이 값이 ignore 였다면 장애는 일어나지 않았다. Kyverno 는 모니터링도 갖추지 않은 채 너무 일찍 운영에 들어갔다. 운영에 넣기 전의 소통과 조율도 부족했다. 문제가 제기되긴 했지만 'Ops Day to Day' 보드에는 올라가지 않았다. Kyverno 가 아직 성숙한 프로젝트가 아니라는 조짐도 장애에 영향을 준 요인으로 꼽혔다.\n\n팀은 샌드박스에서 문제를 재현하고, Kyverno 를 더 새 Helm 차트 버전으로 올리는 수정을 먼저 샌드박스에 적용했다. 13:06 UTC 에 같은 수정을 운영 클러스터에 배포했고, 13:25 UTC 에 사용자 팀이 해결됐다고 알려 왔다. 탐지까지 12분, 복구까지 88분이 걸렸다."},"trigger":{"en":"A certificate chain in a third-party application expired, through no action of DFDS, and the outdated Kyverno installation got stuck in a crash loop.","ko":"서드파티 애플리케이션이 쓰는 인증서 체인이 만료되면서 Kyverno 가 크래시 루프에 빠졌다. DFDS 쪽에서는 아무것도 바꾸지 않았다."},"severity":"unknown","symptoms":["deploys-failing","crash-loop"],"timeline":{"detected_after":"12m","resolved_after":"1h 28m"},"date_kind":"incident","detection":{"en":"An end-user team alerted the platform team at 11:38 UTC that applying a Service resource failed; the platform team started looking into it at 11:50 UTC.","ko":"11:38 UTC 에 한 사용자 팀이 클러스터에 Service 리소스를 적용하지 못한다고 알려 오면서 장애가 드러났다. 팀은 11:50 UTC 에 조사를 시작했고, 보고서는 탐지까지 걸린 시간을 12분으로 적었다."},"components":["policy-engine","admission-webhook"],"root_cause":"certificate-expiry","remediation":[{"text":{"en":"reproduced the issue in a sandbox cluster and deployed the fix there first","ko":"쿠버네티스 샌드박스에서 문제를 재현하고, Kyverno 를 더 새 Helm 차트 버전으로 올리는 수정을 샌드박스에 먼저 배포했다."}},{"text":{"en":"updated Kyverno to a newer Helm chart version in the affected production cluster","ko":"13:06 UTC 에 같은 수정을 영향받은 운영 클러스터에 배포했다."}}],"action_items":[{"text":{"en":"Implement monitoring on Kyverno","ko":"Kyverno 를 모니터링 대상에 넣는다."}},{"text":{"en":"Create internal documentation on the Kyverno setup","ko":"Kyverno 를 어떻게 구성했는지 내부 문서로 정리한다."}},{"text":{"en":"Investigate the exact certificate issue in the third-party application","ko":"애플리케이션의 인증서에서 정확히 무엇이 문제였는지 조사한다."}},{"text":{"en":"Consider changing the failurePolicy on ClusterPolicy resources going forward","ko":"앞으로 ClusterPolicy 리소스의 failurePolicy 를 바꿀지 검토한다."}}],"contributing":["skipped-upgrades","default-config-unchanged","monitoring-blind-spot","early-signal-ignored"],"recurrence_of":null,"symptoms_text":{"en":"At 11:38 UTC on 3 August 2022 an end-user team told the platform team that applying a Service resource to one of the Kubernetes clusters failed.\n\nOperations on Service resources (the postmortem calls them CRUD operations) failed in every namespace except the exempted ones, because the webhook that checks them did not respond. Kyverno, the policy engine that serves that webhook, was stuck in a crash loop.","ko":"2022년 8월 3일 11:38 UTC 에 한 사용자 팀이 해당 쿠버네티스 클러스터에 Service 리소스를 적용하는 데 문제가 있다고 알려 왔다.\n\n예외 처리된 네임스페이스를 뺀 모든 네임스페이스에서 Service 리소스를 만들거나 고치거나 지울 수 없었다. 웹훅이 응답하지 않았고, 웹훅 요청을 처리하는 Kyverno 는 크래시 루프에 빠져 있었다.\n\n팀은 11:50 UTC 에 조사를 시작해 12:08 UTC 에 원인을 찾았다. 12:18 UTC 에는 쿠버네티스 샌드박스에서 같은 문제를 재현했다."},"updated_at":"2026-11-10T00:00:33.479796Z","url":"https://benchlet.com/incidentlib/app/cases/IL-0107","org_slug":"dfds"}