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.
Читайте также в нашем блоге: