Ви не можете практикувати адміністрування Kubernetes без кластера Kubernetes. Звучить очевидно, правда? Проте багато кандидатів на CKA повністю покладаються на керовані кластери (EKS, GKE, AKS) або одноновузлові середовища (minikube, kind), а потім впадають у ступор, коли на іспиті потрібно усунути несправності kubelet на робочому вузлі.
Іспит CKA проходить на кластерах, розгорнутих за допомогою kubeadm. Не на керованому Kubernetes. Не на Docker Desktop. На справжніх кластерах kubeadm з окремою площиною управління та робочими вузлами.
Цей модуль навчить вас будувати саме те, з чим ви зіткнетеся на іспиті.
Аналогія з оркестром
Уявіть кластер Kubernetes як оркестр. Площина управління — це диригент, який не грає на жодних інструментах (не запускає ваші застосунки), але координує все: хто коли грає, наскільки гучно, коли починати і закінчувати. Робочі вузли — це музиканти, вони виконують фактичну роботу зі створення музики (запуск контейнерів). Без диригента у вас хаос. Без музикантів — тиша. Вам потрібні обидва, щоб вони працювали разом, постійно спілкуючись.
Середовище іспиту CKA використовує вузли на базі Ubuntu. Хоча Kubernetes працює на багатьох дистрибутивах, практика на Ubuntu означає менше сюрпризів у день іспиту.
Kubernetes вимагає вимкнення файлу підкачки. Це не обговорюється.
Terminal window
# Disable swap immediately
sudoswapoff-a
# Disable swap permanently (survives reboot)
sudosed-i'/ swap / s/^/#/'/etc/fstab
Бойова історія: Таємничий OOMKill
Команда витратила дні на налагодження того, чому їхні поди постійно завершувалися з помилкою OOMKilled, незважаючи на наявність достатньої кількості пам’яті. Винуватець? Був увімкнений файл підкачки. Коли kubelet повідомляв про обсяг пам’яті планувальнику, він не враховував підкачку, що призводило до надмірного планування та, зрештою, до нестачі пам’яті. Kubernetes не керує підкачкою — він очікує, що ви її вимкнете.
Починаючи з Kubernetes 1.35, підтримка cgroup v1 вимкнена за замовчуванням. Ваші вузли повинні використовувати cgroup v2, інакше kubelet не запуститься.
Terminal window
# Check cgroup version (must show "cgroup2fs")
stat-fc%T/sys/fs/cgroup
# Expected output: cgroup2fs
# If it shows "tmpfs", you're on cgroup v1 — you need a newer OS
Увага, критична зміна: Якщо stat -fc %T /sys/fs/cgroup повертає tmpfs замість cgroup2fs, оновіть вашу ОС перед продовженням. Kubernetes 1.35 не запуститься на вузлах з cgroup v1.
Якщо ви пропустите налаштування SystemdCgroup = true, пізніше ви отримаєте незрозумілі помилки. kubelet та containerd повинні узгодити драйвер cgroup. Сучасні системи використовують systemd. Не пропустіть цей крок.
Пастка: containerd 2.0 та старі образи
containerd 2.0 припиняє підтримку образів Docker Schema 1. Якщо у вас є дуже старі образи (завантажені понад 5 років тому), їх не вдасться завантажити (pull). Зберіть їх наново або завантажте знову за допомогою сучасного Docker/buildkit.
Kubernetes не постачається з вбудованою мережею. Ви повинні встановити плагін CNI. Ми будемо використовувати Calico (широко використовується, підходить для іспиту).
Чому Kubernetes не включає мережу?
Спочатку це всіх дивує. Kubernetes зробив свідомий вибір визначити мережеву модель (кожен под отримує IP-адресу, поди можуть взаємодіяти один з одним), але не реалізовувати її. Чому? Тому що потреби в мережі сильно відрізняються — комусь потрібні розширені політики, комусь висока продуктивність, комусь інтеграція з хмарою. Використовуючи стандарт CNI (Container Network Interface), Kubernetes дозволяє вам обирати. Calico, Flannel, Cilium, Weave — всі вони реалізують однаковий інтерфейс, але мають різні суперздібності. Це як USB: стандарт визначає, як підключатися, але ви самі обираєте пристрій.
Один інженер якось витратив годину, намагаючись з’ясувати, чому в його “3-вузловому кластері” відображаються лише 2 вузли. Він виконав kubeadm join на всіх трьох машинах. Виявилося, що він помилково запустив команду на вузлі площини управління (замість робочого вузла), яка непомітно завершилася невдачею, оскільки цей вузол вже був у кластері. Урок: завжди перевіряйте, до якого вузла ви підключені через SSH, перш ніж виконувати команди. Ім’я хоста у підказці вашого термінала — ваш друг.
4.3 Додавання міток до робочих вузлів (Необов’язково, але рекомендовано)
kubeadm був створений спеціально для того, щоб зробити налаштування кластера простим. До появи kubeadm налаштування Kubernetes передбачало ручну генерацію сертифікатів, написання unit-файлів systemd та ручне налаштування кожного компонента. Деякі люди досі роблять це (“Kubernetes the Hard Way”) для навчання, але kubeadm є виробничим стандартом.
На іспиті CKA використовуються кластери kubeadm. На іспиті ви не побачите керований Kubernetes (EKS/GKE/AKS). Все базується на kubeadm, тому практика з kubeadm є важливою.
containerd замінив Docker як середовище виконання контейнерів за замовчуванням у Kubernetes 1.24. Docker все ще працює (через cri-dockerd), але containerd є простішим і саме з ним ви зіткнетеся на іспиті.
Чому файл підкачки (swap) повинен бути вимкнений для Kubernetes?
Відповідь
Kubernetes очікує прямого управління пам'яттю. З увімкненим файлом підкачки kubelet не може точно звітувати про використання пам'яті, що призводить до надмірного планування та непередбачуваної поведінки. Планувальнику потрібна надійна інформація про пам'ять.
Яке призначення прапорця --pod-network-cidr у команді kubeadm init?
Відповідь
Він визначає діапазон IP-адрес для мережі подів. Плагін CNI (наприклад, Calico) використовує цей діапазон для призначення IP-адрес подам. Різні CNI мають різні вимоги — Calico є гнучким, але Flannel за замовчуванням вимагає 10.244.0.0/16.
Вузол відображається як NotReady після приєднання. Яка найімовірніша причина?
Відповідь
Плагін CNI не встановлений або не працює. Без CNI поди не можуть отримати мережеві адреси, і вузол повідомляє про стан NotReady. Перевірте статус подів CNI за допомогою `kubectl get pods -n kube-system`.
Вам потрібно додати новий робочий вузол, але ви втратили команду приєднання. Як її отримати?
Відповідь
Виконайте `kubeadm token create --print-join-command` на вузлі площини управління. Це згенерує новий токен та виведе повну команду приєднання.