Огляд k9s – просунутого термінального інтерфейсу для Kubernetes
K9s надає інтерфейс користувача терміналу для взаємодії з кластерами Kubernetes. Мета цього Open Source-проекту - полегшити зручну навігацію додатків в K8s, спостереження за ними та управління ними. K9s постійно стежить за змінами в Kubernetes і пропонує швидкі команди для роботи з ресурсами, що спостерігаються.
Проект написаний на Go, існує вже понад півтора року: перший коміт було зроблено 1 лютого 2019 року. На момент написання статті налічується 9000+ зірок на GitHub та близько 80 контриб'юторів. Побачимо, що вміє k9s?
Установка і запуск
Це клієнтський (по відношенню до кластера Kubernetes) додаток, який найпростіше запустити як Docker-образ:
docker run --rm -it -v $KUBECONFIG:/root/.kube/config quay.io/derailed/k9s
Для деяких Linux-дистрибутивів та інших ОС також є готові до встановлення пакети. Загалом для Linux-систем можна встановити бінарний файл:
Якихось специфічних вимог до самого кластера K8s немає. Судячи з відгуків, програма працює і з такими старими версіями Kubernetes, як 1.12.
Програма запускається, використовуючи стандартний конфіг .kube/config - Аналогічно тому, як це робить kubectl.
Навігація
За замовчуванням відкривається вікно із стандартним namespace, який вказаний для контексту. Тобто якщо ви прописали kubectl config set-context --current --namespace=test, то і відкриється namespace test. (Про зміну контекстів/просторів імен див. нижче.)
перехід в режим команд здійснюється натисканням на ":". Після цього можна керувати роботою k9s за допомогою команд, наприклад, для перегляду списку StatefulSets (у поточному просторі імен) можна ввести :sts.
Для деяких інших ресурсів Kubernetes:
:ns - Namespaces;
:deploy - Deployments;
:ing - Ingresses;
:svc - Services.
Щоб вивести повний список типів ресурсів, доступних для перегляду, є команда :aliases.
Зручно переглядати список команд, доступних за гарячими комбінаціями клавіш в рамках поточного вікна: для цього достатньо натиснути на «?».
Також у k9s є режим пошукудля переходу в який достатньо ввести «/». З ним здійснюється пошук за вмістом поточного вікна. Допустимо, якщо ви до цього ввели :nsу вас відкритий список просторів імен. Якщо їх занадто багато, то щоб не скролити довго вниз, достатньо у вікні з namespaces ввести /mynamespace.
Для пошуку по лейблах можна вибрати всі pod'и в потрібному просторі імен, після чого ввести, наприклад, / -l app=whoami. Ми отримаємо список pod'ів із цим лейблом:
Пошук працює у всіх видах вікон, включаючи логи, перегляд YAML-маніфестів та describe для ресурсів - докладніше про ці можливості див. нижче.
Як загалом виглядає послідовність дій для навігації?
За допомогою команди :ctx можна вибрати контекст:
Для вибору namespace'а є вже згадувана команда :ns, а далі можна скористатися пошуком для потрібного простору: /test.
Якщо тепер вибрати цікавий для нас ресурс (наприклад, все той же StatefulSet), для нього з'явиться відповідна інформація: скільки запущено pod'ів з короткими відомостями про них.
Можуть бути цікаві тільки pod'и — тоді достатньо запровадити :pod. У випадку з ConfigMap'ами (:cm — для списку цих ресурсів) можна вибрати об'єкт, що цікавить, і натиснути на «u», після чого K9s підкаже, хто конкретно його (цей CM) використовує.
Ще одна зручна фіча для перегляду ресурсів - їх рентген (XRay view). Такий режим викликається командою :xray RESOURCE і… простіше показати, як він працює, ніж пояснювати. Ось ілюстрація для StatefulSets:
(Кожен із цих ресурсів можна редагувати, змінювати, робити describe.)
А ось Deployment з Ingress:
Робота з ресурсами
Про кожен ресурс можна отримати інформацію в YAML або його describe натисканням на відповідні клавіатурні поєднання («y» та «d» відповідно). Базових операцій, звичайно, ще більше: їх список та клавіатурні поєднання завжди на очах завдяки зручній «шапці» в інтерфейсі (ховається натисканням на Ctrl+e).
При редагуванні будь-якого ресурсу («e» після його вибору) відкривається текстовий редактор, визначений у змінних оточення (export EDITOR=vim).
А ось як виглядає докладний опис ресурсу (describe):
Такий висновок (або висновок перегляду YAML-маніфесту ресурсу) можна зберегти за допомогою звичного поєднання клавіш Ctrl + s. Куди він збережеться, буде відомо з повідомлення K9s:
Зі створених файлів-бекапів можна і відновлювати ресурси, попередньо прибравши системні лейбли та анотації. Для цього потрібно перейти в директорію з ними (:dir /tmp), після чого вибрати потрібний файл і застосувати apply.
До речі, будь-якої миті можна відкотитися і на минулий ReplicaSet, якщо з поточним є проблеми. Для цього треба вибрати потрібний RS (:rs для їхнього списку):
… та виконати rollback за допомогою Ctrl+l. Ми повинні отримати повідомлення про те, що все пройшло успішно:
k9s/whoami-5cfbdbb469 successfully rolled back
А щоб масштабувати репліки, достатньо натиснути на s (scale) і вибрати потрібну кількість екземплярів:
У будь-який з контейнерів можна зайти за допомогою shell: для цього перейдіть до потрібного pod'у, натисніть на s (shell) і виберіть контейнер.
Інші можливості
Звичайно, підтримується перегляд логів («l» для вибраного ресурсу). А щоб дивитися нові логи, немає необхідності постійно натискати Enter: достатньо зробити маркування («m»), після чого відстежувати нові повідомлення.
Також у цьому вікні можна вибрати тимчасовий діапазон для виведення логів:
клавіша "1" - за 1 хвилину;
"2" - 5 хвилин;
"3" - 15 хвилин;
"4" - 30 хвилин;
"5" - 1 година;
"0" - за весь час життя pod'а.
Спеціальний режим роботи Pulse (команда :pulse) показує загальні відомості про Kubernetes-кластер:
У ньому можна побачити кількість ресурсів та їх стан (зеленим показуються ті, що мають статус Running).
Ще одна цікава функція K9s називається Popeye. Вона перевіряє всі ресурси на певні критерії коректності і виводить «рейтинг», що вийшов, з поясненнями. Наприклад, можна побачити, що не вистачає проб або лімітів, а якийсь контейнер може запускатись під root.
Є базова підтримка Helm. Наприклад, так можна подивитися релізи, задеплоєні в кластер:
:helm all # все
:helm $namespace # в конкретном пространстве имен
еталонний тест
У K9s вбудували навіть агов - це простий генератор навантаження на HTTP-сервер, альтернатива більш відомому ab (ApacheBench).
Щоб увімкнути його, потрібно активувати port-forward у pod'і. Для цього вибираємо pod та натискаємо на Shift+f, переходимо в підменю port-forward за допомогою аліасу «pf».
Після вибору порту та натискання на Ctrl+b запуститься сам benchmark. Результати його роботи зберігаються в /tmp та доступні для подальшого перегляду K9s.
Для зміни конфігурації benchmark'у потрібно створити файл $HOME/.k9s/bench-<my_context>.yml (Визначається для кожного кластера).
NB: Важливо, щоб розширення всіх YAML-файлів у директорії .k9s було саме .yml (.yaml не працює коректно).
Приклад конфігурації:
benchmarks:
defaults:
# Количество потоков
concurrency: 2
# Количество запросов
requests: 1000
containers:
# Настройки для контейнера с бенчмарком
# Контейнер определяется как namespace/pod-name:container-name
default/nginx:nginx:
concurrency: 2
requests: 10000
http:
path: /
method: POST
body:
{"foo":"bar"}
header:
Accept:
- text/html
Content-Type:
- application/json
services:
# Можно проводить бенчмарк на сервисах типа NodePort и LoadBalancer
# Синтаксис: namespace/service-name
default/nginx:
concurrency: 5
requests: 500
http:
method: GET
path: /auth
auth:
user: flant
password: s3cr3tp455w0rd
Інтерфейс
Вигляд стовпців для списків ресурсів модифікується створенням файлу $HOME/.k9s/views.yml. Приклад його вмісту:
k9s:
views:
v1/pods:
columns:
- AGE
- NAMESPACE
- NAME
- IP
- NODE
- STATUS
- READY
v1/services:
columns:
- AGE
- NAMESPACE
- NAME
- TYPE
- CLUSTER-IP
Щоправда, не вистачає колонки за лейблами, на що є issue у проекті.
Сортування за стовпцями здійснюється клавіатурними поєднаннями:
Shift + n - на ім'я;
Shift + o - по вузлах;
Shift + i - по IP;
Shift + a – за часом життя контейнера;
Shift + t - за кількістю рестартів;
Shift + r - за статусом готовності;
Shift + c - за споживанням CPU;
Shift + m – за споживанням пам'яті.
Якщо ж комусь не подобається колірне оформлення за замовчуванням, K9s навіть підтримуються скіни. Готові приклади (7 штук) доступні тут. Ось приклад одного з таких скінів (in the navy):
Плагіни
Нарешті, плагіни дозволяють розширювати можливості K9s. Сам я в роботі використав лише один із них — kubectl get all -n $namespace.
Виглядає це в такий спосіб. Створюємо файл $HOME/.k9s/plugin.yml з таким вмістом:
plugin:
get-all:
shortCut: g
confirm: false
description: get all
scopes:
- all
command: sh
background: false
args:
- -c
- "kubectl -n $NAMESPACE get all -o wide | less"
Тепер можна перейти в простір імен і натиснути на g для виконання з відповідної команди:
Серед плагінів є, наприклад, інтеграції з kubectl-jq та утилітою для перегляду логів. Кормовий.
Висновок
На мій смак, K9s виявилася дуже зручною в роботі: з нею досить швидко звикнути шукати все потрібне без використання kubectl. Порадував перегляд логів та їх збереження, швидке редагування ресурсів, швидкість роботи загалом*, виявився корисним режим Popeye. Окремої згадки стоять можливості створювати плагіни та доопрацьовувати додаток під свої потреби.
* Хоча при великому обсязі логів помічали також повільну роботу K9s. У такі моменти утиліта «з'їдала» 2 ядра Intel Xeon E312xx і могла навіть зависати.
Чого не вистачає зараз? Швидкого відкату на попередню версію (не про RS) без переходу в директорію. До того ж, відновлення відбувається тільки для всього ресурсу: якщо ви видалили анотацію або лейбл, доведеться видалити та відновити весь ресурс (тут і знадобиться переходити до директорії). Інша дрібниця – не вистачає дати таких збережених «бекапів».