
предоставя интерфейс за терминал за взаимодействие с Kubernetes клъстери. Целта на този Open Source проект е да улесни навигацията по приложенията в K8s, наблюдението и управлението им. K9s постоянно следи промените в Kubernetes и предлага бързи команди за работа с наблюдаваните ресурси.
Проектът е написан на Go и съществува повече от година и половина: първият комит е направен на 1 февруари 2019 година. Към момента на написването на статията, проектът има над 9000 звезди на и около 80 контрибутори. Нека видим какво може k9s?
Инсталация и стартиране
Това е клиентско приложение (по отношение на Kubernetes клъстера), което най-лесно може да се стартира като Docker образ:
docker run --rm -it -v $KUBECONFIG:~/.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.
Приложението се стартира с помощта на стандартната конфигурация ще бъде създаден конфиг с вида: — подобно на това, което прави 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 можете да изберете контекст:

За избор на пространство от имена вече има спомената команда :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 успешно възстановенИ за да мащабирате репликите, просто натиснете „s“ (scale) и изберете необходимия брой екземпляри:

В който и да е от контейнерите можете да влезете с помощта на shell: за целта преминете към необходимия pod, натиснете „s“ (shell) и изберете контейнера.
Други възможности
Разбира се, поддържа се и преглед на логовете („l“ за избрания ресурс). А за да видите новите логове, не е необходимо постоянно да натискате Enter: достатъчно е да направите маркировка („m“), след което да проследявате само новите съобщения.

Също в този прозорец можете да изберете времеви диапазон за извеждане на логовете:
- клавиш „1“ — за 1 минута;
- „2“ — 5 минути;
- „3“ — 15 минути;
- „4“ — 30 минути;
- „5“ — 1 час;
- „0“ — за цялото време на живот на pod.
Специален режим на работа Pulse (команда :pulse) показва обща информация за Kubernetes клъстера:

В него можете да видите количеството ресурси и тяхното състояние (зеленото показва тези, които имат статус В процес на изпълнение).
Още една интересна функция на K9s се нарича Popeye. Тя проверява всички ресурси спрямо определени критерии за коректност и извежда получаващия се „рейтинг“ с обяснения. Например, може да видите, че липсват проби или лимити, а някой контейнер може да се стартира под root...

Съществува основна поддръжка за Helm. Например, така можете да видите релизите, деплоирани в клъстера:
:helm all # всички
:helm $namespace # в конкретно пространство от имена
Benchmark
В K9s дори вградиха — това е прост генератор на натоварване за HTTP сървър, алтернатива на по-известния ab (ApacheBench).
За да го включите, ще е необходимо активиране на port-forward в pod. За целта изберете pod и натиснете Shift + f, преминете в подменюто port-forward с помощта на алиаса „pf“.

След избора на порта и натискане на Ctrl + b ще стартира самият benchmark. Резултатите от натоварването се запазват в /tmp и са достъпни за последващ преглед в K9s.


За да промените конфигурацията на benchmark, трябва да създадете файл $HOME/.k9s/bench-.yml (определя се за всеки клъстер).
NB: Важно е разширението на всички YAML файлове в директорията .k9s да бъде точно .yml (.yaml не работи коректно).
Примерна конфигурация:
бенчмарки:
по умолчанию:
# Количество потоков
паралелизъм: 2
# Количество запросов
заявки: 1000
контейнери:
# Настройки за контейнера с бенчмарка
# Контейнерът се определя като namespace/pod-name:container-name
default/nginx:nginx:
паралелизъм: 2
заявки: 10000
http:
път: /
метод: POST
тяло:
{"foo":"bar"}
заглавка:
Accept:
- text/html
Content-Type:
- application/json
услуги:
# Може да се провеждат бенчмаркове на услуги тип NodePort и LoadBalancer
# Синтаксис: namespace/service-name
default/nginx:
паралелизъм: 5
заявки: 500
http:
метод: GET
път: /auth
auth:
потребител: flant
парола: s3cr3tp455w0rd
Интерфейс
Вид на колоните за списъците с ресурси се модифицира чрез създаване на файл $HOME/.k9s/views.yml. Пример за съдържанието му:
k9s:
views:
v1/pods:
колони:
- ВРЕМЕ
- НС
- ИМЕ
- IP
- ВЪРЗКИ
- СЪСТОЯНИЕ
- ГОТОВ
v1/services:
колони:
- ВРЕМЕ
- НС
- ИМЕ
- ТИП
- КЛУСТЕР-IP
Вярно е, че липсва колона за етикетите, по която има .
Сортирането по колоните се извършва с клавишни комбинации:
- Shift + n — по име;
- Shift + o — по възли;
- Shift + i — по IP;
- Shift + a — по времето на живот на контейнера;
- Shift + t — по броя на рестартите;
- Shift + r — по състоянието на готовността;
- Shift + c — по потреблението на CPU;
- Shift + m — по потреблението на паметта.
Ако на някого не му харесва цветовото оформление по подразбиране, в K9s дори се поддържат . Готови примери (7 на брой) са налични . Ето пример за един от тези скинове (в морето):

Плъгини
Накрая, разширяват възможностите на K9s. Аз самият в работата съм ползвал само един от тях — kubectl get all -n $namespace.
Изглежда по следния начин. Създаваме файл $HOME/.k9s/plugin.yml с такова съдържание:
plugin:
get-all:
кратка клавишна комбинация: g
потвърди: false
описание: вземи всичко
обхвати:
- всичко
команда: sh
фон: false
аргументи:
- -c
- "kubectl -n $NAMESPACE get all -o wide | less"Сега можете да преминете в пространството на имената и да натиснете "g" за изпълнение на съответната команда:

Сред плугините има например интеграции с kubectl-jq и утилити за преглед на логовете .
Заключение
На мен ми се струва, че K9s е много удобен в работата: бързо свикнах да търся всичко необходимо без използване kubectl. Удовлетворен съм от прегледа на логовете и тяхното запазване, бързото редактиране на ресурсите, скоростта на работа като цяло*, оказа се полезен режим Popeye. Отделно внимание заслужават възможностите за създаване на плагини и адаптиране на приложението към собствените нужди.
* Въпреки че при голям обем логове забелязах и бавна работа на K9s. В такива моменти утилитата „изяждаше“ 2 ядра от Intel Xeon E312xx и дори можеше да замръзне.
Какво липсва в момента? Бързо връщане към предишната версия (става въпрос не за RS) без да преминавате в директорията. Освен това, възстановяването става само за всичко ресурса: ако сте изтрили анотация или етикет, ще трябва да изтриете и възстановите целия ресурс (тук ще се наложи преминаване в директория). Още един малък детайл — липсва дата на такива запазени „бекапи“.
P.S.
Прочетете също в нашия блог:
- «»;
- «»;
- «».
Източник: habr.com
