{"id":97736,"date":"2020-10-21T14:42:17","date_gmt":"2020-10-21T12:42:17","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/obzor-k9s-prodvinutogo-terminalnogo-interfejsa-dlya-kubernetes"},"modified":"2020-10-21T14:42:17","modified_gmt":"2020-10-21T12:42:17","slug":"obzor-k9s-prodvinutogo-terminalnogo-interfejsa-dlya-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/obzor-k9s-prodvinutogo-terminalnogo-interfejsa-dlya-kubernetes","title":{"rendered":"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/11274841ee84b0e2c3ac74c9c738faba.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/k9scli.io\/\">K9s<\/a><\/noindex> oferuje interfejs terminala do interakcji z klastrami Kubernetes. Celem tego projektu Open Source jest u\u0142atwienie wygodnej nawigacji po aplikacjach w K8s, ich monitorowanie i zarz\u0105dzanie nimi. K9s na bie\u017c\u0105co \u015bledzi zmiany w Kubernetes i oferuje szybkie komendy do pracy z obserwowanymi zasobami.<\/p>\n<p>Projekt napisano w j\u0119zyku Go, istnieje ju\u017c od ponad p\u00f3\u0142tora roku: pierwszy commit zosta\u0142 zrobiony 1 lutego 2019 roku. W momencie pisania artyku\u0142u ma ponad 9000 gwiazdek na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/derailed\/k9s\">GitHub<\/a><\/noindex> i oko\u0142o 80 wsp\u00f3\u0142tw\u00f3rc\u00f3w. Zobaczmy, co potrafi K9s?<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Instalacja i uruchomienie<\/h2>\n<p>\nTo aplikacja kliencka (w stosunku do klastra Kubernetes), kt\u00f3r\u0105 naj\u0142atwiej uruchomi\u0107 jako obraz Docker:<\/p>\n<pre><code class=\"bash\">docker run --rm -it -v $KUBECONFIG:\/root\/.kube\/config quay.io\/derailed\/k9s<\/code><\/pre>\n<p>\nDla niekt\u00f3rych dystrybucji Linux i innych system\u00f3w operacyjnych dost\u0119pne s\u0105 r\u00f3wnie\u017c gotowe do instalacji <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/derailed\/k9s#installation\">pakiety<\/a><\/noindex>. W og\u00f3lnym przypadku dla system\u00f3w Linux mo\u017cna zainstalowa\u0107 plik binarny:<\/p>\n<pre><code class=\"bash\">sudo wget -qO- https:\/\/github.com\/derailed\/k9s\/releases\/download\/v0.22.0\/k9s_Linux_x86_64.tar.gz | tar zxvf -  -C \/tmp\/\nsudo mv \/tmp\/k9s \/usr\/local\/bin<\/code><\/pre>\n<p>\nNie ma specyficznych wymaga\u0144 dotycz\u0105cych samego klastra K8s. Z opinii wynika, \u017ce aplikacja dzia\u0142a nawet z tak starymi wersjami Kubernetes jak 1.12.<\/p>\n<p>Aplikacja uruchamia si\u0119, korzystaj\u0105c z domy\u015blnej konfiguracji <code>.kube\/config<\/code> \u2014 podobnie jak to robi <code>kubectl<\/code>.<\/p>\n<h2>Nawigacja<\/h2>\n<p>\nDomy\u015blnie otwiera si\u0119 okno z domy\u015blnym namespace, kt\u00f3ry jest okre\u015blony dla kontekstu. To znaczy, \u017ce je\u015bli wpisa\u0142e\u015b <code>kubectl config set-context --current --namespace=test<\/code>, otworzy si\u0119 namespace <code>test<\/code>. <i>(O zmianie kontekst\u00f3w\/przestrzeni nazw patrz poni\u017cej.) <\/i><\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/820fcbdd376abc95d67bf202f34c880c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPrzej\u015bcie w <b>tryb komend<\/b> nast\u0119puje po naci\u015bni\u0119ciu \u00ab:\u00bb. Po tym mo\u017cna zarz\u0105dza\u0107 dzia\u0142aniem k9s za pomoc\u0105 komend \u2014 na przyk\u0142ad, aby wy\u015bwietli\u0107 list\u0119 StatefulSets (w bie\u017c\u0105cej przestrzeni nazw), mo\u017cna wpisa\u0107 <code>:sts<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/840724fc656b22e67519c53983065862.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDla niekt\u00f3rych innych zasob\u00f3w Kubernetes:<\/p>\n<ul>\n<li> <code>:ns<\/code> \u2014 Namespaces;<\/li>\n<li> <code>:deploy<\/code> \u2014 Deployments;<\/li>\n<li> <code>:ing<\/code> \u2014 Ingresses;<\/li>\n<li> <code>:svc<\/code> \u2014 Services.<\/li>\n<\/ul>\n<p>\nAby wy\u015bwietli\u0107 pe\u0142n\u0105 list\u0119 typ\u00f3w zasob\u00f3w dost\u0119pnych do przegl\u0105dania, istnieje komenda <code>:aliases<\/code>.<\/p>\n<p>Wygodnie jest przegl\u0105da\u0107 tak\u017ce list\u0119 komend dost\u0119pnych w ramach bie\u017c\u0105cego okna za pomoc\u0105 kombinacji klawiszy: wystarczy nacisn\u0105\u0107 \u00ab?\u00bb.<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/54d329f9eeda2424f457aef6b977ae63.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIstnieje r\u00f3wnie\u017c w k9s <b>tryb wyszukiwania<\/b>, do kt\u00f3rego wystarczy wpisa\u0107 \u00ab\/\u00bb. Umo\u017cliwia on przeszukiwanie zawarto\u015bci bie\u017c\u0105cego \u201eokna\u201d. Za\u0142\u00f3\u017cmy, \u017ce wcze\u015bniej wpisa\u0142e\u015b <code>:ns<\/code>, masz otwart\u0105 list\u0119 przestrzeni nazw. Je\u015bli jest ich zbyt wiele, aby nie przewija\u0107 d\u0142ugo w d\u00f3\u0142, wystarczy w oknie z namespaces wpisa\u0107 <code>\/mynamespace<\/code>.<\/p>\n<p>Aby wyszuka\u0107 po etykietach, mo\u017cna wybra\u0107 wszystkie pod'y w odpowiedniej przestrzeni nazw, a nast\u0119pnie wpisa\u0107 na przyk\u0142ad, <code>\/ -l app=whoami<\/code>. Otrzymamy list\u0119 pod'\u00f3w z t\u0105 etykiet\u0105:<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/88b8e09a5b7819bcf49334bf351b040b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWyszukiwanie dzia\u0142a we wszystkich typach okien, w tym w logach, podgl\u0105dzie manifest\u00f3w YAML i <code>describe<\/code> dla zasob\u00f3w \u2014 wi\u0119cej informacji na ten temat znajduje si\u0119 poni\u017cej.<\/p>\n<p>Jak og\u00f3lnie wygl\u0105da sekwencja dzia\u0142a\u0144 w nawigacji?<\/p>\n<p>Za pomoc\u0105 polecenia <code>:ctx<\/code> mo\u017cna wybra\u0107 kontekst:<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/a5e780a3fc98961913c966222e167d51.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAby wybra\u0107 namespace, jest ju\u017c wspomniana komenda <code>:ns<\/code>, a nast\u0119pnie mo\u017cna skorzysta\u0107 z wyszukiwania w potrzebnej przestrzeni: <code>\/test<\/code>.<\/p>\n<p>Je\u015bli teraz wybierzemy interesuj\u0105cy nas zas\u00f3b (na przyk\u0142ad ten sam StatefulSet), pojawi\u0105 si\u0119 odpowiednie informacje: ile pod\u2019\u00f3w zosta\u0142o uruchomionych, wraz z kr\u00f3tkimi informacjami na ich temat.<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/8e0d8c41b8673b7c29f2605d3ae59503.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMog\u0105 nas interesowa\u0107 tylko pod\u2019y \u2014 wtedy wystarczy wpisa\u0107 <code>:pod<\/code>. W przypadku ConfigMap'\u00f3w (<code>:cm<\/code> \u2014 dla listy tych zasob\u00f3w) mo\u017cna wybra\u0107 interesuj\u0105cy obiekt i nacisn\u0105\u0107 \u201eu\u201d, a nast\u0119pnie K9s podpowie, kto konkretnie go (ten CM) u\u017cywa.<\/p>\n<p>Jeszcze jedn\u0105 przydatn\u0105 funkcj\u0105 do podgl\u0105du zasob\u00f3w jest ich <b>\u201erentgen\u201d (XRay view)<\/b>. Taki tryb uruchamia si\u0119 poleceniem <code>:xray RESOURCE<\/code> i\u2026 \u0142atwiej pokaza\u0107, jak to dzia\u0142a, ni\u017c t\u0142umaczy\u0107. Oto ilustracja dla StatefulSets:<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/de40ebfe06ca935d2bc36323b3f16f3e.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>(Ka\u017cdy z tych zasob\u00f3w mo\u017cna edytowa\u0107, zmienia\u0107, robi\u0107 <code>describe<\/code>.)<\/i><\/p>\n<p>A oto Deployment z Ingress:<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/598c1b25b787dcb1cf9660fa730d74c5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Praca z zasobami<\/h2>\n<p>\nO ka\u017cdym zasobie mo\u017cna uzyska\u0107 informacje w formacie YAML lub jego <code>describe<\/code> naciskaj\u0105c odpowiednie skr\u00f3ty klawiszowe (\u201ey\u201d i \u201ed\u201d odpowiednio). Podstawowych operacji, oczywi\u015bcie, jest jeszcze wi\u0119cej: ich lista i skr\u00f3ty klawiszowe s\u0105 zawsze widoczne dzi\u0119ki wygodnemu \u201enag\u0142\u00f3wkowi\u201d w interfejsie (mo\u017cna go ukry\u0107 naciskaj\u0105c Ctrl + e).<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/6bbe4ca07442e1e14a462586d14ef98d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPodczas edytowania dowolnego zasobu (\u201ee\u201d po jego wyborze) otwiera si\u0119 edytor tekstowy okre\u015blony w zmiennych \u015brodowiskowych (<code>export EDITOR=vim<\/code>).<\/p>\n<p>Oto jak wygl\u0105da szczeg\u00f3\u0142owy opis zasobu (<code>describe<\/code>):<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/05fdb57e3b85d1b81c9bfc6414aca117.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTaki wynik (lub wynik podgl\u0105du manifestu YAML zasobu) mo\u017cna zapisa\u0107 za pomoc\u0105 znanego skr\u00f3tu klawiszowego Ctrl + s. Gdzie on zostanie zapisany, b\u0119dzie wiadomo z komunikatu K9s:<\/p>\n<pre><code class=\"plaintext\">Log \/tmp\/k9s-screens-root\/kubernetes\/Describe-1601244920104133900.yml zapisano pomy\u015blnie!<\/code><\/pre>\n<p>\nZ utworzonych plik\u00f3w kopii zapasowych mo\u017cna r\u00f3wnie\u017c przywraca\u0107 zasoby, wcze\u015bniej usuwaj\u0105c systemowe etykiety i adnotacje. W tym celu nale\u017cy przej\u015b\u0107 do katalogu z nimi (<code>:dir \/tmp<\/code>), po czym wybra\u0107 potrzebny plik i zastosowa\u0107 <code>apply<\/code>.<\/p>\n<p>W ka\u017cdej chwili mo\u017cesz wr\u00f3ci\u0107 do poprzedniego ReplicaSet, je\u015bli obecny sprawia problemy. Aby to zrobi\u0107, wybierz odpowiedni RS (<code>:rs<\/code> z ich listy):<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/de0ea37d970c51514559288661bdc6f2.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u2026 i wykonaj rollback za pomoc\u0105 Ctrl + l. Powinno nast\u0105pi\u0107 powiadomienie, \u017ce wszystko przebieg\u0142o pomy\u015blnie:<\/p>\n<pre><code class=\"plaintext\">k9s\/whoami-5cfbdbb469 pomy\u015blnie przywr\u00f3cony<\/code><\/pre>\n<p>\nAby skalowa\u0107 repliki, wystarczy nacisn\u0105\u0107 \u00abs\u00bb (scale) i wybra\u0107 wymagan\u0105 liczb\u0119 instancji:<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/145093030db754c9ef85810cbba3ed5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDo dowolnego z kontener\u00f3w mo\u017cesz wej\u015b\u0107 za pomoc\u0105 shell: aby to zrobi\u0107, przejd\u017a do odpowiedniego pod\u2019a, naci\u015bnij \u00abs\u00bb (shell) i wybierz kontener.<\/p>\n<h2>Inne mo\u017cliwo\u015bci<\/h2>\n<p>\nOczywi\u015bcie wspierane jest r\u00f3wnie\u017c przegl\u0105danie log\u00f3w (\u00abl\u00bb dla wybranego zasobu). Aby ogl\u0105da\u0107 nowe logi, nie ma potrzeby ci\u0105g\u0142ego naciskania Enter: wystarczy oznaczy\u0107 (\u00abm\u00bb), a nast\u0119pnie \u015bledzi\u0107 tylko nowe wiadomo\u015bci.<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/05aa9657f744b9e3d09034862e1befe7.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMo\u017cesz tak\u017ce wybra\u0107 zakres czasowy dla wyj\u015bcia log\u00f3w w tym samym oknie:<\/p>\n<ul>\n<li> klawisz \u00ab1\u00bb \u2014 za 1 minut\u0119;<\/li>\n<li> \u00ab2\u00bb \u2014 5 minut;<\/li>\n<li> \u00ab3\u00bb \u2014 15 minut;<\/li>\n<li> \u00ab4\u00bb \u2014 30 minut;<\/li>\n<li> \u00ab5\u00bb \u2014 1 godzina;<\/li>\n<li> \u201e0\u201d \u2014 przez ca\u0142y czas \u017cycia pod'a.<\/li>\n<\/ul>\n<p>\nSpecjalny tryb pracy Pulse (komenda <code>:pulse<\/code>) pokazuje og\u00f3lne informacje o klastrze Kubernetes:<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/413d241ad7518f49c523fa59f51702a6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMo\u017cna zobaczy\u0107 liczb\u0119 zasob\u00f3w i ich stan (zielonym kolorem pokazane s\u0105 te, kt\u00f3re maj\u0105 status <code>Running<\/code>).<\/p>\n<p>Kolejna interesuj\u0105ca funkcja K9s nazywa si\u0119 <b>Popeye<\/b>. Sprawdza wszystkie zasoby pod k\u0105tem okre\u015blonych kryteri\u00f3w poprawno\u015bci i wy\u015bwietla uzyskany \u00abranking\u00bb z wyja\u015bnieniami. Na przyk\u0142ad mo\u017cna zobaczy\u0107, \u017ce brakuje limit\u00f3w lub zasob\u00f3w, a jaki\u015b kontener mo\u017ce by\u0107 uruchamiany pod root\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/a6bc5ea45b5749fb4e1038b82374b3c4.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nObs\u0142uguje podstawowe funkcje Helm. Na przyk\u0142ad, mo\u017cna zobaczy\u0107 wydania wdro\u017cone w klastrze:<\/p>\n<pre><code class=\"bash\">:helm all # wszystko\n:helm $namespace # w konkretnym przestrzeni nazw\n<\/code><\/pre>\n<p><\/p>\n<h2>Benchmark<\/h2>\n<p>\nW K9s wbudowano nawet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rakyll\/hey\">hey<\/a><\/noindex> \u2014 to prosty generator obci\u0105\u017cenia dla serwera HTTP, alternatywa dla bardziej znanego ab (ApacheBench).<\/p>\n<p>Aby go w\u0142\u0105czy\u0107, nale\u017cy aktywowa\u0107 port-forward w pod\u2019ie. W tym celu wybierz pod i naci\u015bnij Shift + f, przejd\u017a do podmenu port-forward za pomoc\u0105 aliasu \u00abpf\u00bb.<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/651f25269c0998c716ab9c0c4b5e0455.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPo wyborze portu i naci\u015bni\u0119ciu Ctrl + b uruchomi si\u0119 benchmark. Wyniki jego pracy s\u0105 zapisywane w <code>\/tmp<\/code> i dost\u0119pne do p\u00f3\u017aniejszego przegl\u0105dania w K9s. <\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/57b2fe1d078e9aca1c6afccd318094da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/3b2bf031e8442e47eb3482187ac5b64d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAby zmieni\u0107 konfiguracj\u0119 benchmark\u2019a, musisz utworzy\u0107 plik <code>$HOME\/.k9s\/bench-.yml<\/code> (okre\u015blany dla ka\u017cdego klastra).<\/p>\n<p><i>NB: Wa\u017cne, aby rozszerzenie wszystkich plik\u00f3w YAML w katalogu <code>.k9s<\/code> by\u0142o identycznie <code>.yml<\/code> (<code>.yaml<\/code> nie dzia\u0142a poprawnie).<\/i><\/p>\n<p>Przyk\u0142ad konfiguracji:<\/p>\n<pre><code class=\"bash\">benchmarks:\n  defaults:\n    # Liczba w\u0105tk\u00f3w\n    concurrency: 2\n    # Liczba zapyta\u0144\n    requests: 1000\n  containers:\n    # Ustawienia dla kontenera z benchmarkiem\n    # Kontener definiowany jako namespace\/pod-name:container-name\n    default\/nginx:nginx:\n      concurrency: 2\n      requests: 10000\n      http:\n        path: \/\n        method: POST\n        body:\n          {\"foo\":\"bar\"}\n        header:\n          Accept:\n            - text\/html\n          Content-Type:\n            - application\/json\n services:\n    # Mo\u017cna przeprowadza\u0107 benchmarki na us\u0142ugach typu NodePort i LoadBalancer\n    # Sk\u0142adnia: namespace\/service-name\n    default\/nginx:\n      concurrency: 5\n      requests: 500\n      http:\n        method: GET\n        path: \/auth\n      auth:\n        user: flant\n        password: s3cr3tp455w0rd\n<\/code><\/pre>\n<p><\/p>\n<h2>Interfejs<\/h2>\n<p>\nRodzaj kolumn w listach zasob\u00f3w modyfikuje si\u0119, tworz\u0105c plik <code>$HOME\/.k9s\/views.yml<\/code>. Przyk\u0142ad jego zawarto\u015bci:<\/p>\n<pre><code class=\"plaintext\">k9s:\n views:\n   v1\/pods:\n     columns:\n       - AGE\n       - NAMESPACE\n       - NAME\n       - IP\n       - NODE\n       - STATUS\n       - READY\n   v1\/services:\n     columns:\n       - AGE\n       - NAMESPACE\n       - NAME\n       - TYPE\n       - CLUSTER-IP\n<\/code><\/pre>\n<p>\n<i>Rzeczywi\u015bcie, brakuje kolumny z etykietami, co jest <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/derailed\/k9s\/issues\/605\">kwesti\u0105 w projekcie<\/a><\/noindex>.<\/i><\/p>\n<p>Sortowanie wed\u0142ug kolumn odbywa si\u0119 za pomoc\u0105 kombinacji klawiszy:<\/p>\n<ul>\n<li> Shift + n \u2014 wed\u0142ug nazwy;<\/li>\n<li> Shift + o \u2014 wed\u0142ug w\u0119z\u0142\u00f3w;<\/li>\n<li> Shift + i \u2014 wed\u0142ug IP;<\/li>\n<li> Shift + a \u2014 wed\u0142ug czasu \u017cycia kontenera;<\/li>\n<li> Shift + t \u2014 wed\u0142ug liczby restart\u00f3w;<\/li>\n<li> Shift + r \u2014 wed\u0142ug statusu gotowo\u015bci;<\/li>\n<li> Shift + c \u2014 wed\u0142ug zu\u017cycia CPU;<\/li>\n<li> Shift + m \u2014 wed\u0142ug zu\u017cycia pami\u0119ci.<\/li>\n<\/ul>\n<p>\nJe\u015bli kto\u015b nie lubi domy\u015blnego kolorystycznego nadania, w K9s wspierane s\u0105 nawet <noindex><a rel=\"nofollow\" href=\"https:\/\/k9scli.io\/topics\/skins\/\">sk\u00f3rki<\/a><\/noindex>. Gotowe przyk\u0142ady (7 sztuk) s\u0105 dost\u0119pne <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/derailed\/k9s\/tree\/master\/skins\">tutaj<\/a><\/noindex>. Oto przyk\u0142ad jednej z takich sk\u00f3rek <i>(in the navy)<\/i>:<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/4a4378f2c2d36eb3985e2b71d733c444.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Wtyczki<\/h2>\n<p>\nNa koniec, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/derailed\/k9s\/tree\/master\/plugins\">wtyczki<\/a><\/noindex> pozwalaj\u0105 na rozszerzenie mo\u017cliwo\u015bci K9s. Osobi\u015bcie w pracy u\u017cywa\u0142em tylko jednej z nich \u2014 <code>kubectl get all -n $namespace<\/code>.<\/p>\n<p>Wygl\u0105da to nast\u0119puj\u0105co. Tworzymy plik <code>$HOME\/.k9s\/plugin.yml<\/code> z tak\u0105 zawarto\u015bci\u0105:<\/p>\n<pre><code class=\"bash\">plugin:\n get-all:\n   shortCut: g    \n   confirm: false    \n   description: pobierz wszystko\n   scopes:\n   - all\n   command: sh\n   background: false\n   args:\n   - -c\n   - \"kubectl -n $NAMESPACE get all -o wide | less\"<\/code><\/pre>\n<p>\nTeraz mo\u017cna przej\u015b\u0107 do przestrzeni nazw i nacisn\u0105\u0107 \u00abg\u00bb, aby wykona\u0107 powi\u0105zan\u0105 komend\u0119:<\/p>\n<p><img decoding=\"async\" alt=\"Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminala dla Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/c79bbf26b6c321a97cedabf22f1699b9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW\u015br\u00f3d wtyczek s\u0105 na przyk\u0142ad integracje z kubectl-jq oraz narz\u0119dziem do przegl\u0105dania log\u00f3w <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/wercker\/stern\">stern<\/a><\/noindex>.<\/p>\n<h2>Podsumowanie<\/h2>\n<p>\nMoim zdaniem K9s okaza\u0142o si\u0119 bardzo praktyczne w pracy: do\u015b\u0107 szybko mo\u017cna przyzwyczai\u0107 si\u0119 do wyszukiwania wszystkiego potrzebnego bez u\u017cycia <code>kubectl<\/code>. Cieszy\u0142o mnie przegl\u0105danie log\u00f3w oraz ich zapis, szybka edycja zasob\u00f3w, og\u00f3lna szybko\u015b\u0107 dzia\u0142ania*, przydatny okaza\u0142 si\u0119 tryb Popeye. Osobnej wzmianki wymaga mo\u017cliwo\u015b\u0107 tworzenia wtyczek i dostosowywania aplikacji do w\u0142asnych potrzeb.<\/p>\n<p><i>* Cho\u0107 przy du\u017cej ilo\u015bci log\u00f3w zauwa\u017cy\u0142em r\u00f3wnie\u017c wolne dzia\u0142anie K9s. W takich momentach narz\u0119dzie \u201epo\u017cera\u0142o\u201d 2 rdzenie w procesorze Intel Xeon E312xx i potrafi\u0142o nawet zawiesza\u0107 si\u0119.<\/i><\/p>\n<p>Czego brakuje w tej chwili? Szybkiego powrotu do poprzedniej wersji (mowa nie o RS) bez przechodzenia do katalogu. Poza tym, przywracanie odbywa si\u0119 tylko dla <i>przez<\/i> zasobu: je\u015bli usuniesz adnotacj\u0119 lub etykiet\u0119, b\u0119dziesz musia\u0142 usun\u0105\u0107 i przywr\u00f3ci\u0107 ca\u0142y zas\u00f3b (tutaj konieczne b\u0119dzie przej\u015bcie do katalogu). Inna drobnostka \u2014 brakuje daty takich zapisanych \u201ekopii zapasowych\u201d.<\/p>\n<h2>P.S.<\/h2>\n<p>\nPrzeczytaj tak\u017ce na naszym blogu:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/506948\/\">Przegl\u0105d interfejs\u00f3w graficznych dla Kubernetes<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/468041\/\">Zapowied\u017a interfejsu webowego Kubernetes Web View (i kr\u00f3tki przegl\u0105d innych interfejs\u00f3w UI webowych dla Kubernetes)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/426985\/\">kubebox i inne pow\u0142oki konsolowe dla Kubernetes<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/524196\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>K9s \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c\u0438 Kubernetes. \u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0433\u043e Open Source-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u2014 \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u043f\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u0432 K8s, \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0435 \u0437\u0430 \u043d\u0438\u043c\u0438 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043c\u0438. K9s \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442 \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 Kubernetes \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u044b\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438. \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Go, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u0443\u0442\u043e\u0440\u0430 \u043b\u0435\u0442: \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":97737,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-97736","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/obzor-k9s-prodvinutogo-terminalnogo-interfejsa-dlya-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u0431\u0437\u043e\u0440 k9s \u2014 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043b\u044f Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/obzor-k9s-prodvinutogo-terminalnogo-interfejsa-dlya-kubernetes\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-21T12:42:17+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-21T12:42:17+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Przegl\u0105d k9s \u2014 zaawansowanego interfejsu terminalowego dla Kubernetes | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/obzor-k9s-prodvinutogo-terminalnogo-interfejsa-dlya-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u0431\u0437\u043e\u0440 k9s \u2014 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043b\u044f Kubernetes | ProHoster","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/obzor-k9s-prodvinutogo-terminalnogo-interfejsa-dlya-kubernetes","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-21T12:42:17+00:00","article:modified_time":"2020-10-21T12:42:17+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"97736","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:14:39","updated":"2022-10-03 07:12:05","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/97736","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=97736"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/97736\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/97737"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=97736"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=97736"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=97736"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}