k9s — терминальный интерфейс к Kubernetes, который заменяет длинные команды kubectl быстрым обзором и горячими клавишами. Вместо набора get pods с фильтрами вы открываете список, находите нужный под и нажимаете l для логов или s для shell. Инструмент не скрывает API: под капотом те же права из kubeconfig и тот же RBAC. Ниже — установка, навигация, настройка и честные ограничения.
Что даёт k9s
Это текстовый интерфейс, а не веб-панель. Он работает по SSH, не требует браузера и открывается за секунду. Основные сценарии: посмотреть состояние подов, найти причину CrashLoopBackOff, зайти в контейнер, пробросить порт, разобрать YAML и сравнить объекты в разных namespace.
Есть и обратная сторона: k9s не подходит для сценариев, где нужен точный вывод в скрипте. Для автоматизации остаются kubectl с jsonpath и клиентские библиотеки, а интерфейс нужен человеку, который смотрит на кластер глазами.
k9s не хранит состояние и не устанавливает агентов в кластер: он читает те же данные, что kubectl, и подчиняется тем же правам. Если доступ к секретам закрыт через RBAC, интерфейс их не покажет. Отдельный плюс — связь владельцев: по поду видно, какой деплоймент или statefulset его создал, и не нужно искать это вручную по меткам.
Установка
Вариантов несколько: snap, бинарник с релизов, пакет из репозитория проекта или go install. В Linux Mint и Ubuntu проще snap, в Arch — пакет из AUR или репозитория.
snap install k9s --classic
k9s version
k9s info
k9s -n kube-system
k9s info показывает пути к конфигу, логам и скинам — это первое, что нужно при странном поведении. Для одного запуска можно указать контекст и kubeconfig флагами, не меняя глобальные настройки. Если snap недоступен, бинарник ставят в /usr/local/bin и проверяют версию; обновление в этом случае ручное, поэтому удобнее держать пакетный менеджер или закрепить версию в скрипте.
k9s --context staging
k9s --kubeconfig ~/.kube/prod.yaml
k9s --readonly
k9s --help
Навигация
Почти всё управляется двоеточием: наберите :pod, :svc, :deploy, :ns, :ctx. Это те же ресурсы, что в kubectl, включая короткие имена. Клавиша 0 переключает все namespace, escape возвращает на уровень назад, слэш включает фильтр по подстроке.
- :pod — поды, :deploy — деплойменты, :svc — сервисы.
- :no — узлы, :pv и :pvc — хранилище.
- :ctx — контексты kubeconfig, :ns — namespace.
- 0 — все namespace, / — фильтр, esc — сброс.
- ? — подсказка по клавишам для текущего экрана.
Пользовательские ресурсы открываются по полному имени или через :crd — список CustomResourceDefinition. Операторы любят плодить десятки CRD, и без фильтра в них легко потеряться. Если ресурс не открывается, проверьте, установлен ли он вообще: kubectl api-resources показывает доступные типы.
В свежих версиях есть сводный экран Pulse с общей картиной здоровья кластера, но он не заменяет проверку событий и метрик.
Ежедневные клавиши
Запоминается десяток действий, остальное подсказывает справка.
l логи выбранного пода
s shell внутри контейнера
d describe
y YAML
shift-f port-forward
shift-f открывает порт из контейнера на локальную машину — удобно для отладки сервиса без правки манифеста. Редактирование через e открывает объект в настроенном редакторе; правка применяется сразу, поэтому на проде это опасная операция. Сочетание ctrl-d удаляет объект, и k9s запрашивает подтверждение.
Логи и отладка
Экран логов умеет паузу, поиск и переключение контейнеров в поде. Для подов с несколькими контейнерами сначала выбирается нужный, иначе легко смотреть пустой поток sidecar.
kubectl get pods -A --field-selector status.phase!=Running
kubectl describe pod -n shop api-7d9f
kubectl logs -n shop api-7d9f --previous
kubectl auth can-i --list -n shop
Для сравнения окружений удобно держать два терминала: в одном staging, в другом prod, и явно подписывать окна. k9s показывает текущий контекст в шапке, но при быстрой работе его легко не заметить.
k9s показывает статус, но причину ищут в describe и событиях. Если под падает сразу, логи предыдущего запуска через —previous информативнее текущих. Проверка auth can-i полезна, когда интерфейс выглядит пустым: возможно, дело не в k9s, а в правах.
Настройка
Конфиг лежит в ~/.config/k9s/config.yaml. Полезно включить мышь, уменьшить частоту обновления на слабом канале и выбрать тему.
k9s:
refreshRate: 2
readOnly: false
ui:
skin: dracula
enableMouse: true
Скины кладутся в ~/.config/k9s/skins и указываются по имени файла без расширения. Псевдонимы сокращают ввод: например, pp для подов и dp для деплойментов. В старых версиях они жили в отдельном файле, в новых — в том же config.yaml, поэтому сверяйтесь с документацией своей сборки.
mkdir -p ~/.config/k9s/skins
k9s info
kubectl config get-contexts
kubectl config use-context staging
Псевдонимы задаются в том же файле и ссылаются на полное имя ресурса.
aliases:
pp: v1/pods
dp: apps/v1/deployments
Ограничения
k9s — не GitOps и не замена манифестам. Правки через e живут до следующего применения Helm или CI и создают расхождение конфигурации. На общих кластерах включайте readOnly или используйте kubeconfig с правами только на чтение. Отдельно проверьте, не сохраняются ли в истории shell команды с токенами.
Исторических графиков в k9s нет: текущие CPU и память он показывает при наличии metrics-server, но не хранит ряды и не строит тренды. Терминальный интерфейс требует привычки: мышь работает не везде, а часть экранов зависит от версии. Для больших кластеров включайте фильтр по namespace, иначе список подов превращается в стену текста.
Чек-лист
- k9s установлен, k9s info показывает ожидаемые пути.
- Контексты и namespace переключаются без правки kubeconfig.
- Понятны клавиши l, s, d, y, shift-f и ctrl-d.
- Для прода используется readOnly или отдельный контекст.
- Настроены skin, refreshRate и псевдонимы под задачи.
- Логи и describe применяются вместо правки объектов наугад.
Итог
k9s ускоряет повседневную работу с Kubernetes и снижает число опечаток в командах kubectl. Он не отменяет понимания API и RBAC, зато делает диагностику наглядной: список, фильтр, логи, describe, port-forward. Начните с навигации и логов, затем добавьте readOnly для прода и аккуратные псевдонимы. Дальше инструмент становится привычкой, а не отдельной темой для изучения.