Преглед на k9s — напреднал терминален интерфейс за Kubernetes

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

K9s предоставя интерфейс за терминал за взаимодействие с Kubernetes клъстери. Целта на този Open Source проект е да улесни навигацията по приложенията в K8s, наблюдението и управлението им. K9s постоянно следи промените в Kubernetes и предлага бързи команди за работа с наблюдаваните ресурси.

Проектът е написан на Go и съществува повече от година и половина: първият комит е направен на 1 февруари 2019 година. Към момента на написването на статията, проектът има над 9000 звезди на GitHub и около 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 — напреднал терминален интерфейс за Kubernetes

Преходът в режим на команди се осъществява чрез натискане на «:». След това можете да управлявате работата на k9s с команди — например, за да видите списъка с StatefulSets (в текущото пространство от имена) можете да въведете :sts.

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

За някои други ресурси на Kubernetes:

  • :ns — Namespaces;
  • :deploy — Deployments;
  • :ing — Ingresses;
  • :svc — Services.

За да изведете пълния списък от типовете ресурси, налични за преглед, има команда :aliases.

Удобно е да прегледате и списъка с команди, налични с горещи клавишни комбинации в рамките на текущото прозорец: достатъчно е да натиснете «?”.

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

Също така в k9s има режим на търсене, за да преминете в който е достатъчно да въведете «/». С него можете да търсите в съдържанието на текущото «окно». Да речем, ако сте въвели :ns, имате отворен списък с пространства с имена. Ако те са твърде много, за да не скролвате дълго надолу, просто въведете в прозореца с namespaces /mynamespace.

За да търсите по етикети, можете да изберете всички pod’ове в нужното пространство от имена и след това да въведете, например, / -l app=whoami. Ще получим списък с pod’ове с този етикет:

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

Търсенето работи във всички видове прозорци, включително логове, преглед на YAML манифести и describe за ресурсите — повече за тези възможности вижте по-долу.

Как изглежда последователността на действията за навигация?

С помощта на командата :ctx можете да изберете контекст:

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

За избор на пространство от имена вече има спомената команда :ns, а след това можете да се възползвате от търсенето за нужното пространство: /test.

Ако сега изберете ресурса, който ни интересува (например, същия StatefulSet), за него ще се появи съответната информация: колко pod’ове са стартирани с кратка информация за тях.

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

Могат да ви интересуват само pod’овете — тогава е достатъчно да въведете :pod. В случай на ConfigMap’и (:cm — за списъка на тези ресурси) можете да изберете интересуващия обект и да натиснете „u“, след което K9s ще ви подскаже кой точно го (този CM) използва.

Още една удобна функция за преглед на ресурсите — техният „рентген“ (XRay view). Този режим се извиква с командата :xray RESOURCE и… по-лесно е да покажа как работи, отколкото да обяснявам. Ето илюстрация за StatefulSets:

Преглед на k9s — напреднал терминален интерфейс за Kubernetes
(Всеки от тези ресурси може да се редактира, променя, да се прави describe.)

А ето и Deployment с Ingress:

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

Работа с ресурси

От всеки ресурс може да получите информация в YAML или неговия describe с натискане на съответните клавишни комбинации („y“ и „d“ съответно). Основни операции, разбира се, има още много: техният списък и клавишни комбинации винаги са на видно място благодарение на удобната „шапка“ в интерфейса (скрива се с натискане на Ctrl + e).

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

При редактиране на всякакъв ресурс („e“ след неговото избиране) се отваря текстови редактор, определен в променливите на средата (export EDITOR=vim).

А ето как изглежда подробно описание на ресурса (describe):

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

Този изход (или изходът от преглед на YAML манифеста на ресурса) може да бъде запазен с помощта на обичайната клавишна комбинация Ctrl + s. Къде ще бъде запазен, ще бъде известно от съобщението на K9s:

Log /tmp/k9s-screens-root/kubernetes/Describe-1601244920104133900.yml saved successfully!

От създадените файлове за резервни копия можете и да възстановявате ресурси, предварително премахвайки системните етикети и анотации. За целта трябва да отидете в директорията с тях (:dir /tmp), след което да изберете нужния файл и да приложите apply.

По-точно, можете по всяко време да се върнете на предишния ReplicaSet, ако имате проблеми с текущия. За целта трябва да изберете необходимия RS (:rs от списъка им):

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

… и да извършите rollback с помощта на Ctrl + l. Трябва да получим известие, че всичко е преминало успешно:

k9s/whoami-5cfbdbb469 успешно възстановен

И за да мащабирате репликите, просто натиснете „s“ (scale) и изберете необходимия брой екземпляри:

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

В който и да е от контейнерите можете да влезете с помощта на shell: за целта преминете към необходимия pod, натиснете „s“ (shell) и изберете контейнера.

Други възможности

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

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

Също в този прозорец можете да изберете времеви диапазон за извеждане на логовете:

  • клавиш „1“ — за 1 минута;
  • „2“ — 5 минути;
  • „3“ — 15 минути;
  • „4“ — 30 минути;
  • „5“ — 1 час;
  • „0“ — за цялото време на живот на pod.

Специален режим на работа Pulse (команда :pulse) показва обща информация за Kubernetes клъстера:

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

В него можете да видите количеството ресурси и тяхното състояние (зеленото показва тези, които имат статус В процес на изпълнение).

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

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

Съществува основна поддръжка за Helm. Например, така можете да видите релизите, деплоирани в клъстера:

:helm all # всички
:helm $namespace # в конкретно пространство от имена

Benchmark

В K9s дори вградиха hey — това е прост генератор на натоварване за HTTP сървър, алтернатива на по-известния ab (ApacheBench).

За да го включите, ще е необходимо активиране на port-forward в pod. За целта изберете pod и натиснете Shift + f, преминете в подменюто port-forward с помощта на алиаса „pf“.

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

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

Преглед на k9s — напреднал терминален интерфейс за Kubernetes
Преглед на k9s — напреднал терминален интерфейс за Kubernetes

За да промените конфигурацията на 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 — напреднал терминален интерфейс за Kubernetes

Плъгини

Накрая, плъгини разширяват възможностите на 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" за изпълнение на съответната команда:

Преглед на k9s — напреднал терминален интерфейс за Kubernetes

Сред плугините има например интеграции с kubectl-jq и утилити за преглед на логовете stern.

Заключение

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

* Въпреки че при голям обем логове забелязах и бавна работа на K9s. В такива моменти утилитата „изяждаше“ 2 ядра от Intel Xeon E312xx и дори можеше да замръзне.

Какво липсва в момента? Бързо връщане към предишната версия (става въпрос не за RS) без да преминавате в директорията. Освен това, възстановяването става само за всичко ресурса: ако сте изтрили анотация или етикет, ще трябва да изтриете и възстановите целия ресурс (тук ще се наложи преминаване в директория). Още един малък детайл — липсва дата на такива запазени „бекапи“.

P.S.

Прочетете също в нашия блог:

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster