
надає інтерфейс користувача терміналу для взаємодії з кластерами Kubernetes. Мета цього Open Source-проекту - полегшити зручну навігацію додатків в K8s, спостереження за ними та управління ними. K9s постійно стежить за змінами в Kubernetes і пропонує швидкі команди для роботи з ресурсами, що спостерігаються.
Проект написаний на Go, існує вже понад півтора року: перший коміт було зроблено 1 лютого 2019 року. На момент написання статті налічується 9000+ зірок на та близько 80 контриб'юторів. Побачимо, що вміє k9s?
Установка і запуск
Це клієнтський (по відношенню до кластера Kubernetes) додаток, який найпростіше запустити як Docker-образ:
docker run --rm -it -v $KUBECONFIG:/root/.kube/config quay.io/derailed/k9sДля деяких Linux-дистрибутивів та інших ОС також є готові до встановлення . Загалом для Linux-систем можна встановити бінарний файл:
sudo wget -qO- https://github.com/derailed/k9s/releases/download/v0.22.0/k9s_Linux_x86_64.tar.gz | tar zxvf - -C /tmp/
sudo mv /tmp/k9s /usr/local/binЯкихось специфічних вимог до самого кластера 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:
Log /tmp/k9s-screens-root/kubernetes/Describe-1601244920104133900.yml saved successfully! Зі створених файлів-бекапів можна і відновлювати ресурси, попередньо прибравши системні лейбли та анотації. Для цього потрібно перейти в директорію з ними (: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
Щоправда, не вистачає колонки за лейблами, на що є .
Сортування за стовпцями здійснюється клавіатурними поєднаннями:
- 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) без переходу в директорію. До того ж, відновлення відбувається тільки для всього ресурсу: якщо ви видалили анотацію або лейбл, доведеться видалити та відновити весь ресурс (тут і знадобиться переходити до директорії). Інша дрібниця – не вистачає дати таких збережених «бекапів».
P.S.
Читайте також у нашому блозі:
- «»;
- «»;
- «».
Джерело: habr.com
