{"id":"IL-0002","org":"Zalando","date":"2019-06-11","docs":["https://github.com/jtblin/kube2iam","https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/","https://github.com/zalando-incubator/kubernetes-on-aws/pull/2247"],"title":{"en":"CI builder pods could not get AWS IAM credentials because kubelet fell minutes behind its API rate limit","ko":"빌더 파드가 노드 한 대에 몰리자 kubelet 이 기본 API QPS 한도에 막혀 파드 상태를 늦게 갱신했고, CI 빌드가 AWS IAM 자격 증명을 받지 못해 실패했다"},"domain":["kubernetes","aws"],"impact":{"scope":"builds on the in-house Continuous Delivery Platform (CDP)","users":"unknown","region":"unknown"},"review":{"written_by":"session","reviewed_at":null,"reviewed_by":null},"lessons":null,"related":[],"sources":[{"url":"https://github.com/zalando-incubator/kubernetes-on-aws/blob/dev/docs/postmortems/jun-2019-kubelet-qps.md","kind":"github","license":"unknown","archived":"http://web.archive.org/web/20260221140254/https://github.com/zalando-incubator/kubernetes-on-aws/blob/dev/docs/postmortems/jun-2019-kubelet-qps.md"}],"summary":{"en":"kubelet limits how many requests per second it sends to the Kubernetes API server, and the default limit (--kube-api-qps, 5) is extremely low. After a rescale of the CDP cluster left a single node for all builder pods, the rapid creation and deletion of pods on that node outran what kubelet could report within the limit, and pod status updates fell minutes behind. kube2iam could not see the IP addresses of new builder pods, so the pods got no AWS IAM credentials and builds timed out.\n\nThe cluster was scaled up by hand so builder pods spread over more than one node, which stopped the failures. As the permanent fix, the kubelet QPS limit was raised from the default 5 to 50 in the global cluster configuration.","ko":"Zalando 는 CDP 라는 사내 CI/CD 플랫폼을 직접 만들어 운영한다. 2019년 6월 11일 CDP 빌드가 한 시간 가까이 타임아웃으로 실패했다. 쿠버네티스 빌더 파드가 AWS IAM 자격 증명을 받지 못했기 때문이다. 파드가 자격 증명을 받으려면 kube2iam 이 파드 IP 를 알아야 하고, 파드 IP 는 배정된 노드의 kubelet 이 설정한다.\n\nkubelet 기본 설정은 API 서버로 보내는 요청에 아주 낮은 속도 제한을 건다. 클러스터 규모가 조정되면서 공교롭게도 빌더 파드가 쓸 수 있는 노드가 한 대만 남았다. 그 노드에서 파드가 빠르게 만들어지고 지워지자 kubelet 이 밀렸다. kubelet 의 파드 상태 갱신이 몇 분씩 늦어졌다. 팀은 우선 피해를 멈추려고 클러스터를 수동으로 늘려 빌더 파드가 여러 노드에 흩어지게 했다. 영구 조치로 전역 클러스터 설정에서 kubelet QPS 를 기본값 5 에서 50 으로 올렸다."},"trigger":{"en":"An unlucky rescaling of the CDP Kubernetes cluster left only one node available for builder pods. Builder pods were created and deleted on that node so quickly that kubelet fell behind.","ko":"CDP 쿠버네티스 클러스터의 규모가 조정되면서 공교롭게도 빌더 파드가 쓸 수 있는 노드가 한 대만 남았다. 그 노드에서 파드가 빠르게 생성되고 삭제되자 kubelet 이 따라가지 못했다."},"severity":"unknown","symptoms":["high-error-rate","credentials-unavailable","control-plane-slow"],"timeline":{"detected_after":null,"resolved_after":null},"date_kind":"incident","detection":null,"components":["kubelet","credential-broker","kube-apiserver","ci-system"],"root_cause":"capacity","remediation":[{"text":{"en":"Scaled the CDP cluster up by hand so builder pods spread over more than one node","ko":"클러스터를 수동으로 늘려 빌더 파드가 노드 한 대가 아니라 여러 대에 흩어지게 했다."}}],"action_items":[{"text":{"en":"Raise the kubelet QPS limit from the default 5 to 50 in the global cluster configuration","ko":"전역 클러스터 설정으로 kubelet QPS 를 기본값 5 에서 50 으로 올렸다."}}],"contributing":["default-config-unchanged","single-point-of-failure"],"recurrence_of":null,"symptoms_text":{"en":"Builds on Zalando's in-house Continuous Delivery Platform (CDP), which runs CI/CD on Kubernetes, timed out and failed for almost an hour on 11 June 2019. The Kubernetes builder pods could not get AWS IAM credentials.\n\nkube2iam hands out IAM credentials to pods and needs each pod's IP address to do so. The kubelet on the node sets that address in the pod status, but kubelet was several minutes late in updating pod statuses, so the builder pods waited for credentials until their builds timed out.","ko":"2019년 6월 11일, Zalando 가 직접 만들어 운영하는 CI/CD 플랫폼인 CDP 의 빌드가 한 시간 가까이 타임아웃으로 실패했다.\n\n빌드가 실패한 이유는 쿠버네티스 빌더 파드가 AWS IAM 자격 증명을 받지 못해서였다. 파드가 자격 증명을 받으려면 kube2iam 이 그 파드의 IP 주소를 알아야 한다. 파드 IP 는 배정된 노드의 kubelet 이 설정하는데, kubelet 의 파드 상태 갱신이 몇 분씩 늦어졌다."},"updated_at":"2026-11-10T00:00:31.257292Z","url":"https://benchlet.com/incidentlib/app/cases/IL-0002","org_slug":"zalando"}