Ako efektívnejšie používať kubectl: podrobný návod

Ako efektívnejšie používať kubectl: podrobný návod
Ak pracujete s Kubernetes, potom je kubectl pravdepodobne jedným z nástrojov, ktoré používate najčastejšie. A vždy, keď strávite veľa času prácou s konkrétnym nástrojom, oplatí sa ho dobre naštudovať a naučiť sa ho efektívne používať.

Tím Kubernetes aaS z Mail.ru preložil článok Daniela Weibela, v ktorom nájdete tipy a triky na efektívnu prácu s kubectl. Pomôže vám to tiež hlbšie porozumieť Kubernetes.

Cieľom článku je podľa autora nielen zefektívniť, ale aj spríjemniť vašu každodennú prácu s Kubernetes!

Úvod: Čo je kubectl

Predtým, ako sa naučíte používať kubectl efektívnejšie, musíte získať základné znalosti o tom, čo to je a ako funguje.

Z pohľadu používateľa je kubectl ovládací panel, ktorý vám umožňuje vykonávať operácie Kubernetes.

Technicky vzaté, kubectl je klient Kubernetes API.

Kubernetes API je HTTP REST API. Toto API je skutočným používateľským rozhraním Kubernetes, cez ktoré je kompletne ovládané. To znamená, že každá operácia Kubernetes je vystavená ako koncový bod API a môže byť vykonaná s požiadavkou HTTP na tento koncový bod.

Hlavnou úlohou kubectl je preto odosielať HTTP požiadavky na Kubernetes API:

Ako efektívnejšie používať kubectl: podrobný návod
Kubernetes je úplne zdrojovo orientovaný systém. To znamená, že udržiava vnútorný stav zdrojov a všetky operácie Kubernetes sú operácie CRUD.

Správou týchto zdrojov máte úplnú kontrolu nad Kubernetes a Kubernetes zisťuje, čo robiť na základe aktuálneho stavu zdrojov. Z tohto dôvodu je referencia rozhrania Kubernetes API usporiadaná ako zoznam typov zdrojov s priradenými operáciami.

Pozrime sa na príklad.

Povedzme, že chcete vytvoriť prostriedok ReplicaSet. Na tento účel opíšete ReplicaSet v súbore názvom replicaset.yaml, potom spustite príkaz:

$ kubectl create -f replicaset.yaml

Tým sa vytvorí prostriedok ReplicaSet. Čo sa však deje v zákulisí?

Kubernetes má operáciu vytvorenia ReplicaSet. Ako každá iná operácia, je vystavená ako koncový bod API. Špecifický koncový bod API pre túto operáciu vyzerá takto:

POST /apis/apps/v1/namespaces/{namespace}/replicasets

Koncové body API pre všetky operácie Kubernetes nájdete na Odkaz na API (Vrátane vyššie uvedený koncový bod). Ak chcete odoslať skutočnú požiadavku na koncový bod, musíte najprv pridať adresu URL servera API do ciest koncového bodu, ktoré sú uvedené v referencii API.

Preto, keď vykonáte vyššie uvedený príkaz, kubectl odošle požiadavku HTTP POST do vyššie uvedeného koncového bodu API. Definícia ReplicaSet, ktorú ste poskytli v súbore replicaset.yaml, sa zasiela v tele žiadosti.

Takto funguje kubectl pre všetky príkazy, ktoré interagujú s klastrom Kubernetes. Vo všetkých týchto prípadoch kubectl jednoducho odosiela požiadavky HTTP na príslušné koncové body rozhrania Kubernetes API.

Upozorňujeme, že Kubernetes môžete plne spravovať pomocou pomôcky ako napr curlmanuálnym odoslaním požiadaviek HTTP do rozhrania Kubernetes API. Kubectl jednoducho uľahčuje používanie Kubernetes API.

Toto je základ toho, čo je kubectl a ako funguje. Ale na Kubernetes API je ešte niečo, čo by mal vedieť každý používateľ kubectl. Poďme sa rýchlo pozrieť do vnútorného sveta Kubernetes.

Vnútorný svet Kubernetes

Kubernetes pozostáva zo sady nezávislých komponentov, ktoré bežia ako samostatné procesy v uzloch klastra. Niektoré komponenty bežia na hlavných uzloch, iné na pracovných uzloch, pričom každý komponent vykonáva svoju vlastnú špecifickú úlohu.

Tu sú najdôležitejšie komponenty na hlavných uzloch:

  1. sklad - ukladá definície zdrojov (zvyčajne je to atď).
  2. API server — poskytuje API a spravuje úložisko.
  3. Správca ovládačov — Zabezpečuje, že stavy zdrojov sú v súlade so špecifikáciami.
  4. Plánovač — naplánuje moduly na pracovných uzloch.

A tu je jeden najdôležitejší komponent na pracovných uzloch:

  1. kubelet — riadi spúšťanie kontajnerov na pracovnom uzle.

Aby sme pochopili, ako tieto komponenty spolupracujú, pozrime sa na príklad.

Predpokladajme, že ste práve dokončili kubectl create -f replicaset.yaml, po ktorom kubectl odoslal požiadavku HTTP POST Koncový bod ReplicaSet API (prejdením definície prostriedku ReplicaSet).

Čo sa deje v klastri?

  1. Po vykonaní kubectl create -f replicaset.yaml Server API ukladá vašu definíciu prostriedku ReplicaSet do úložiska:

    Ako efektívnejšie používať kubectl: podrobný návod

  2. Potom sa v správcovi radiča spustí kontrolér ReplicaSet, ktorý sa stará o vytváranie, úpravu a odstraňovanie prostriedkov ReplicaSet:

    Ako efektívnejšie používať kubectl: podrobný návod

  3. Radič ReplicaSet vytvorí definíciu modulu pre každú repliku ReplicaSet (podľa šablóny modulu v definícii ReplicaSet) a uloží ich do úložiska:

    Ako efektívnejšie používať kubectl: podrobný návod

  4. Spustí sa plánovač, ktorý sleduje moduly, ktoré ešte neboli priradené k žiadnemu pracovnému uzlu:

    Ako efektívnejšie používať kubectl: podrobný návod

  5. Plánovač vyberie vhodný pracovný uzol pre každý modul a pridá tieto informácie do definície modulu v obchode:

    Ako efektívnejšie používať kubectl: podrobný návod

  6. Na pracovnom uzle, ku ktorému je modul priradený, sa spustí Kubelet, ktorý sleduje moduly priradené k tomuto uzlu:

    Ako efektívnejšie používať kubectl: podrobný návod

  7. Kubelet načíta definíciu modulu z úložiska a dá pokyn runtime kontajnera, ako je napríklad Docker, aby spustil kontajnery v uzle:

    Ako efektívnejšie používať kubectl: podrobný návod

Nižšie je uvedená textová verzia tohto popisu.

Požiadavku API na koncový bod vytvorenia ReplicaSet spracuje server API. Server API autentifikuje požiadavku a uloží definíciu prostriedku ReplicaSet do úložného priestoru.

Táto udalosť spustí radič ReplicaSet, ktorý je podprocesom správcu radiča. Radič ReplicaSet monitoruje vytváranie, aktualizáciu a odstraňovanie prostriedkov ReplicaSet v úložisku a prijíma oznámenie o udalosti, keď k tomu dôjde.

Úlohou ovládača ReplicaSet je zabezpečiť, aby existoval požadovaný počet modulov ReplicaSet. V našom príklade zatiaľ neexistujú žiadne moduly, takže ovládač ReplicaSet vytvorí tieto definície modulov (podľa šablóny modulu v definícii ReplicaSet) a uloží ich do úložiska.

Vytváranie nových modulov spúšťa plánovač, ktorý sleduje definície modulov, ktoré ešte nie sú naplánované pre pracovné uzly. Plánovač vyberie vhodný pracovný uzol pre každú pod a aktualizuje definície pod v úložisku.

Všimnite si, že až do tohto bodu nikde v klastri nebežal žiadny kód pracovného zaťaženia. Všetko, čo sa doteraz urobilo - ide o vytváranie a aktualizáciu zdrojov v úložisku na hlavnom uzle.

Posledná udalosť spustí Kubelets, ktoré monitorujú moduly naplánované pre ich pracovné uzly. Kubelet pracovného uzla, na ktorom sú nainštalované vaše moduly ReplicaSet, musí prikázať spusteniu kontajnera, ako je napríklad Docker, aby stiahlo požadované obrázky kontajnera a spustilo ich.

V tomto bode je vaša aplikácia ReplicaSet konečne spustená!

Úloha Kubernetes API

Ako ste videli v predchádzajúcom príklade, komponenty Kubernetes (okrem servera API a úložiska) sledujú zmeny zdrojov v úložisku a menia informácie o zdrojoch v úložisku.

Samozrejme, tieto komponenty neinteragujú s úložiskom priamo, ale iba cez Kubernetes API.

Zvážte nasledujúce príklady:

  1. Radič ReplicaSet používa koncový bod API zoznam ReplicaSets s parametrom watch na monitorovanie zmien prostriedkov ReplicaSet.
  2. Radič ReplicaSet používa koncový bod API vytvoriť Pod (vytvoriť pod) na vytvorenie pod.
  3. Plánovač používa koncový bod API náplasťový modul (upraviť modul) na aktualizáciu modulov s informáciami o vybranom pracovnom uzle.

Ako vidíte, ide o rovnaké rozhranie API, ku ktorému pristupuje kubectl. Používanie rovnakého API pre interné komponenty a externých používateľov je základným konceptom dizajnu Kubernetes.

Teraz môžeme zhrnúť, ako Kubernetes funguje:

  1. Stav úložiska, to znamená zdroje Kubernetes.
  2. Server API poskytuje rozhranie k úložisku vo forme Kubernetes API.
  3. Všetky ostatné komponenty a používatelia Kubernetes čítajú, sledujú a manipulujú so stavom Kubernetes (zdrojmi) prostredníctvom rozhrania API.

Poznanie týchto pojmov vám pomôže lepšie pochopiť kubectl a vyťažiť z neho maximum.

Teraz sa pozrime na niekoľko konkrétnych tipov a trikov, ktoré vám pomôžu zlepšiť vašu produktivitu s kubectl.

1. Zrýchlite zadávanie pomocou dokončovania príkazov

Jednou z najužitočnejších, ale často prehliadaných techník na zlepšenie výkonu s kubectl je dokončovanie príkazov.

Dokončenie príkazov vám umožňuje automaticky dokončiť časti príkazov kubectl pomocou klávesu Tab. Toto funguje pre čiastkové príkazy, voľby a argumenty, vrátane niečoho tak zložitého, ako sú názvy zdrojov.

Pozrite si, ako funguje dokončovanie príkazov kubectl:

Ako efektívnejšie používať kubectl: podrobný návod
Dokončenie príkazov funguje pre shelly Bash a Zsh.

Oficiálny sprievodca obsahuje podrobné pokyny na nastavenie automatického dopĺňania, nižšie však poskytneme krátky úryvok.

Ako funguje dokončovanie príkazov

Dokončenie príkazu je funkcia shellu, ktorá funguje pomocou dokončovacieho skriptu. Rozširujúci skript je shell skript, ktorý definuje správanie rozšírenia pre konkrétny príkaz.

Kubectl automaticky generuje a vydáva rozširujúce skripty pre Bash a Zsh pomocou nasledujúcich príkazov:

$ kubectl completion bash

Или:

$ kubectl completion zsh

Teoreticky stačí výstup týchto príkazov pripojiť k príslušnému príkazovému shellu, aby kubectl mohol príkazy dopĺňať.

V praxi je spôsob pripojenia odlišný pre Bash (vrátane rozdielov medzi Linuxom a MacOS) a Zsh. Nižšie sa pozrieme na všetky tieto možnosti.

Bash na Linuxe

Skript dokončenia Bash závisí od balíka bash-completion, takže ho musíte najskôr nainštalovať:

$ sudo apt-get install bash-completion

Или:

$ yum install bash-completion

Úspešnú inštaláciu balíka môžete otestovať pomocou nasledujúceho príkazu:

$ type _init_completion

Ak to vypíše kód funkcie shellu, dokončenie bash je nainštalované správne. Ak príkaz zobrazí chybu „Nenájdené“, musíte do súboru pridať nasledujúci riadok ~ / .bashrc:

$ source /usr/share/bash-completion/bash_completion

Je potrebné pridať tento riadok do súboru ~ / .bashrc alebo nezávisí od správcu balíkov, ktorý ste použili na inštaláciu bash-completion. Toto je potrebné pre APT, ale nie pre YUM.

Po inštalácii bash-completion musíte všetko nakonfigurovať tak, aby bol skript dokončenia kubectl povolený vo všetkých reláciách shellu.

Jedným zo spôsobov, ako to urobiť, je pridať do súboru nasledujúci riadok ~ / .bashrc:

source <(kubectl completion bash)

Ďalším spôsobom je pridanie skriptu rozšírenia kubectl do adresára /etc/bash_completion.d (vytvorte ho, ak neexistuje):

$ kubectl completion bash >/etc/bash_completion.d/kubectl

Všetky doplnkové skripty v katalógu /etc/bash_completion.d sú automaticky zahrnuté do dokončovania bash.

Obe možnosti sú rovnako použiteľné.

Po reštartovaní shellu bude fungovať dokončenie príkazu kubectl.

Bash na MacOS

V systéme MacOS je nastavenie trochu komplikovanejšie. Faktom je, že MacOS štandardne používa Bash verziu 3.2 a skript automatického dopĺňania kubectl vyžaduje verziu Bash aspoň 4.1 a nefunguje v Bash 3.2.

S používaním zastaranej verzie Bash v systéme MacOS sú spojené problémy s licenciami. Bash verzia 4 je licencovaná pod GPLv3, ktorú Apple nepodporuje.

Ak chcete nakonfigurovať automatické dopĺňanie kubectl v systéme MacOS, musíte si nainštalovať novšiu verziu Bash. Môžete tiež nastaviť aktualizovaný Bash ako predvolený shell, čo vám v budúcnosti ušetrí veľa problémov. Nie je to ťažké, podrobnosti sú uvedené v článku “Aktualizácia Bash na MacOS".

Pred pokračovaním sa uistite, že používate najnovšiu verziu Bash (skontrolujte výstup bash --version).

Skript na dokončenie bash sa líši podľa projektu bash-dokončenie, takže ho musíte najskôr nainštalovať.

Bash-completion môžete nainštalovať pomocou homebrew:

$ brew install bash-completion@2

Tu @2 znamená bash-completion verzia 2. kubectl autocompletion vyžaduje bash-completion v2 a bash-completion v2 vyžaduje minimálne Bash verziu 4.1.

Výstup príkazu brew-install obsahuje sekciu Caveats, ktorá špecifikuje, čo je potrebné pridať do súboru ~/.bash_profile:

export BASH_COMPLETION_COMPAT_DIR=/usr/local/etc/bash_completion.d
[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . 
"/usr/local/etc/profile.d/bash_completion.sh"

Odporúčam však pridať tieto riadky nie ~/.bash_profileA ~/.bashrc. V tomto prípade bude automatické dopĺňanie dostupné nielen v hlavnom, ale aj v podriadených príkazových shelloch.

Po reštartovaní príkazového prostredia si môžete overiť správnosť inštalácie pomocou nasledujúceho príkazu:

$ type _init_completion

Ak vo výstupe vidíte funkciu shell, všetko je nakonfigurované správne.

Teraz musíme zabezpečiť, aby bolo automatické dopĺňanie kubectl povolené vo všetkých reláciách.

Jedným zo spôsobov je pridať nasledujúci riadok do svojho ~/.bashrc:

source <(kubectl completion bash)

Druhým spôsobom je pridanie skriptu automatického dopĺňania do priečinka /usr/local/etc/bash_completion.d:

$ kubectl completion bash
>/usr/local/etc/bash_completion.d/kubectl

Táto metóda bude fungovať iba vtedy, ak ste nainštalovali dokončenie bash pomocou Homebrew. V tomto prípade dokončenie bash načíta všetky skripty z tohto adresára.

Ak ste nainštalovali kubectl pomocou Homebrew, potom nie je potrebné vykonať predchádzajúci krok, pretože skript automatického dopĺňania sa automaticky umiestni do priečinka /usr/local/etc/bash_completion.d počas inštalácie. V tomto prípade začne automatické dopĺňanie kubectl fungovať hneď, ako nainštalujete bash-completion.

V dôsledku toho sú všetky tieto možnosti ekvivalentné.

Zsh

Skripty automatického dopĺňania pre Zsh nevyžadujú žiadne závislosti. Všetko, čo musíte urobiť, je povoliť ich pri načítaní príkazového shellu.

Môžete to urobiť pridaním riadku do svojho ~/.zshrc súbor:

source <(kubectl completion zsh)

Ak sa zobrazí chyba not found: compdef po reštartovaní vášho shellu musíte povoliť vstavanú funkciu compdef. Môžete ho povoliť tak, že ho pridáte na začiatok súboru ~/.zshrc nasledujúce:

autoload -Uz compinit
compinit

2. Rýchle zobrazenie špecifikácií zdrojov

Keď vytvárate definície prostriedkov YAML, musíte poznať polia a ich význam pre tieto prostriedky. Jedným z miest, kde môžete tieto informácie hľadať, je referencia API, ktorá obsahuje úplné špecifikácie všetkých zdrojov.

Prepnúť na webový prehliadač vždy, keď potrebujete niečo vyhľadať, je však nepohodlné. Preto kubectl poskytuje príkaz kubectl explain, ktorý zobrazuje špecifikácie všetkých zdrojov priamo vo vašom termináli.

Formát príkazu je nasledujúci:

$ kubectl explain resource[.field]...

Príkaz vypíše špecifikáciu požadovaného zdroja alebo poľa. Zobrazené informácie sú totožné s informáciami obsiahnutými v príručke API.

V predvolenom nastavení kubectl explain zobrazuje len prvú úroveň hniezdenia polí.

Pozrite sa, ako to vyzerá môže byť tu.

Ak pridáte možnosť, môžete zobraziť celý strom --recursive:

$ kubectl explain deployment.spec --recursive

Ak presne neviete, ktoré zdroje sú potrebné, môžete ich všetky zobraziť pomocou nasledujúceho príkazu:

$ kubectl api-resources

Tento príkaz zobrazí názvy zdrojov v množnom čísle, napr. deployments namiesto deployment. Zobrazuje napríklad aj krátky názov deploy, pre tie zdroje, ktoré ho majú. Nebojte sa týchto rozdielov. Všetky tieto možnosti pomenovania sú ekvivalentné pre kubectl. To znamená, že môžete použiť ktorýkoľvek z nich kubectl explain.

Všetky nasledujúce príkazy sú ekvivalentné:

$ kubectl explain deployments.spec
# или
$ kubectl explain deployment.spec
# или        
$ kubectl explain deploy.spec

3. Použite vlastný výstupný formát stĺpca

Predvolený formát výstupu príkazu kubectl get:

$ kubectl get pods
NAME                     READY    STATUS    RESTARTS  AGE
engine-544b6b6467-22qr6   1/1     Running     0       78d
engine-544b6b6467-lw5t8   1/1     Running     0       78d
engine-544b6b6467-tvgmg   1/1     Running     0       78d
web-ui-6db964458-8pdw4    1/1     Running     0       78d

Tento formát je pohodlný, ale obsahuje obmedzené množstvo informácií. V porovnaní s úplným formátom definície zdroja sa tu zobrazuje len niekoľko polí.

V tomto prípade môžete použiť vlastný výstupný formát stĺpca. Umožňuje vám určiť, aké údaje sa majú vydávať. Akékoľvek pole zdroja môžete zobraziť ako samostatný stĺpec.

Použitie vlastného formátu sa určuje pomocou možností:

-o custom-columns=<header>:<jsonpath>[,<header>:<jsonpath>]...

Každý výstupný stĺpec môžete definovať ako pár <header>:<jsonpath>Kde <header> je názov stĺpca a <jsonpath> — výraz definujúci pole zdroja.

Pozrime sa na jednoduchý príklad:

$ kubectl get pods -o custom-columns='NAME:metadata.name'

NAME
engine-544b6b6467-22qr6
engine-544b6b6467-lw5t8
engine-544b6b6467-tvgmg
web-ui-6db964458-8pdw4

Výstup obsahuje jeden stĺpec s názvami podov.

Výraz voľby vyberie názvy modulov z poľa metadata.name. Je to preto, že názov modulu je definovaný v poli názvu dieťaťa metadata v popise zdroja modulu. Viac podrobností nájdete v Sprievodca API alebo zadajte príkaz kubectl explain pod.metadata.name.

Teraz povedzme, že chcete do výstupu pridať ďalší stĺpec, napríklad ukázať uzol, na ktorom je spustený každý modul. Ak to chcete urobiť, jednoducho pridajte špecifikáciu príslušného stĺpca do možnosti vlastných stĺpcov:

$ kubectl get pods 
  -o custom-columns='NAME:metadata.name,NODE:spec.nodeName'

NAME                       NODE
engine-544b6b6467-22qr6    ip-10-0-80-67.ec2.internal
engine-544b6b6467-lw5t8    ip-10-0-36-80.ec2.internal
engine-544b6b6467-tvgmg    ip-10-0-118-34.ec2.internal
web-ui-6db964458-8pdw4     ip-10-0-118-34.ec2.internal

Výraz vyberá názov uzla z spec.nodeName — keď je modul priradený k uzlu, jeho názov sa zapíše do poľa spec.nodeName špecifikácia zdroja pod. Podrobnejšie informácie nájdete vo výstupe kubectl explain pod.spec.nodeName.

Upozorňujeme, že polia zdrojov Kubernetes rozlišujú veľké a malé písmená.

Akékoľvek pole zdroja môžete zobraziť ako stĺpec. Stačí si pozrieť špecifikáciu zdroja a vyskúšať to s ľubovoľnými poľami, ktoré sa vám páčia.

Najprv sa však pozrime bližšie na výrazy výberu polí.

Výrazy JSONPath

Výrazy pre výber zdrojových polí sú založené na JSONPath.

JSONPath je jazyk na získavanie údajov z dokumentov JSON. Výber jedného poľa je najjednoduchším prípadom použitia JSONPath. Má veľa väčší hlasvrátane selektorov, filtrov atď.

Vysvetlenie Kubectl podporuje obmedzený počet funkcií JSONPath. Možnosti a príklady ich použitia sú popísané nižšie:

# Выбрать все элементы списка
$ kubectl get pods -o custom-columns='DATA:spec.containers[*].image'
# Выбрать специфический элемент списка
$ kubectl get pods -o custom-columns='DATA:spec.containers[0].image'
# Выбрать элементы списка, попадающие под фильтр
$ kubectl get pods -o custom-columns='DATA:spec.containers[?(@.image!="nginx")].image'
# Выбрать все поля по указанному пути, независимо от их имени
$ kubectl get pods -o custom-columns='DATA:metadata.*'
# Выбрать все поля с указанным именем, вне зависимости от их расположения
$ kubectl get pods -o custom-columns='DATA:..image'

Obzvlášť dôležitý je operátor []. Mnohé polia zdrojov Kubernetes sú zoznamy a tento operátor vám umožňuje vybrať členov týchto zoznamov. Často sa používa so zástupným znakom ako [*] na výber všetkých prvkov zoznamu.

Príklady aplikácií

Možnosti použitia vlastného výstupného formátu stĺpca sú nekonečné, pretože vo výstupe môžete zobraziť ľubovoľné pole alebo kombináciu zdrojových polí. Tu je niekoľko vzorových aplikácií, ale môžete ich preskúmať sami a nájsť aplikácie, ktoré vám vyhovujú.

  1. Zobrazovanie obrázkov kontajnerov pre moduly:
    $ kubectl get pods 
      -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image'
    
    NAME                        IMAGES
    engine-544b6b6467-22qr6     rabbitmq:3.7.8-management,nginx
    engine-544b6b6467-lw5t8     rabbitmq:3.7.8-management,nginx
    engine-544b6b6467-tvgmg     rabbitmq:3.7.8-management,nginx
    web-ui-6db964458-8pdw4      wordpress

    Tento príkaz zobrazí názvy obrázkov kontajnerov pre každú pod.

    Pamätajte, že pod môže obsahovať niekoľko kontajnerov, potom sa názvy obrázkov zobrazia na jednom riadku oddelené čiarkami.

  2. Zobrazujú sa zóny dostupnosti uzlov:
    $ kubectl get nodes 
      -o 
    custom-columns='NAME:metadata.name,ZONE:metadata.labels.failure-domain.beta.kubernetes.io/zone'
    
    NAME                          ZONE
    ip-10-0-118-34.ec2.internal   us-east-1b
    ip-10-0-36-80.ec2.internal    us-east-1a
    ip-10-0-80-67.ec2.internal    us-east-1b

    Tento príkaz je užitočný, ak je váš klaster hosťovaný vo verejnom cloude. Zobrazuje zónu dostupnosti pre každý uzol.

    Zóna dostupnosti je koncept cloudu, ktorý obmedzuje zónu replikácie na geografickú oblasť.

    Zóny dostupnosti pre každý uzol sa získavajú prostredníctvom špeciálneho označenia - failure-domain.beta.kubernetes.io/zone. Ak je klaster spustený vo verejnom cloude, tento štítok sa vytvorí automaticky a vyplní sa názvami zón dostupnosti pre každý uzol.

    Štítky nie sú súčasťou špecifikácie zdrojov Kubernetes, takže informácie o nich nenájdete v Sprievodca API. Môžu sa však zobraziť (ako akékoľvek iné štítky), ak požiadate o informácie o uzloch vo formáte YAML alebo JSON:

    $ kubectl get nodes -o yaml
    # или
    $ kubectl get nodes -o json

    Je to skvelý spôsob, ako sa okrem špecifikácií učebných zdrojov dozvedieť viac o zdrojoch.

4. Ľahko prepínajte medzi klastrami a mennými priestormi

Keď kubectl odošle požiadavku na Kubernetes API, najprv načíta súbor kubeconfig, aby získal všetky potrebné parametre pre pripojenie.

V predvolenom nastavení je súbor kubeconfig ~/.kube/config. Tento súbor je zvyčajne vytvorený alebo aktualizovaný špeciálnym príkazom.

Keď pracujete s viacerými klastrami, váš súbor kubeconfig obsahuje nastavenia na pripojenie ku všetkým týmto klastrom. Potrebujete spôsob, ako povedať príkazu kubectl, s ktorým klastrom pracujete.

V rámci klastra môžete vytvoriť viacero menných priestorov – typ virtuálneho klastra vo fyzickom klastri. Kubectl tiež určuje, ktorý priestor názvov sa má použiť na základe súboru kubeconfig. To znamená, že potrebujete aj spôsob, ako povedať príkazu kubectl, s akým menným priestorom má pracovať.

V tejto kapitole si vysvetlíme, ako to funguje a ako to urobiť efektívne.

Všimnite si, že v premennej prostredia KUBECONFIG môžete mať viacero súborov kubeconfig. V tomto prípade budú všetky tieto súbory za behu zlúčené do jednej spoločnej konfigurácie. Predvolený súbor kubeconfig môžete zmeniť aj spustením kubectl s parametrom --kubeconfig. Pozri oficiálna dokumentácia.

súbory kubeconfig

Pozrime sa, čo presne obsahuje súbor kubeconfig:

Ako efektívnejšie používať kubectl: podrobný návod
Ako vidíte, súbor kubeconfig obsahuje súbor kontextov. Kontext pozostáva z troch prvkov:

  • Cluster — API URL klastrového servera.
  • Používateľ – overovacie poverenia používateľa v klastri.
  • Priestor názvov – priestor názvov, ktorý sa používa pri pripájaní do klastra.

V praxi často používajú jeden kontext na klaster vo svojom kubeconfig. Môžete však mať viacero kontextov na klaster, ktoré sa líšia podľa používateľa alebo priestoru názvov. Táto konfigurácia viacerých kontextov je však neobvyklá, takže medzi klastrami a kontextami zvyčajne existuje mapovanie typu one-to-one.

V každom danom čase je aktuálny jeden z kontextov:

Ako efektívnejšie používať kubectl: podrobný návod
Keď kubectl číta konfiguračný súbor, vždy berie informácie z aktuálneho kontextu. Vo vyššie uvedenom príklade sa kubectl pripojí ku klastru Hare.

Ak chcete prejsť na iný klaster, musíte zmeniť aktuálny kontext v súbore kubeconfig:

Ako efektívnejšie používať kubectl: podrobný návod
Teraz sa kubectl pripojí ku klastru Fox.

Ak chcete prepnúť na iný priestor názvov v rovnakom klastri, musíte zmeniť hodnotu prvku priestoru názvov pre aktuálny kontext:

Ako efektívnejšie používať kubectl: podrobný návod
Vo vyššie uvedenom príklade kubectl použije menný priestor Prod klastra Fox (predtým bol nastavený menný priestor Test).

Všimnite si, že kubectl tiež poskytuje možnosti --cluster, --user, --namespace и --context, ktoré umožňujú prepisovať jednotlivé prvky a samotný aktuálny kontext bez ohľadu na to, čo je nastavené v kubeconfig. Pozri kubectl options.

Teoreticky môžete manuálne zmeniť nastavenia v kubeconfig. Ale je to nepohodlné. Na zjednodušenie týchto operácií existujú rôzne pomocné programy, ktoré umožňujú automatickú zmenu parametrov.

Použite kubectx

Veľmi populárny nástroj na prepínanie medzi klastrami a mennými priestormi.

Nástroj poskytuje príkazy kubectx и kubens zmeniť aktuálny kontext a menný priestor.

Ako už bolo spomenuté, zmena aktuálneho kontextu znamená zmenu klastra, ak máte iba jeden kontext na klaster.

Tu je príklad spustenia týchto príkazov:

Ako efektívnejšie používať kubectl: podrobný návod
V podstate tieto príkazy jednoducho upravia súbor kubeconfig, ako je popísané vyššie.

inštalovať kubectx, postupujte podľa pokynov na GitHub.

Oba príkazy podporujú automatické dopĺňanie názvov kontextu a menného priestoru, čo eliminuje potrebu ich úplného zadávania. Pokyny na nastavenie automatického dopĺňania tu.

Ďalšia užitočná funkcia kubectx je interaktívny režim. Funguje v spojení s utilitou fzf, ktorý je potrebné inštalovať samostatne. Inštalácia fzf automaticky sprístupní interaktívny režim v kubectx. Interaktívne si môžete vybrať kontext a menný priestor prostredníctvom interaktívneho bezplatného vyhľadávacieho rozhrania, ktoré poskytuje fzf.

Používanie aliasov shellu

Na zmenu aktuálneho kontextu a menného priestoru nepotrebujete samostatné nástroje, pretože kubectl na to poskytuje aj príkazy. Áno, tím kubectl config poskytuje čiastkové príkazy na úpravu súborov kubeconfig.

Vot niekohoty z nih:

  • kubectl config get-contexts: zobrazenie všetkých kontextov;
  • kubectl config current-context: získať aktuálny kontext;
  • kubectl config use-context: zmeniť aktuálny kontext;
  • kubectl config set-context: Zmena prvku kontextu.

Priame používanie týchto príkazov však nie je príliš pohodlné, pretože sú dlhé. Môžete pre nich vytvoriť aliasy shellu, ktoré sa dajú ľahko spustiť.

Na základe týchto príkazov som vytvoril sadu aliasov, ktoré poskytujú funkcie podobné kubectx. Tu ich môžete vidieť v akcii:

Ako efektívnejšie používať kubectl: podrobný návod
Všimnite si, že aliasy používajú fzf na poskytovanie interaktívneho bezplatného vyhľadávacieho rozhrania (ako interaktívny režim kubectx). To znamená, že potrebujete nainštalovať fzfpoužívať tieto aliasy.

Tu sú definície samotných aliasov:

# Получить текущий контекст
alias krc='kubectl config current-context'
# Список всех контекстов
alias klc='kubectl config get-contexts -o name | sed "s/^/  /;|^  $(krc)$|s/ /*/"'
# Изменить текущий контекст
alias kcc='kubectl config use-context "$(klc | fzf -e | sed "s/^..//")"'

# Получить текущее пространство имен
alias krn='kubectl config get-contexts --no-headers "$(krc)" | awk "{print $5}" | sed "s/^$/default/"'
# Список всех пространств имен
alias kln='kubectl get -o name ns | sed "s|^.*/|  |;|^  $(krn)$|s/ /*/"'
# Изменить текущее пространство имен
alias kcn='kubectl config set-context --current --namespace "$(kln | fzf -e | sed "s/^..//")"'

Ak chcete nastaviť tieto aliasy, musíte do súboru pridať vyššie uvedené definície ~/.bashrc alebo ~/.zshrc a reštartujte svoj shell.

Používanie pluginov

Kubectl vám umožňuje načítať doplnky, ktoré sa vykonávajú rovnakým spôsobom ako základné príkazy. Môžete si napríklad nainštalovať doplnok kubectl-foo a spustiť ho vykonaním príkazu kubectl foo.

Bolo by vhodné takto zmeniť kontext a menný priestor, napríklad spustením kubectl ctx zmeniť kontext a kubectl ns na zmenu menného priestoru.

Napísal som dva pluginy, ktoré to robia:

Práca pluginov je založená na aliasoch z predchádzajúcej časti.

Takto fungujú:

Ako efektívnejšie používať kubectl: podrobný návod
Všimnite si, že doplnky používajú fzf na poskytovanie interaktívneho bezplatného vyhľadávacieho rozhrania (ako interaktívny režim kubectx). To znamená, že potrebujete nainštalovať fzfpoužívať tieto aliasy.

Ak chcete nainštalovať doplnky, musíte si stiahnuť skripty shellu s názvom kubectl-ctx и kubectl-ns do ľubovoľného adresára vo vašej premennej PATH a urobte ich spustiteľnými napr. chmod +x. Ihneď po tom budete môcť použiť kubectl ctx и kubectl ns.

5. Znížte vstup pomocou automatických aliasov

Aliasy shellu sú dobrým spôsobom, ako urýchliť zadávanie. Projekt kubectl-aliasy obsahuje asi 800 skratiek pre základné príkazy kubectl.

Možno sa pýtate – ako si zapamätáte 800 aliasov? Nemusíte si ich však pamätať všetky, pretože sú postavené podľa jednoduchej schémy, ktorá je uvedená nižšie:

Ako efektívnejšie používať kubectl: podrobný návod
napríklad:

  1. kgpooyaml - kubectl get struky oyaml
  2. ksysgsvcw — kubectl -n kube-system dostať svc w
  3. ksysrmcm -kubectl -n kube-system rm cm
  4. kgdepallsl - kubectl získať nasadenie všetkých sl

Ako vidíte, aliasy sa skladajú z komponentov, z ktorých každý predstavuje špecifický prvok príkazu kubectl. Každý alias môže mať jeden komponent pre základný príkaz, operáciu a prostriedok a viacero komponentov pre parametre. Tieto komponenty jednoducho „osadíte“ zľava doprava podľa vyššie uvedenej schémy.

Aktuálny podrobný diagram je na GitHub. Tam tiež nájdete úplný zoznam aliasov.

Napríklad alias kgpooyamlall je ekvivalentný príkazu kubectl get pods -o yaml --all-namespaces.

Relatívne poradie volieb nie je dôležité: príkaz kgpooyamlall je ekvivalentné príkazu kgpoalloyaml.

Nemusíte používať všetky komponenty ako aliasy. Napríklad k, kg, klo, ksys, kgpo možno tiež použiť. Okrem toho môžete na príkazovom riadku kombinovať aliasy a bežné príkazy alebo možnosti:

napríklad:

  1. Namiesto toho kubectl proxy môžeš písať k proxy.
  2. Namiesto toho kubectl get roles môžeš písať kg roles (momentálne neexistuje žiadny alias pre zdroj rolí).
  3. Ak chcete získať údaje pre konkrétny modul, môžete použiť príkaz kgpo my-pod — kubectl get pod my-pod.

Upozorňujeme, že niektoré aliasy vyžadujú argument príkazového riadka. Napríklad alias kgpol rozumie kubectl get pods -l. Možnosť -l vyžaduje argument - špecifikáciu označenia. Ak použijete alias, bude to vyzerať takto kgpol app=ui.

Pretože niektoré aliasy vyžadujú argumenty, aliasy a, f a l sa musia použiť ako posledné.

Vo všeobecnosti, akonáhle sa s touto schémou oboznámite, môžete intuitívne odvodiť aliasy z príkazov, ktoré chcete vykonať, a ušetriť tak veľa času na písanie.

Inštalácia

Ak chcete nainštalovať aliasy kubectl, musíte si stiahnuť súbor .kubectl_aliases z GitHubu a zahrňte ho do súboru ~/.bashrc alebo ~/.zshrc:

source ~/.kubectl_aliases

Automatické dokončovanie

Ako sme už povedali, často pridávate ďalšie slová k aliasu na príkazovom riadku. Napríklad:

$ kgpooyaml test-pod-d4b77b989

Ak používate dokončovanie príkazov kubectl, pravdepodobne ste použili automatické dopĺňanie pre veci, ako sú názvy zdrojov. Dá sa to však urobiť, keď sa používajú aliasy?

Toto je veľmi dôležitá otázka, pretože ak automatické dopĺňanie nefunguje, prídete o niektoré výhody aliasov.

Odpoveď závisí od toho, ktorý shell používate:

  1. Pre Zsh funguje alias dokončenie hneď po vybalení.
  2. Pre Bash je, žiaľ, potrebná určitá práca, aby automatické dokončovanie fungovalo.

Povolenie automatického dopĺňania pre aliasy v Bash

Problém s Bash je v tom, že sa pokúša dokončiť (zakaždým, keď stlačíte Tab) alias, nie príkaz, na ktorý alias odkazuje (ako to robí napríklad Zsh). Keďže nemáte dokončovacie skripty pre všetkých 800 aliasov, automatické dopĺňanie nefunguje.

Projekt úplný alias poskytuje všeobecné riešenie tohto problému. Pripojí sa k mechanizmu dokončenia aliasu, interne rozšíri alias na príkaz a vráti možnosti dokončenia dokončeného príkazu. To znamená, že výplň pre alias sa správa úplne rovnako ako pre úplný príkaz.

V nasledujúcom texte najskôr vysvetlím, ako nainštalovať úplný alias a potom ho nakonfigurovať tak, aby umožnil dokončenie pre všetky aliasy kubectl.

Inštaluje sa úplný alias

Po prvé, úplný alias závisí od bash-dokončenie. Preto sa pred inštaláciou kompletného aliasu musíte uistiť, že je nainštalované dokončenie bash. Inštalačné pokyny boli poskytnuté skôr pre Linux a MacOS.

Dôležitá poznámka pre používateľov MacOS: Rovnako ako skript automatického dopĺňania kubectl, úplný alias nefunguje s Bash 3.2, ktorý je predvolený v systéme MacOS. Úplný alias závisí najmä od dokončenia bash v2 (brew install bash-completion@2), ktorý vyžaduje aspoň Bash 4.1. To znamená, že ak chcete použiť úplný alias v systéme MacOS, musíte si nainštalovať novšiu verziu Bash.

Musíte si stiahnuť skript bash_completion.sh z úložisko GitHub a zahrňte ho do svojho súboru ~/.bashrc:

source ~/bash_completion.sh

Po reštarte shellu sa úplne nainštaluje úplný alias.

Povolenie automatického dopĺňania pre aliasy kubectl

Technicky úplný alias poskytuje funkciu wrapper _complete_alias. Táto funkcia skontroluje alias a vráti tipy na dokončenie príkazu alias.

Ak chcete priradiť funkciu ku konkrétnemu aliasu, musíte použiť vstavaný mechanizmus Bash kompletný, inštalovať _complete_alias ako funkcia dopĺňania aliasov.

Ako príklad si vezmime alias k, čo znamená príkaz kubectl. inštalovať _complete_alias Ako doplnkovú funkciu pre tento alias by ste mali spustiť nasledujúci príkaz:

$ complete -F _complete_alias k

Výsledkom je, že kedykoľvek automaticky doplníte alias k, funkcia sa zavolá _complete_alias, ktorý skontroluje alias a vráti tipy na dokončenie príkazu kubectl.

Ako druhý príklad si vezmime alias kg, ktorý označuje kubectl get:

$ complete -F _complete_alias kg

Rovnako ako v predchádzajúcom príklade, keď automaticky dopĺňate kg, získate rovnaké rady na dokončenie, aké by ste dostali za kubectl get.

Všimnite si, že môžete použiť úplný alias pre akýkoľvek alias vo vašom systéme.

Preto, aby ste povolili automatické dopĺňanie pre všetky aliasy kubectl, musíte pre každý z nich spustiť vyššie uvedený príkaz. Nasledujúci úryvok robí presne toto, za predpokladu, že ste nastavili kubectl-aliases na ~/.kubectl-aliases:

for _a in $(sed '/^alias /!d;s/^alias //;s/=.*$//' ~/.kubectl_aliases); 
do
  complete -F _complete_alias "$_a"
done

Tento kus kódu je potrebné umiestniť do vášho ~/.bashrc, reštartujte príkazový shell a automatické dokončovanie bude dostupné pre všetkých 800 aliasov kubectl.

6. Rozšírenie kubectl pomocou pluginov

Počnúc od verzia 1.12, podporuje kubectl plugin mechanizmus, ktoré umožňujú rozširovať jeho funkcie o ďalšie príkazy.

Ak ste oboznámení s Mechanizmy doplnkov Git, potom sú na rovnakom princípe postavené pluginy kubectl.

V tejto kapitole sa budeme zaoberať tým, ako nainštalovať pluginy, kde ich nájsť a ako si vytvoriť vlastné pluginy.

Inštalácia doplnkov

Zásuvné moduly Kubectl sú distribuované ako jednoduché spustiteľné súbory s názvom like kubectl-x. Predpona kubectl- je povinný, za ktorým nasleduje nový čiastkový príkaz kubectl, ktorý vám umožní zavolať doplnok.

Napríklad doplnok hello bude distribuovaný ako súbor s názvom kubectl-hello.

Ak chcete nainštalovať doplnok, musíte skopírovať súbor kubectl-x do ľubovoľného adresára vo vašej PATH a urobte ho spustiteľným, napríklad pomocou chmod +x. Ihneď potom môžete zavolať plugin pomocou kubectl x.

Pomocou nasledujúceho príkazu môžete zobraziť zoznam všetkých doplnkov, ktoré sú aktuálne nainštalované vo vašom systéme:

$ kubectl plugin list

Tento príkaz tiež zobrazí upozornenia, ak máte viacero doplnkov s rovnakým názvom, alebo ak existuje súbor doplnkov, ktorý nie je spustiteľný.

Vyhľadanie a inštalácia doplnkov pomocou Krew

Zásuvné moduly Kubectl je možné zdieľať alebo opätovne použiť ako softvérové ​​balíky. Kde však nájdete doplnky, ktoré zdieľali iní?

Projekt Krew má za cieľ poskytnúť jednotné riešenie pre zdieľanie, vyhľadávanie, inštaláciu a správu zásuvných modulov kubectl. Projekt sa nazýva „správca balíkov pre kubectl pluginy“ (Krew je podobný variť).

Krew je zoznam doplnkov kubectl, ktoré si môžete vybrať a nainštalovať. Zároveň je Krew aj pluginom pre kubectl.

To znamená, že inštalácia Krew funguje v podstate ako inštalácia akéhokoľvek iného doplnku kubectl. Podrobné pokyny nájdete na stránka GitHub.

Najdôležitejšie príkazy Krew sú:

# Поиск в списке плагинов
$ kubectl krew search [<query>]
# Посмотреть информацию о плагине
$ kubectl krew info <plugin>
# Установить плагин
$ kubectl krew install <plugin>
# Обновить все плагины до последней версии
$ kubectl krew upgrade
# Посмотреть все плагины, установленные через Krew
$ kubectl krew list
# Деинсталлировать плагин
$ kubectl krew remove <plugin>

Upozorňujeme, že inštalácia pluginov pomocou Krew nezasahuje do inštalácie pluginov pomocou štandardnej metódy opísanej vyššie.

Upozorňujeme, že príkaz kubectl krew list zobrazuje iba doplnky, ktoré boli nainštalované pomocou Krew, zatiaľ čo príkaz kubectl plugin list uvádza všetky pluginy, to znamená tie nainštalované pomocou Krew a tie, ktoré sú nainštalované inými metódami.

Hľadanie pluginov inde

Krew je mladý projekt, momentálne vo svojom zoznam len asi 30 pluginov. Ak nemôžete nájsť to, čo potrebujete, môžete nájsť doplnky inde, napríklad GitHub.

Odporúčam pozrieť si sekciu GitHub kubectl-plugins. Nájdete tam desiatky dostupných pluginov, ktoré sa oplatí vyskúšať.

Písanie vlastných pluginov

môžete sami vytvárať pluginy - Nie je to ťažké. Musíte vytvoriť spustiteľný súbor, ktorý robí to, čo potrebujete, pomenujte ho kubectl-x a nainštalujte podľa vyššie uvedeného popisu.

Súbor môže byť bash skript, python skript alebo skompilovaná aplikácia GO – na tom nezáleží. Jedinou podmienkou je, že ho možno spustiť priamo v operačnom systéme.

Poďme si teraz vytvoriť príklad doplnku. V predchádzajúcej časti ste použili príkaz kubectl na vypísanie kontajnerov pre každú pod. Je jednoduché premeniť tento príkaz na plugin, ktorý môžete vyvolať napr. kubectl img.

Vytvorte súbor kubectl-img nasledujúci obsah:

#!/bin/bash
kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image'

Teraz urobte súbor spustiteľným s chmod +x kubectl-img a presuňte ho do ľubovoľného adresára vo vašej PATH. Ihneď potom môžete plugin použiť kubectl img.

Ako už bolo spomenuté, kubectl pluginy môžu byť napísané v akomkoľvek programovacom alebo skriptovacom jazyku. Ak používate skripty shell, výhodou je možnosť jednoduchého volania kubectl z pluginu. Môžete však napísať zložitejšie doplnky v skutočných programovacích jazykoch Klientska knižnica Kubernetes. Ak používate Go, môžete tiež použiť cli-runtime knižnica, ktorý existuje špeciálne na písanie zásuvných modulov kubectl.

Ako zdieľať svoje pluginy

Ak si myslíte, že vaše doplnky by mohli byť užitočné pre ostatných, pokojne ich zdieľajte na GitHub. Nezabudnite ich pridať do témy kubectl-plugins.

Môžete tiež požiadať o pridanie vášho pluginu zoznam Krew. Návod ako na to je v úložiská GitHub.

Dokončenie príkazu

Doplnky momentálne nepodporujú automatické dopĺňanie. To znamená, že musíte zadať celý názov doplnku a celé názvy argumentov.

Repozitár GitHub kubectl pre túto funkciu má otvorená žiadosť. Je teda možné, že táto funkcia bude implementovaná niekedy v budúcnosti.

Veľa štastia!!!

Čo si ešte prečítať k téme:

  1. Tri úrovne automatického škálovania v Kubernetes a ako ich efektívne používať.
  2. Kubernetes v duchu pirátstva so šablónou na implementáciu.
  3. Náš kanál Okolo Kubernetes v telegrame.

Zdroj: hab.com

Pridať komentár