В kubelet 1.36 была утечка памяти. В EKS её закрыли раньше релиза 1.36.3

В Kubernetes 1.36 нашли регрессию в kubelet: при синхронизации подов startPodSync создавал новый отменяемый Go-контекст, но мог перезаписать сохранённый cancelFn, не вызвав предыдущую функцию. Такие контексты оставались связанными с родительским и постепенно накапливались.[1]

Проблема затрагивает upstream kubelet 1.36.0–1.36.2.[1:1][2] Она не обязана быть видна в kubectl top pods: тот показывает потребление контейнеров, а kubelet — процесс на самой ноде.[1:2] Надёжнее смотреть метрику kubelet process_resident_memory_bytes на каждой ноде.[1:3]

В исходном инциденте профиль памяти показал почти миллион удерживаемых cancelable contexts после восьми дней работы; основной путь удержания проходил через podWorkers.UpdatePod.[1:4] Исправление было принято в Kubernetes и отдельно перенесено в ветку release-1.36 для патч-релиза.[2:1]

Что важно для EKS

Есть две разные даты исправления:

EKS AMI kubeletVersion Статус исправления
1.36.2-20260709 и последующие AMI с kubelet 1.36.2 v1.36.2 AWS cherry-pick’нул фикс #139823: версия осталась 1.36.2, но код уже исправлен.[3]
1.36.3-20260827 и позднее v1.36.3 Фикс входит в официальный upstream-релиз Kubernetes 1.36.3.[4]

Upstream-фикс означает, что исправление вышло в официальной версии Kubernetes.[2:2] Cherry-pick означает, что AWS забрал конкретный коммит с исправлением и добавил его в собственную сборку раньше официального патч-релиза.[3:1] С точки зрения этой утечки оба варианта рабочие.[2:3][3:2]

Поэтому утверждение «первый EKS AMI с исправлением — 1.36.3-20260827» неточно: ранняя граница — 1.36.2-20260709.[3:3] Но если критерий приёмки требует именно kubeletVersion = v1.36.3, выбор ami_release_version = "1.36.3-20260827" остаётся правильным.[4:1]

Как проверить ноды

После ротации нод проверьте установленную версию:

kubectl get nodes -o custom-columns=NAME:.metadata.name,KUBELET:.status.nodeInfo.kubeletVersion

Актуальное потребление памяти kubelet можно получить с метрик ноды:

NODE=<node-name>
kubectl get --raw "/api/v1/nodes/${NODE}/proxy/metrics" \
  | grep '^process_resident_memory_bytes '

Для постоянного контроля полезен алерт на process_resident_memory_bytes{job="kubelet"} > 800e6. Это не специфический детектор именно этой ошибки, но он заметит опасный рост RSS процесса до того, как память ноды начнёт влиять на workload.

Вывод

Если EKS-ноды используют 1.36.2-20260709 или более новый 1.36.2 AMI, конкретно эта утечка уже должна быть устранена. Обновление до 1.36.3-20260827 оправдано, когда нужен официальный Kubernetes 1.36.3 и выполнение DoD по версии kubelet; для одной лишь утечки это не минимально необходимый апгрейд.


  1. https://github.com/kubernetes/kubernetes/issues/139823 — Kubernetes issue #139823 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  2. https://github.com/kubernetes/kubernetes/pull/140066 — Backport to release-1.36 ↩︎ ↩︎ ↩︎ ↩︎

  3. https://github.com/awslabs/amazon-eks-ami/releases/tag/v20260709 — Amazon EKS AMI v20260709 ↩︎ ↩︎ ↩︎ ↩︎

  4. https://github.com/awslabs/amazon-eks-ami/releases/tag/v20260827 — Amazon EKS AMI v20260827 ↩︎ ↩︎