Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

Огляд 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-систем можна встановити бінарний файл:

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 – просунутого термінального інтерфейсу для Kubernetes

перехід в режим команд здійснюється натисканням на ":". Після цього можна керувати роботою k9s за допомогою команд, наприклад, для перегляду списку StatefulSets (у поточному просторі імен) можна ввести :sts.

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

Для деяких інших ресурсів Kubernetes:

  • :ns - Namespaces;
  • :deploy - Deployments;
  • :ing - Ingresses;
  • :svc - Services.

Щоб вивести повний список типів ресурсів, доступних для перегляду, є команда :aliases.

Зручно переглядати список команд, доступних за гарячими комбінаціями клавіш в рамках поточного вікна: для цього достатньо натиснути на «?».

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

Також у k9s є режим пошукудля переходу в який достатньо ввести «/». З ним здійснюється пошук за вмістом поточного вікна. Допустимо, якщо ви до цього ввели :nsу вас відкритий список просторів імен. Якщо їх занадто багато, то щоб не скролити довго вниз, достатньо у вікні з namespaces ввести /mynamespace.

Для пошуку по лейблах можна вибрати всі pod'и в потрібному просторі імен, після чого ввести, наприклад, / -l app=whoami. Ми отримаємо список pod'ів із цим лейблом:

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

Пошук працює у всіх видах вікон, включаючи логи, перегляд YAML-маніфестів та describe для ресурсів - докладніше про ці можливості див. нижче.

Як загалом виглядає послідовність дій для навігації?

За допомогою команди :ctx можна вибрати контекст:

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

Для вибору namespace'а є вже згадувана команда :ns, а далі можна скористатися пошуком для потрібного простору: /test.

Якщо тепер вибрати цікавий для нас ресурс (наприклад, все той же StatefulSet), для нього з'явиться відповідна інформація: скільки запущено pod'ів з короткими відомостями про них.

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

Можуть бути цікаві тільки pod'и — тоді достатньо запровадити :pod. У випадку з ConfigMap'ами (:cm — для списку цих ресурсів) можна вибрати об'єкт, що цікавить, і натиснути на «u», після чого K9s підкаже, хто конкретно його (цей CM) використовує.

Ще одна зручна фіча для перегляду ресурсів - їх рентген (XRay view). Такий режим викликається командою :xray RESOURCE і… простіше показати, як він працює, ніж пояснювати. Ось ілюстрація для StatefulSets:

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes
(Кожен із цих ресурсів можна редагувати, змінювати, робити describe.)

А ось Deployment з Ingress:

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

Робота з ресурсами

Про кожен ресурс можна отримати інформацію в YAML або його describe натисканням на відповідні клавіатурні поєднання («y» та «d» відповідно). Базових операцій, звичайно, ще більше: їх список та клавіатурні поєднання завжди на очах завдяки зручній «шапці» в інтерфейсі (ховається натисканням на Ctrl+e).

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

При редагуванні будь-якого ресурсу («e» після його вибору) відкривається текстовий редактор, визначений у змінних оточення (export EDITOR=vim).

А ось як виглядає докладний опис ресурсу (describe):

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

Такий висновок (або висновок перегляду YAML-маніфесту ресурсу) можна зберегти за допомогою звичного поєднання клавіш Ctrl + s. Куди він збережеться, буде відомо з повідомлення K9s:

Log /tmp/k9s-screens-root/kubernetes/Describe-1601244920104133900.yml saved successfully!

Зі створених файлів-бекапів можна і відновлювати ресурси, попередньо прибравши системні лейбли та анотації. Для цього потрібно перейти в директорію з ними (:dir /tmp), після чого вибрати потрібний файл і застосувати apply.

До речі, будь-якої миті можна відкотитися і на минулий ReplicaSet, якщо з поточним є проблеми. Для цього треба вибрати потрібний RS (:rs для їхнього списку):

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

… та виконати rollback за допомогою Ctrl+l. Ми повинні отримати повідомлення про те, що все пройшло успішно:

k9s/whoami-5cfbdbb469 successfully rolled back

А щоб масштабувати репліки, достатньо натиснути на s (scale) і вибрати потрібну кількість екземплярів:

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

У будь-який з контейнерів можна зайти за допомогою shell: для цього перейдіть до потрібного pod'у, натисніть на s (shell) і виберіть контейнер.

Інші можливості

Звичайно, підтримується перегляд логів («l» для вибраного ресурсу). А щоб дивитися нові логи, немає необхідності постійно натискати Enter: достатньо зробити маркування («m»), після чого відстежувати нові повідомлення.

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

Також у цьому вікні можна вибрати тимчасовий діапазон для виведення логів:

  • клавіша "1" - за 1 хвилину;
  • "2" - 5 хвилин;
  • "3" - 15 хвилин;
  • "4" - 30 хвилин;
  • "5" - 1 година;
  • "0" - за весь час життя pod'а.

Спеціальний режим роботи Pulse (команда :pulse) показує загальні відомості про Kubernetes-кластер:

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

У ньому можна побачити кількість ресурсів та їх стан (зеленим показуються ті, що мають статус Running).

Ще одна цікава функція K9s називається Popeye. Вона перевіряє всі ресурси на певні критерії коректності і виводить «рейтинг», що вийшов, з поясненнями. Наприклад, можна побачити, що не вистачає проб або лімітів, а якийсь контейнер може запускатись під root.

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

Є базова підтримка Helm. Наприклад, так можна подивитися релізи, задеплоєні в кластер:

:helm all # все
:helm $namespace # в конкретном пространстве имен

еталонний тест

У K9s вбудували навіть агов - це простий генератор навантаження на HTTP-сервер, альтернатива більш відомому ab (ApacheBench).

Щоб увімкнути його, потрібно активувати port-forward у pod'і. Для цього вибираємо pod та натискаємо на Shift+f, переходимо в підменю port-forward за допомогою аліасу «pf».

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

Після вибору порту та натискання на Ctrl+b запуститься сам benchmark. Результати його роботи зберігаються в /tmp та доступні для подальшого перегляду K9s.

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes
Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

Для зміни конфігурації 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 – просунутого термінального інтерфейсу для Kubernetes

Плагіни

Нарешті, плагіни дозволяють розширювати можливості 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 для виконання з відповідної команди:

Огляд k9s – просунутого термінального інтерфейсу для Kubernetes

Серед плагінів є, наприклад, інтеграції з kubectl-jq та утилітою для перегляду логів. Кормовий.

Висновок

На мій смак, K9s виявилася дуже зручною в роботі: з нею досить швидко звикнути шукати все потрібне без використання kubectl. Порадував перегляд логів та їх збереження, швидке редагування ресурсів, швидкість роботи загалом*, виявився корисним режим Popeye. Окремої згадки стоять можливості створювати плагіни та доопрацьовувати додаток під свої потреби.

* Хоча при великому обсязі логів помічали також повільну роботу K9s. У такі моменти утиліта «з'їдала» 2 ядра Intel Xeon E312xx і могла навіть зависати.

Чого не вистачає зараз? Швидкого відкату на попередню версію (не про RS) без переходу в директорію. До того ж, відновлення відбувається тільки для всього ресурсу: якщо ви видалили анотацію або лейбл, доведеться видалити та відновити весь ресурс (тут і знадобиться переходити до директорії). Інша дрібниця – не вистачає дати таких збережених «бекапів».

PS

Читайте також у нашому блозі:

Джерело: habr.com

Додати коментар або відгук