Агляд k9s – прасунутага тэрмінальнага інтэрфейсу для Kubernetes
К9с дае карыстацкі інтэрфейс тэрмінала для ўзаемадзеяння з кластарамі 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-сістэм можна ўсталяваць бінарны файл:
Нейкіх спецыфічных патрабаванняў да самога кластара 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:
З створаных файлаў-бэкапаў можна і аднаўляць рэсурсы, папярэдне прыбраўшы сістэмныя лэйблы і анатацыі. Для гэтага спатрэбіцца перайсці ў дырэкторыю з імі (: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
Праўда, не хапае калонкі па лэйблах, на што ёсць 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 і ўтылітай для прагляду логаў кармавой.
Заключэнне
На мой густ, K9s апынулася вельмі зручная ў працы: з ёй даволі хутка абвыкнуць шукаць усё патрэбнае без выкарыстання kubectl. Парадаваў прагляд логаў і іх захаванне, хуткае рэдагаванне рэсурсаў, хуткасць працы ў цэлым*, аказаўся карысным рэжым Popeye. Асобнага згадвання каштуюць магчымасці ствараць убудовы і дапрацоўваць дадатак пад свае патрэбы.
* Хоць пры вялікім аб'ёме логаў заўважаў таксама павольную працу K9s. У такія моманты ўтыліта "з'ядала" 2 ядра ў Intel Xeon E312xx і магла нават завісаць.
Чаго не хапае ў сапраўдны момант? Хуткага адкату на папярэднюю версію (гаворка не пра RS) без пераходу ў дырэкторыю. Да таго ж, аднаўленне адбываецца толькі для за ўсё рэсурсу: калі вы выдалілі анатацыю або лэйбл, давядзецца выдаліць і аднавіць увесь рэсурс (тут і спатрэбіцца пераходзіць у дырэкторыю). Іншая дробязь - не хапае даты такіх захаваных "бэкапаў".