У версії 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)
MEMLIMIT=$(cat /sys/fs/cgroup/memory/memory.limitinbytes)
Нові (v2) шляхи використання пам'яті:
MEMUSAGE=$(cat /sys/fs/cgroup/memory.current)
MEMLIMIT=$(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, і для цього потрібно:
Оновіть 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)