IL-0070 2i2c · 2023-02-01kubernetesobservability
2i2c가 운영하는 leap 클러스터의 prod 허브에서 일어난 일이다. 사후 보고서는 Prometheus가 노드 약 200대의 메트릭 익스포터를 수집하기 시작하면서 코어 노드에 있던 중요한 파드들이 축출됐다고 본다. Prometheus 서버는 hub 파드와 같은 코어 노드에서 노드 메모리를 거의 다 쓰고 있었다. 보고서 작성자는 이것이 자기 판단이라고 밝혔다. 또 워커가 이만큼 많으면 dask 스케줄러 파드도 리소스 한계에 부딪혔을 가능성이 크지만 확실하지 않다고 덧붙였다.
보고서는 후속 개선으로 이슈와 PR 다섯 개를 연결했다. hub와 proxy 파드의 CPU와 메모리 요청을 넉넉히 잡는 일, OOMKiller 대시보드를 고치는 일, LEAP 인프라를 공유 노드로 옮기는 일, ingress-nginx와 Prometheus의 요청과 한도를 고치는 일, dask 워커 파드를 Prometheus가 수집하는 설정이 필요한지 다시 보는 일이다.
2023년 2월 1일 leap 클러스터의 prod 허브에서 노드가 대량으로 늘었고, hub 파드가 알 수 없는 이유로 재시작됐다. 사용자 지원 티켓도 들어왔다.
ingress-nginx 파드와 proxy 파드는 오래 문제없이 돌고 있었지만 hub 파드는 재시작돼 AGE가 60m이었다. hub 파드가 있던 코어 노드 4대 가운데 두 번째 노드에는 support-prometheus-server 파드가 메모리 요청 20Gi, 한도 22Gi로 떠 있었다. 이 노드의 메모리 요청 합계는 93%, 한도 합계는 124%였다. hub 파드는 CPU 요청 10m, 메모리 요청 128Mi로 떠 있었다.
1분 사이에 노드 100대가 추가됐고, dask-worker 파드에는 FailedScheduling 경고가 쌓였다. 그중 하나는 "0/126 nodes are available: 14 node(s) didn't match Pod's node affinity/selector, 23 Insufficient cpu, 24 Insufficient memory, 6 node(s) had untolerated taint {node.kubernetes.io/network-unavailable: }, 9 node(s) had untolerated taint {hub.jupyter.org_dedicated: user}, 96 node(s) had untolerated taint {node.kubernetes.io/not-ready: }." 였다.
조사한 엔지니어는 kubectl get event -A | grep OOM 으로 OOMKill 여부를 확인하려 했지만, API 서버가 event를 보관하는 60분이 이미 지나 확인하지 못했다. 처음에는 노드 메모리가 부족해 hub 파드가 축출됐다고 봤다. 그런데 hub 파드의 메모리 사용량은 일정했고 응답만 없었다. 그래서 5분 동안 응답이 없어 livenessProbe가 30번 연속 실패했고, 그 때문에 재시작됐을 수도 있다고 봤다. CPU 요청이 10m이라 CPU를 충분히 받지 못했을 가능성도 의심했다.
증상 ? 파드 축출파드 Pending
2i2c Freshdesk에 들어온 사용자 지원 티켓 414로 드러났다. 이후 엔지니어가 Grafana와 클러스터의 노드, event를 살폈다. 조사 내용은 같은 날 UTC+1 기준 저녁 8시에서 9시 사이에 이슈에 정리됐다.
–
Prometheus 서버처럼 메모리를 많이 쓰는 파드가 요청보다 훨씬 많이 쓰면 같은 노드의 중요한 파드가 축출된다. 노드가 한꺼번에 100대 늘면 Prometheus가 수집할 대상도 함께 늘어난다. hub와 proxy처럼 중요한 파드는 실제 사용량보다 요청을 넉넉히 잡아야 축출과 CPU 부족을 피할 수 있다. 쿠버네티스 event는 60분이 지나면 사라지므로, OOMKill 여부를 나중에 확인하려면 따로 기록해 두어야 한다.
같은 원인 · 공통 노드 풀, Prometheus
같은 원인 · 공통 노드 풀
같은 원인 · 공통 노드 풀
같은 원인 · 공통 노드 풀
같은 원인 · 공통 노드 풀
같은 원인 · 공통 노드 풀
같은 원인 · 공통 노드 풀
같은 원인 · 공통 Prometheus
같은 원인 · 공통 Prometheus
같은 원인 · 공통 Prometheus
같은 원인 · 공통 노드 풀
같은 원인 · 공통 Prometheus