Складність: [СЕРЕДНЯ] — Основні команди для опанування
Час на проходження: 40-45 хвилин
Передумови: Модуль 1 (Перший запущений кластер)
Уявіть, що о 3-й годині ночі спрацьовує пейджер. Основний сервіс оплати вашої компанії не працює, і щохвилини випаровуються тисячі доларів. У вас є термінал і лише один інструмент: kubectl. Якщо ви точно знаєте, як надіслати запит до кластера, отримати логи та знайти несправний Pod, ви — герой. Якщо ж ви порпаєтеся в документації, намагаючись згадати прапорець для фільтрації простору імен (namespace), аварія триває. kubectl — це не просто CLI-інструмент; це ваша центральна нервова система для спілкування з Kubernetes.
kubectl — це ваш основний інтерфейс для роботи з Kubernetes. Кожна взаємодія — створення ресурсів, налагодження проблем, перевірка статусу — проходить через kubectl. Опанування цього інструменту є критично важливим як для щоденної роботи, так і для складання сертифікаційних іспитів.
Збій через «неправильний контекст» (Реальна історія)
У 2019 році відомий фінтех-стартап (назва прихована) пережив катастрофічний 45-хвилинний збій, який коштував приблизно 120 000 доларів втрачених транзакцій. Причиною була не складна мережева помилка чи вразливість нульового дня. Досвідчений інженер, маючи намір очистити ресурси в середовищі розробки (staging), виконав команду kubectl delete namespace payments. На жаль, його контекст kubectl все ще був налаштований на production. Оскільки kubectl виконує саме те, що ви йому кажете, щодо поточного активного контексту без жодної системи захисту, весь рівень маршрутизації платежів у production був миттєво видалений. Ось чому опанування керування контекстами kubectl, використання тестових запусків (dry-runs) та обережне виконання команд — це не лише про швидкість, а й про виживання.
Зупиніться та подумайте: Якщо kubectl get pods виводить список Pod-ів, то яка команда, на вашу думку, виводить список вузлів (nodes), з яких складається ваш кластер?
Зупиніться та подумайте: Що станеться, якщо ви запустите kubectl apply -f . у директорії, де є як коректні YAML-файли Kubernetes, так і звичайний текстовий файл README.md? (Він спробує застосувати все, видасть помилку на README, але все одно успішно застосує коректні YAML-файли).
Вам повідомили, що Pod payment-processor постійно перезавантажується (crash-looping) у просторі імен finance. Вам потрібно переглянути логи попереднього екземпляра контейнера, щоб зрозуміти причину падіння. Яку команду ви виконаєте?
Відповідь
`kubectl logs payment-processor -n finance --previous`
Чому? Прапорець --previous (або -p) є критично важливим для налагодження помилок CrashLoopBackOff. За замовчуванням kubectl logs показує логи лише того контейнера, що працює зараз. Коли контейнер падає і перезапускається, поточні логи можуть бути порожніми. --previous витягує логи з «мертвого» контейнера перед самим виходом.
Ви пишете скрипт для моніторингу IP-адрес усіх запущених Pod-ів у кластері, але вам потрібні лише чисті IP-адреси без заголовків чи зайвих колонок. Як витягнути саме це поле?
Відповідь
`kubectl get pods -o jsonpath='{.items[*].status.podIP}'`
Чому? Хоча -o wide показує IP-адресу, він включає заголовки, які важко розпарсити скриптом. jsonpath дозволяє орієнтуватися в структурі JSON відповіді API та витягувати саме потрібні дані.
Розробник просить вас оновити Deployment, щоб використовувати новий тег образу (v2.1.0). У нього немає оригінального YAML-файлу, і вам потрібно зробити це швидко, не ризикуючи допустити помилку в ручному сеансі kubectl edit. Яка найбезпечніша імперативна команда?
Відповідь
`kubectl set image deployment/myapp myapp=nginx:v2.1.0`
Чому? Використання kubectl set image безпечніше за kubectl edit, бо виконує цільове атомарне оновлення без відкриття текстового редактора, де можна випадково змінити інші рядки.
Ви створили YAML-файл app.yaml і застосували його, але Pod поводиться некоректно і застряг у стані Pending. Ви хочете переглянути детальні події, пов’язані з цим конкретним Pod-ом. Що ви зробите?
Відповідь
`kubectl describe pod `
Чому? Команда kubectl describe збирає дані з кількох кінцевих точок API, зокрема події кластера (Events). Якщо Pod застряг у Pending або ImagePullBackOff, get не скаже чому, а describe покаже конкретну скаргу планувальника (scheduler) або kubelet.
Ваша команда переходить на декларативний робочий процес GitOps. Вам потрібно створити складний Deployment, але ви хочете уникнути написання YAML з нуля, щоб не помилитися з відступами. Як змусити kubectl написати «скелет» за вас?
Чому? Комбінація --dry-run=client та -o yaml — це ультимативний чит-код. Клієнт обробляє команду і форматує запит як YAML, але не відправляє його на сервер.
Ви розслідуєте проблему продуктивності й вам потрібно виконати інструмент діагностики мережі (curl) зсередини існуючого запущеного Pod-а з назвою api-backend. Як потрапити в інтерактивну оболонку всередині цього Pod-а?
Відповідь
`kubectl exec -it api-backend -- sh`
Чому? Команда kubectl exec працює аналогічно до docker exec. Прапорці -i (інтерактивність) та -t (tty) виділяють термінальну сесію, щоб ви могли вводити команди й бачити результат у реальному часі.
Ви працюєте з двома різними кластерами: dev-cluster та prod-cluster. Ви хочете перевірити, на який кластер зараз вказують ваші команди kubectl, перш ніж випадково видалити критичний ресурс. Як це перевірити?
Відповідь
`kubectl config current-context`
Чому? Файл ~/.kube/config може містити дані для десятків кластерів. «Контекст» визначає, з яким кластером і користувачем спілкується kubectl. Перевірка контексту має стати м’язовою пам’яттю перед деструктивними командами.
Ви помітили, що Pod cache-worker зовсім не відповідає і застряг у стані Terminating понад 30 хвилин. Звичайні команди видалення просто «висять». Як примусово видалити його з API-сервера?
Відповідь
`kubectl delete pod cache-worker --force --grace-period=0`
Чому? Іноді kubelet на вузлі втрачає зв’язок, залишаючи Pod у стані Terminating. Параметр --grace-period=0 каже Kubernetes не чекати коректного завершення, а --force негайно видаляє об’єкт з бази даних API-сервера.