Перехід від cgroup v1 до v2 в Kubernetes: що потрібно знати (GKE, EKS та інші)

У версії Kubernetes 1.31 проект Kubernetes офіційно перевів підтримку cgroup v1 в режим обслуговування. Це означає, що настав час оновити ваші кластери, скрипти та інструменти моніторингу, щоб підготуватися до майбутнього.

У цьому пості ми розглянемо, чому cgroup важливі для Kubernetes, що змінилося з cgroup v2, як визначити активну версію та як провайдери хмарних сервісів, такі як GKE та EKS, здійснюють перехід на нову версію. Також ми покажемо, як написати версіонно-агностичний скрипт перевірки стану.

Що таке cgroups і чому вони важливі?

Control Groups (cgroups) — це можливість ядра Linux, яка дозволяє обмежувати використання ресурсів, таких як CPU та пам’ять для контейнерів, ізолювати ресурси між подами та моніторити використання для кращої спостережуваності та авто-масштабування.

У Kubernetes кожен контейнер працює в окремому cgroup, що дозволяє Kubernetes застосовувати обмеження ресурсів, наприклад, memory: "512Mi" у специфікаціях ваших подів.

Що змінюється у Kubernetes 1.31?

У серпні 2024 року Kubernetes офіційно оголосив, що підтримка cgroup v1 переходить у режим обслуговування. Це великий крок до повного переходу на cgroup v2, з такими перевагами:

  • 💡 Уніфікована ієрархія для всіх ресурсів (CPU, пам'ять, I/O)
  • 📈 Покращений моніторинг та інтерпретація
  • 🧠 Розумніший OOM killer (killer out-of-memory)
  • 🔐 Підтримка rootless контейнерів
  • 🚀 Оновлення та виправлення помилок відбуватимуться лише в cgroup v2

Що означає "режим обслуговування"?

  • Більше не буде нових функцій або поліпшень для cgroup v1
  • Підтримка буде повністю видалена в майбутньому
  • Агенти вузлів Kubernetes, такі як Kubelet, будуть оптимізовані в першу чергу для cgroup v2

Як визначити, яка версія cgroup активна

Для перевірки активної версії cgroup використовуйте цю команду на вузлі або всередині привілейованого контейнера:

stat -fc %T /sys/fs/cgroup

  • Якщо виведеться tmpfs → це cgroup v1
  • Якщо виведеться cgroup2fs → це cgroup v2

Написання скрипта, що працює з обома версіями cgroup

Старі (v1) шляхи використання пам'яті:

MEMUSAGE=$(cat /sys/fs/cgroup/memory/memory.usageinbytes)
MEM
LIMIT=$(cat /sys/fs/cgroup/memory/memory.limitinbytes)

Нові (v2) шляхи використання пам'яті:

MEMUSAGE=$(cat /sys/fs/cgroup/memory.current)
MEM
LIMIT=$(cat /sys/fs/cgroup/memory.max)

GKE: де він стоїть?

Згідно з офіційною документацією Google Cloud, GKE підтримує cgroup v2 з:

  • GKE версія 1.26+ (нові пулли вузлів за замовчуванням використовують cgroup v2)
  • 🟡 Існуючі пулли вузлів на старіших версіях можуть ще використовувати v1
  • Підтримувані типи ОС: COS_CONTAINERD та UBUNTU_CONTAINERD

Перевірте це, підключившись до вузла через SSH та використавши команду stat, як описано вище.

EKS: що з Amazon?

Amazon EKS також підтримує cgroup v2, і для цього потрібно:

image

Оновіть Amazon Linux 2, додавши параметр systemd.unified_cgroup_hierarchy=1 у параметри ядра.

Перекладено з: Migrating from cgroup v1 to v2 in Kubernetes: What You Need to Know (GKE, EKS, and Beyond)