company_banner

Обзор 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 с помощью команд — например, для просмотра списка 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 # в конкретном пространстве имен
    

    Benchmark


    В K9s встроили даже hey — это простой генератор нагрузки на 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 и утилитой для просмотра логов stern.

    Заключение


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

    * Хотя при большом объеме логов замечал также медленную работу K9s. В такие моменты утилита «съедала» 2 ядра у Intel Xeon E312xx и могла даже зависать.

    Чего не хватает в настоящий момент? Быстрого отката на предыдущую версию (речь не про RS) без перехода в директорию. К тому же, восстановление происходит только для всего ресурса: если вы удалили аннотацию или лейбл, придется удалить и восстановить весь ресурс (здесь и понадобится переходить в директорию). Другая мелочь — не хватает даты таких сохраненных «бэкапов».

    P.S.


    Читайте также в нашем блоге:

    Флант
    DevOps-as-a-Service, Kubernetes, обслуживание 24×7

    Похожие публикации

    Комментарии 3

      +3
      k9s по удобству лично для меня сейчас утилита №1 оставляющая далеко позади lens и т.п. web ui поделки
        +1
        Внезапно — очень удобно.
          0
          Полезная плюшка, но нужно привыкать, если на постоянку.
          Вот например готовлюсь к Certified Kubernetes Administrator (CKA) и привыкаю к работе без всяких хелперов, и изучаю tmux )

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое