
Ak pracujete s Kubernetes, pravdepodobne je kubectl jedným z najpoužívanejších nástrojov. A zakaždým, keď strávite veľa času prácou s konkrétnym nástrojom, stojí za to sa ho dôkladne naučiť a efektívne využívať.
Tím preložila článok Daniela Weibela, v ktorom nájdete rady a tipy na efektívnu prácu s kubectl. Pomôže vám tiež hĺbšie pochopiť fungovanie Kubernetes.
Podľa autora je cieľom článku spraviť vašu každodennú prácu s Kubernetes nielen efektívnejšou, ale aj príjemnejšou!
Úvod: čo je kubectl
Predtým, ako sa naučíte používať kubectl efektívnejšie, je potrebné získať základné porozumenie tomu, čo to je a ako funguje.
Z pohľadu používateľa je kubectl ovládací panel, ktorý umožňuje vykonávať operácie Kubernetes.
Z technického hľadiska je kubectl klientom Kubernetes API.
Kubernetes API je HTTP REST API. Toto API je skutočným používateľským rozhraním Kubernetes, prostredníctvom ktorého je plne ovládané. To znamená, že každá operácia Kubernetes je reprezentovaná ako koncový bod API a môže byť vykonaná pomocou HTTP požiadavky na tento koncový bod.
Dôsledkom toho je hlavnou úlohou kubectl vykonávať HTTP požiadavky na API Kubernetes:

Kubernetes je plne zdrojovo orientovaný systém. To znamená, že podporuje vnútorný stav zdrojov a všetky operácie Kubernetes sú operáciami CRUD.
Úplne kontrolujete Kubernetes tak, že spravujete tieto zdroje, a Kubernetes zisťuje, čo robiť, na základe aktuálneho stavu zdrojov. Z tohto dôvodu je odkaz na API Kubernetes usporiadaný vo forme zoznamu typov zdrojov s priradenými operáciami.
Pozrime sa na príklad.
Predpokladajme, že chcete vytvoriť zdroj ReplicaSet. Aby ste to dosiahli, popíšete ReplicaSet v súbore s názvom replicaset.yaml, potom spustíte príkaz:
$ kubectl create -f replicaset.yamlVýsledkom bude vytvorenie zdroja ReplicaSet. Ale čo sa deje za kulisami?
V Kubernetes existuje operácia vytvorenia ReplicaSet. Rovnako ako akákoľvek iná operácia, táto je poskytnutá ako koncový bod API. Konkrétny koncový bod API pre túto operáciu vyzerá takto:
POST /apis/apps/v1/namespaces/{namespace}/replicasetsKoncové body API všetkých operácií Kubernetes nájdete v vrátane ). Aby ste vykonali skutočný dopyt na koncový bod, musíte predtým pridať URL adresu servera API k cestám koncového bodu, ktoré sú uvedené v príručke k API.
Preto, keď vykonáte vyššie uvedený príkaz, kubectl odošle HTTP dopyt POST na vyššie uvedený koncový bod API. Definícia ReplicaSet, ktorú ste zadali v súbore replicaset.yaml, sa odovzdáva v tele dopytu.
Takto funguje kubectl pre všetky príkazy, ktoré interagujú s klastrom Kubernetes. Vo všetkých týchto prípadoch kubectl jednoducho posiela HTTP dopyty na príslušné koncové body API Kubernetes.
Všimnite si, že Kubernetes môže byť plne spravovaný pomocou nástroja ako je curl, pričom manuálne odosielate HTTP dopyty do API Kubernetes. Kubectl jednoducho zjednodušuje používanie API Kubernetes.
To sú základy toho, čo je kubectl a ako funguje. Ale existuje ešte niečo o API Kubernetes, čo by mal každý užívateľ kubectl vedieť. Poďme sa stručne ponoriť do vnútorného sveta Kubernetes.
Vnútorný svet Kubernetes
Kubernetes pozostáva zo súboru nezávislých komponentov, ktoré bežia ako samostatné procesy na uzloch klastru. Niektoré komponenty bežia na hlavných uzloch, iné na pracovných uzloch, pričom každý komponent vykonáva svoju špeciálnu úlohu.
Tu sú najdôležitejšie komponenty na hlavných uzloch:
- Úložisko — uchováva definície zdrojov ().
- API server — poskytuje API a spravuje úložisko.
- Správca kontrolórov — zabezpečuje, že stavy zdrojov sú v súlade so špecifikáciami.
- Plánovač — plánuje pod-y na pracovných uzloch.
A tu je jeden z najdôležitejších komponentov na pracovných uzloch:
- Kubelet — spravuje spúšťanie kontajnerov na pracovnom uzle.
Aby sme pochopili, ako tieto komponenty spolupracujú, zvážme príklad.
Povedzme, že ste práve vykonali kubectl create -f replicaset.yaml, po čom kubectl urobil HTTP dopyt POST na (posielajúc definíciu zdroja ReplicaSet).
Čo sa deje v klastru?
- Po vykonaní
kubectl create -f replicaset.yamlAPI server uloží definíciu vášho zdroja ReplicaSet do úložiska:
- Následne sa spustí kontrolér ReplicaSet v správcovi kontrolórov, ktorý zabezpečuje vytváranie, úpravy a mazanie zdrojov ReplicaSet:

- Kontrolér ReplicaSet vytvára definíciu podu pre každú replikáciu ReplicaSet (podľa šablóny podu v definícii ReplicaSet) a uchováva ich v úložisku:

- Štartuje plánovač, ktorý sleduje pody, ktoré ešte neboli priradené žiadnemu pracovnú uzlu:

- Plánovač vyberie vhodný pracovný uzol pre každý pod a pridá tieto informácie do definície podu v úložisku:

- Na pracovnom uzle, ktorému je priradený pod, sa spustí Kubelet, ktorý sleduje pody, pridelené tomuto uzlu:

- Kubelet načíta definíciu podu z úložiska a dá príkazy prostrediu na spúšťanie kontajnerov, ako napríklad Docker, na uzle:

Nižšie je textová verzia tohto opisu.
API požiadavka na koncový bod na vytvorenie ReplicaSetu je spracovávaná serverom API. Server API autentizuje požiadavku a uloží definíciu zdroja ReplicaSetu do úložiska.
Tento jav spúšťa kontrolér ReplicaSetu, ktorý je podradným procesom správcu kontrolérov. Kontrolér ReplicaSetu sleduje vytváranie, aktualizáciu a odstraňovanie zdrojov ReplicaSetu v úložisku a dostáva oznámenie o udalosti, keď k tomu dôjde.
Úlohou kontroléra ReplicaSetu je zabezpečiť, aby existoval požadovaný počet podov repliky ReplicaSetu. V našom príklade podov zatiaľ neexistuje, a tak kontrolér ReplicaSetu vytvára tieto definície podov (podľa šablóny podu v definícii ReplicaSetu) a uloží ich do úložiska.
Vytvorenie nových podov spúšťa plánovač, ktorý sleduje definície podov, ktoré ešte nie sú naplánované pre pracovné uzly. Plánovač vyberie vhodný pracovný uzol pre každý pod a aktualizuje definície podu v úložisku.
Upozorňujeme, že do tohto okamihu sa v klastere nikde nevykonával kód pracovnej záťaže. Všetko, čo bolo doteraz urobené, — je vytvorenie a aktualizácia zdrojov v úložisku na hlavnom uzle.
Posledná udalosť spúšťa Kubelet, ktorý sleduje pody, naplánované pre ich pracovné uzly. Kubelet pracovného uzla, pre ktorý sú nastavené vaše pody ReplicaSetu, musí nariadiť prostrediu na spúšťanie kontajnerov, ako napríklad Docker, aby načítal požadované obrazy kontajnerov a spustil ich.
V tomto okamihu je konečne vaša aplikácia ReplicaSet spustená!
Úloha API Kubernetes
Ako ste videli v predchádzajúcom príklade, komponenty Kubernetes (okrem servera API a úložiska) sledujú zmeny zdrojov v úložisku a upravujú informácie o zdrojoch v úložisku.
Samozrejme, tieto komponenty nekomunikujú so skladom priamo, ale iba prostredníctvom Kubernetes API.
Pozrime sa na nasledujúce príklady:
- Kontrolér ReplicaSet využíva koncový bod API s parametrom
sledovaťna sledovanie zmien v zdrojoch ReplicaSet. - Kontrolér ReplicaSet využíva koncový bod API (vytvoriť pod) na vytvorenie podov.
- Plánovač využíva koncový bod API (upraviť pod) na aktualizáciu podov s informáciami o vybranej pracovnej nódě.
Ako vidíte, ide o to isté API, ku ktorému pristupuje kubectl. Používanie rovnakého API na interakciu s internými komponentmi a externými používateľmi je základným princípom návrhu Kubernetes.
Teraz môžeme zhrnúť, ako Kubernetes funguje:
- Sklad ukladajúci stav, teda zdroje Kubernetes.
- API server poskytuje rozhranie k skladu vo forme Kubernetes API.
- Všetky ostatné komponenty a používatelia Kubernetes čítajú, sledujú a manipulujú so stavom (zdrojmi) Kubernetes prostredníctvom API.
Poznanie týchto konceptov pomôže lepšie pochopiť kubectl a maximálne ho využiť.
Teraz sa pozrime na niekoľko konkrétnych tipov a trikov, ktoré pomôžu zvýšiť efektivitu práce s kubectl.
1. Rýchlejšie zadávanie pomocou doplnenia príkazov
Jednou z najúčinnejších, no často prehliadaných techník, ktoré zvyšujú efektivitu práce s kubectl, je doplnenie príkazov.
Doplnenie príkazov umožňuje automaticky vypĺňať jednotlivé časti príkazov kubectl stlačením klávesu Tab. Funguje to pre subpríkazy, možnosti a argumenty, vrátane zložitých názvov zdrojov.
Pozrite sa, ako funguje doplnenie príkazov kubectl:

Doplnenie príkazov funguje pre príkazové shell-y Bash a Zsh.
obsahuje podrobné pokyny na nastavenie automatického doplnenia, ale nižšie uvádzame stručný prehľad.
Ako funguje doplnenie príkazov
Doplnenie príkazov je funkcia shellu, ktorá funguje prostredníctvom skriptu doplnenia. Skript doplnenia je skript shellu, ktorý určuje správanie doplnenia pre konkrétny príkaz.
Kubectl automaticky generuje a vypisuje skripty doplnenia pre Bash a Zsh pomocou nasledujúcich príkazov:
$ kubectl completion bashAlebo:
$ kubectl completion zshTeoreticky — stačí pripojiť výstup týchto príkazov do príslušného príkazového shellu, aby kubectl mohol dopĺňať príkazy.
V praxi sa spôsob pripojenia líši pre Bash (vrátane rozdielov medzi Linuxom a MacOS) a Zsh. Nižšie si prejdeme všetky tieto možnosti.
Bash na Linuxe
Skript pre doplnenie pre Bash závisí od balíka bash-completion, takže ho najprv treba nainštalovať:
$ sudo apt-get install bash-completionAlebo:
$ yum install bash-completionMôžete otestovať, že balík bol úspešne nainštalovaný pomocou nasledujúceho príkazu:
$ type _init_completion Ak sa v tomto prípade zobrazuje kód funkcie shellu, tak je bash-completion správne nainštalovaný. Ak príkaz vyhodí chybu 'Nenašiel sa', je potrebné pridať nasledujúcu riadok do vášho súboru ~ /.bashrc:
$ source /usr/share/bash-completion/bash_completion Či je potrebné pridať tento riadok do súboru ~ /.bashrc alebo nie, závisí od správcu balíkov, ktorého ste použili na inštaláciu bash-completion. Pre APT je to nevyhnutné, pre YUM nie.
Po nainštalovaní bash-completion je potrebné všetko nastaviť tak, aby bol skript pre doplnenie kubectl zahrnutý vo všetkých reláciách shellu.
Jeden zo spôsobov, ako to spraviť, je pridať nasledujúcu riadok do súboru ~ /.bashrc:
source <(kubectl completion bash) Ďalší spôsob je pridať skript pre doplnenie kubectl do adresára /etc/bash_completion.d (vytvorte ho, ak neexistuje):
$ kubectl completion bash > /etc/bash_completion.d/kubectl Všetky skripty pre doplnenie v adresári /etc/bash_completion.d sa automaticky zahrnú do bash-completion.
Obe možnosti sú rovnako použiteľné.
Po reštartovaní príkazového shellu bude autocompletion príkazov kubectl fungovať.
Bash na MacOS
Na MacOS je nastavenie o niečo zložitejšie. Faktom je, že predvolene je v MacOS nainštalovaná verzia Bash 3.2, a skript autocompletion kubectl vyžaduje verziu Bash nie nižšiu ako 4.1 a nefunguje vo verzii Bash 3.2.
Používanie zastaranej verzie Bash v MacOS súvisí s otázkami licencovania. Bash verzie 4 je distribuovaný pod licenciou GPLv3, ktorú Apple nepodporuje.
Na nastavenie autocompletion kubectl na MacOS je potrebné nainštalovať novšiu verziu Bash. Môžete tiež nainštalovať aktualizovaný Bash ako predvolený shell, čo v budúcnosti zabráni množstvu problémov. Nie je to ťažké, detaily sú uvedené v článku '».
Predtým, než pokračujete, uistite sa, že používate čerstvú verziu Bash (skontrolujte výstup bash --version).
Skript pre autocompletion v Bash závisí od projektu , preto ho najprv musíte nainštalovať.
Môžete nainštalovať bash-completion pomocou :
$ brew install bash-completion@2 Tu @2 označuje bash-completion verzie 2. Automatické dopĺňanie kubectl vyžaduje bash-completion v2, a bash-completion v2 vyžaduje verziu Bash minimálne 4.1.
Výstup príkazu brew-install obsahuje sekciu Caveats, v ktorej je uvedené, že treba pridať do súboru ~/ .bash_profile:
export BASH_COMPLETION_COMPAT_DIR=\/usr\/local\/etc\/bash_completion.d\n[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . \n"/usr/local/etc/profile.d/bash_completion.sh" Odporúčam však pridávať tieto riadky nie do ~/ .bash_profile, a v ~~/.bashrc. V tomto prípade bude automatické dopĺňanie dostupné nielen v hlavnom, ale aj v podriadených príkazových shellech.
Po reštartovaní príkazového shellu môžete skontrolovať správnosť inštalácie pomocou nasledujúceho príkazu:
$ type _init_completionAk vo výstupe vidíte shell-funkciu, všetko je nastavené správne.
Teraz je potrebné spraviť, aby automatické dopĺňanie kubectl bolo zapnuté vo všetkých reláciách.
Jedným zo spôsobov je pridať nasledujúci riadok do vášho ~~/.bashrc:
source <(kubectl completion bash) Druhý spôsob je pridať skript automatického dopĺňania do priečinka /usr/local/etc/bash_completion.d:
$ kubectl completion bash\n>/usr/local/etc/bash_completion.d/kubectlTento spôsob bude fungovať, iba ak ste inštalovali bash-completion pomocou Homebrew. V takom prípade bash-completion načíta všetky skripty z tejto adresára.
Ak ste inštalovali , nie je potrebné vykonať predchádzajúci krok, pretože skript automatického dopĺňania bude automaticky umiestnený do priečinka /usr/local/etc/bash_completion.d počas inštalácie. V tomto prípade automatické dopĺňanie kubectl začne fungovať hneď, ako nainštalujete bash-completion.
V konečnom dôsledku sú všetky tieto možnosti ekvivalentné.
Zsh
Skripty automatického dopĺňania pre Zsh nevyžadujú žiadne závislosti. Všetko, čo potrebujete, je ich zapnúť pri načítaní príkazového shellu.
Môžete to urobiť pridaním riadku do vášho ~/.zshrc súboru:
source <(kubectl completion zsh) Ak ste dostali chybu not found: compdef po reštartovaní vášho shellu, je potrebné zapnúť vstavanú funkciu compdef. Môžete ju zapnúť pridaním na začiatok vášho súboru ~/.zshrc nasledujúce:
autoload -Uz compinit\ncompinit2. Rýchly prehľad špecifikácií zdrojov
Keď vytvárate definície zdrojov YAML, potrebujete poznať polia a ich hodnoty pre tieto zdroje. Jedným z miest, kde hľadať tieto informácie, je v príručke k API, ktorá obsahuje úplné špecifikácie všetkých zdrojov.
Avšak prepínať sa na webový prehliadač zakaždým, keď potrebujete niečo hľadať, je nepohodlné. Preto kubectl poskytuje príkaz kubectl vysvetliť, ktorý zobrazuje špecifikácie všetkých zdrojov priamo vo vašom termináli.
Formát príkazu je nasledovný:
$ kubectl explain resource[.field]...Tím zobrazí specifikaci požadovaného zdroje nebo pole. Zobrazované informace jsou identické s těmi, které jsou obsaženy v API dokumentaci.
Predvolene kubectl vysvetliť ukazuje pouze první úroveň vnoření polí.
Podívejte se, jak to vypadá .
Můžete zobrazit celé stromové struktury, pokud přidáte možnost --recursive:
$ kubectl explain deployment.spec --recursivePokud přesně nevíte, jaké zdroje potřebujete, můžete je zobrazit všechny následujícím příkazem:
$ kubectl api-resources Tento příkaz zobrazuje názvy zdrojů v množném čísle, například nasadenia namiesto deployment. Také zobrazuje zkrácený název, například deploy, pro ty zdroje, u kterých je k dispozici. Nemějte obavy o tyto rozdíly. Všechny tyto varianty názvů jsou ekvivalentní pro kubectl. To znamená, že můžete použít jakékoli z nich pro kubectl vysvetliť.
Všechny níže uvedené příkazy jsou rovnocenné:
$ kubectl explain deployments.spec
# nebo
$ kubectl explain deployment.spec
# nebo
$ kubectl explain deploy.spec3. Použijte vlastní formát výstupu sloupců
Ve výchozím nastavení formát výstupu pří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 78dTento formát je pohodlný, ale obsahuje omezené množství informací. Ve srovnání s úplným formátem definice zdroje se zde zobrazuje pouze několik polí.
V takovém případě můžete použít vlastní formát výstupu sloupců. Umožňuje vám definovat, jaká data se mají zobrazit. Můžete zobrazit jakékoli pole zdroje jako samostatný sloupec.
Použití vlastního formátu se určuje pomocí možností:
-o custom-columns=:[,:]... Můžete definovat každý sloupec výstupu jako pár , kde — název sloupce, a <jsonpath> — výraz, který určuje pole zdroje.
Podívejme se na jednoduchý příklad:
$ kubectl get pods -o custom-columns='NAME:metadata.name'
NAME
engine-544b6b6467-22qr6
engine-544b6b6467-lw5t8
engine-544b6b6467-tvgmg
web-ui-6db964458-8pdw4Výstup obsahuje jeden sloupec s názvy podů.
Výraz v možnosti vybírá názvy podů z pole metadata.name. To protože název podu je určen v potomkovém poli name pole metadata v popisu zdroje podu. Podrobněji se lze seznámit v nebo zadejte příkaz kubectl explain pod.metadata.name.
Predpokladajme, že chcete pridať ďalší stĺpec do výstupu, napríklad zobrazujúci uzol, na ktorom beží každý pod. Na to môžete jednoducho pridať príslušnú špecifikáciu stĺpca do voľby 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 pod priradený uzlu, jeho názov je zapísaný v poli spec.nodeName špecifikácie zdroja podu. Podrobnejšie informácie nájdete vo výstupe kubectl explain pod.spec.nodeName.
Majte na pamäti, že polia zdrojov Kubernetes sú citlivé na veľké písmená.
Môžete zobraziť akékoľvek pole zdroja ako stĺpec. Jednoducho si prezrite špecifikáciu zdroja a experimentujte s akýmikoľvek poľami, ktoré sa vám páčia.
Ale najprv sa pozrime podrobnejšie na výrazy na výber polí.
Výrazy JSONPath
Výrazy na výber polí zdrojov sú založené na .
JSONPath je jazyk na načítanie údajov z dokumentov JSON. Výber jedného poľa je najjednoduchší spôsob použitia JSONPath. Má oveľa , vrátane selektorov, filtrov a podobne.
Kubectl explain podporuje obmedzený rozsah možností JSONPath. Nasledujúce 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'Osobitný význam má operátor []. Mnohými polia zdrojov Kubernetes sú zoznamy, a tento operátor umožňuje vyberať prvky týchto zoznamov. Často sa používa so zástupným znakom ako [*], aby sa vybrali všetky prvky zoznamu.
Príklady použitia
Možnosti použitia vlastného formátu výstupu stĺpcov sú nekonečné, keďže môžete zobraziť akékoľvek pole alebo kombináciu polí zdroja vo výstupe. Tu je niekoľko príkladov aplikácií, ale nebojte sa preskúmať ich samostatne a nájsť užitočné aplikácie pre vás.
- Zobrazenie obrazov kontajnerov pre pod:
$ 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 wordpressTento príkaz zobrazuje názvy obrazov kontajnerov pre každý pod.
Pamätajte, že pod môže obsahovať niekoľko kontajnerov, takže názvy obrazov budú zobrazené v jednom riadku, oddelené čiarkou.
- Zobrazenie zón 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-1bTento príkaz sa hodí, ak je váš klaster umiestnený v verejnom cloude. Zobrazuje zónu dostupnosti pre každý uzol.
Zóna dostupnosti je koncept v cloude, ktorý obmedzuje zónu replikácie na geografický región.
Zóny dostupnosti pre každý uzol sa získavajú prostredníctvom špeciálnej značky — . Ak je klaster spustený vo verejnom cloude, táto značka sa vytvára automaticky a vyplňuje názvami zón dostupnosti pre každý uzol.
Značky nie sú súčasťou špecifikácie zdrojov Kubernetes, takže o nich nenájdete informácie v . Avšak ich môžete vidieť (rovnako ako všetky ostatné značky), ak požiadate o informácie o uzloch vo formáte YAML alebo JSON:
$ kubectl get nodes -o yaml # alebo $ kubectl get nodes -o jsonJe to skvelý spôsob, ako sa dozvedieť viac o zdrojoch, okrem skúmania špecifikácií zdrojov.
4. Jednoduché prepínanie medzi klastrami a menovými priestormi
Keď kubectl vykonáva požiadavku na Kubernetes API, najprv číta súbor kubeconfig, aby získal všetky potrebné parametre na pripojenie.
Predvolený súbor kubeconfig je ~/.kube/config. Obvykle sa tento súbor vytvára alebo aktualizuje špeciálnym príkazom.
Keď pracujete s viacerými klastrami, váš súbor kubeconfig obsahuje parametre pripojenia ku všetkým týmto klastram. Potrebujete spôsob, ako príkazu kubectl povedať, s ktorým konkrétnym klastrom pracujete.
Vo vnútri klastra môžete vytvoriť niekoľko menových priestorov — druh virtuálneho klastra vo vnútri fyzického klastra. Kubectl určuje, ktorý menový priestor použiť tiež na základe údajov zo súboru kubeconfig. To znamená, že potrebujete aj spôsob, ako príkazu kubectl povedať, s ktorým menovým priestorom pracovať.
V tejto kapitole si povieme, ako to funguje a ako dosiahnuť efektívne fungovanie.
Upozorňujeme, že môžete mať viacero súborov kubeconfig, ktoré sú uvedené v premennej prostredia KUBECONFIG. V takom prípade budú všetky tieto súbory zlúčené do jednej spoločnej konfigurácie pri vykonávaní. Môžete tiež zmeniť predvolený súbor kubeconfig spustením kubectl s parametrom --kubeconfig. Pozrite sa na .
Súbory kubeconfig
Poďme sa pozrieť, čo presne obsahuje súbor kubeconfig:

Ako vidíte, súbor kubeconfig obsahuje množinu kontextov. Kontext pozostáva z troch prvkov:
- Cluster — URL API servera klastra.
- User — overovacie údaje používateľa v klastri.
- Namespace — názvový priestor používaný pri pripojení ku klastru.
V praxi sa často používa jeden kontext na klaster vo vašom súbore kubeconfig. Môžete mať však aj viacero kontextov na klaster, ktoré sa líšia podľa používateľa alebo názvového priestoru. Takáto konfigurácia s viacerými kontextami sa však málokedy vyskytuje, takže zvyčajne existuje vzájomné jednoznačné priradenie medzi klastra a kontextami.
V každom okamihu je jeden z kontextov aktuálny:

Keď kubectl číta konfiguračný súbor, vždy sa berie informácia z aktuálneho kontextu. V uvedenom príklade sa kubectl pripojí ku klastru Hare.
Aby ste sa teda prepli na iný klaster, musíte zmeniť aktuálny kontext v súbore kubeconfig:

Teraz sa kubectl pripojí ku klastru Fox.
Aby ste sa prepli na iný názvový priestor v tom istom klastri, musíte zmeniť hodnotu prvku namespace pre aktuálny kontext:

Vo vyššie uvedenom príklade bude kubectl využívať názvový priestor Prod klastra Fox (predtým bol nastavený názvový priestor Test).
Upozorňujeme, že kubectl tiež poskytuje parametre --cluster, --user, --namespace a --context, ktoré umožňujú prepísať jednotlivé prvky a aktuálny kontext, nezávisle od toho, čo je nastavené v súbore kubeconfig. Pozrite sa na kubectl options.
Teoreticky môžete ručne meniť parametre v súbore kubeconfig. Ale je to nepohodlné. Na zjednodušenie týchto operácií existujú rôzne nástroje, ktoré umožňujú meniť parametre automaticky.
Použite kubectx
Veľmi populárny nástroj na prepínanie medzi klastrami a názvovými priestormi.
Nástroj poskytuje príkazy kubectx a kubens na zmenu aktuálneho kontextu a priestoru mien podľa toho.
Ako už bolo spomenuté, zmena aktuálneho kontextu znamená zmenu klasteru, ak máte iba jeden kontext na klaster.
Tu je príklad vykonania týchto príkazov:

V podstate tieto príkazy jednoducho upravujú súbor kubeconfig, ako bolo popísané vyššie.
Aby ste nainštalovali kubectx, postupujte podľa pokynov na
Obidva príkazy podporujú automatické doplňovanie názvov kontextov a priestorov mien, čo umožňuje nevyžadovať ich úplný vstup. Pokyny na nastavenie automatického doplňovania .
Ďalšou užitočnou funkciou kubectx je . Funguje spolu s utilitou , ktorú je potrebné inštalovať osobitne. Inštalácia fzf automaticky sprístupňuje interaktívny režim v kubectx. V interaktívnom režime môžete vyberať kontext a priestor mien prostredníctvom interaktívneho rozhrania slobodného vyhľadávania, ktoré poskytuje fzf.
Používanie aliasov príkazového riadku
Nemusíte mať osobitné nástroje na zmenu aktuálneho kontextu a priestoru mien, pretože kubectl tiež poskytuje príkazy na to. Takže príkaz kubectl config ponúka podpríkazy na úpravu súborov kubeconfig.
Tu sú niektoré z nich:
kubectl config get-contexts: zobraziť všetky kontexty;kubectl config current-context: získať aktuálny kontext;kubectl config use-context: zmeniť aktuálny kontext;kubectl config set-context: zmeniť prvok kontextu.
Avšak používanie týchto príkazov priamo nie je veľmi pohodlné, pretože sú dlhé. Môžete pre ne vytvoriť aliasy príkazového riadku, ktoré sú ľahko vykonateľné.
Vytvoril som sadu aliasov na základe týchto príkazov, ktoré poskytujú funkčnosť podobnú kubectx. Tu môžete vidieť ich činnosť:

Upozorňujeme, že aliasy používajú fzf na poskytovanie interaktívneho rozhrania slobodného vyhľadávania (ako v interaktívnom režime kubectx). To znamená, že musíte , aby ste mohli používať tieto aliasy.
Tu sú samotné definície 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/^..//")"' Aby ste nainštalovali tieto aliasy, musíte pridať uvedené definície do svojho súboru ~~/.bashrc alebo ~/.zshrc a znovu načítať vašu shell.
Používanie pluginov
Kubectl umožňuje načítať pluginy, ktoré sa vykonávajú rovnako ako hlavné príkazy. Môžete napríklad nainštalovať plugin kubectl-foo a spúšťať ho vykonaním príkazu kubectl foo.
Bolo by pohodlné meniť kontext a priestor názvov takýmto spôsobom, napríklad spustením kubectl ctx na zmenu kontextu a kubectl ns na zmenu priestoru názvov.
Napísal som dva pluginy, ktoré to robia:
Funkcia pluginov je založená na aliasoch z predchádzajúcej sekcie.
Tu je, ako fungujú:

Všimnite si, že pluginy používajú fzf na poskytnutie interaktívneho rozhrania pre voľné vyhľadávanie (ako v interaktívnom režime kubectx). To znamená, že potrebujete, aby ste mohli používať tieto aliasy.
Aby ste nainštalovali pluginy, musíte stiahnuť skripty shell s menami a do akéhokoľvek adresára vo vašej premennej PATH a sprístupniť ich ako vykonateľné, napríklad pomocou chmod +x. Hneď po tom budete môcť používať kubectl ctx a kubectl ns.
5. Skrátenie vstupu s autoaliasmi
Alias v príkazovom riadku je skvelá príležitosť na zrýchlenie vstupu. Projekt obsahuje približne 800 skratiek pre základné príkazy kubectl.
Môžete sa diviť — ako si zapamätať 800 aliasov? Ale nemusíte pamätať všetky, pretože sa budujú podľa jednoduchého vzoru, ktorý je uvedený nižšie:

Napríklad:
- kgpooyaml — kubectl get pods oyaml
- ksysgsvcw — kubectl -n kube-system get svc w
- ksysrmcm — kubectl -n kube-system rm cm
- kgdepallsl — kubectl get deployment all sl
Ako vidíte, aliasy pozostávajú z komponentov, z ktorých každý označuje určitý prvok príkazu kubectl. Každý alias môže mať jednu zložku pre základný príkaz, operáciu a zdroj a niekoľko zložiek pre parametre. Jednoducho „vyplňujete“ tieto komponenty zľava doprava podľa uvedeného vzoru.
Aktuálny podrobný vzor sa nachádza na . Tam tiež nájdete.
Napríklad alias kgpooyamlall je ekvivalentný príkazu kubectl get pods -o yaml --all-namespaces.
Relatívny poradok možností nie je dôležitý: príkaz kgpooyamlall je ekvivalentný príkazu kgpoalloyaml.
Nemusíte používať všetky zložky ako aliasy. Napríklad k, kg, klo, ksys, kgpo môžu byť tiež použité. Navyše môžete kombinovať aliasy s bežnými príkazmi alebo možnosťami v príkazovom riadku:
Napríklad:
- Namiesto
kubectl proxymôžete napísaťk proxy. - Namiesto
kubectl get rolesmôžete napísaťkg roles(v súčasnosti neexistuje alias pre zdroj Roles). - Aby ste získali údaje o konkrétnom pode, môžete použiť príkaz
kgpo my-pod — kubectl get pod my-pod.
Berúc do úvahy, že niektoré aliasy vyžadujú argument v príkazovom riadku. Napríklad alias kgpol znamená kubectl get pods -l. Možnosť -l vyžaduje argument – špecifikáciu značky. Ak používate alias, bude vyzerať ako kgpol app=ui.
Pretože niektoré aliasy vyžadujú argumenty, aliasy a, f a l by sa mali používať ako posledné.
Celkovo, akonáhle zvládnete tento systém, dokážete intuitívne odvodiť aliasy z príkazov, ktoré chcete vykonať, a ušetriť si tak veľa času pri vstupe.
Inštalácia
Ak chcete nainštalovať kubectl-aliases, musíte si stiahnuť súbor z GitHubu a zahrnúť ho do súboru ~~/.bashrc alebo ~/.zshrc:
source ~/ .kubectl_aliasesAutomatické doplňovanie
Ako sme už povedali, často k aliasu pridávate ďalšie slová v príkazovom riadku. Napríklad:
$ kgpooyaml test-pod-d4b77b989Ak používate automatické doplňovanie príkazu kubectl, pravdepodobne ste už používali automatické doplňovanie pre také veci ako názvy zdrojov. Ale je možné to spraviť, keď sú použité aliasy?
Toto je veľmi dôležitá otázka, pretože ak automatické doplňovanie nefunguje, prídete o časť výhod aliasov.
Odpoveď závisí od toho, aký príkazový shell používate:
- Pre Zsh automatické doplňovanie pre aliasy funguje „priamo z krabice“.
- Pre Bash je, bohužiaľ, potrebné vykonať niektoré kroky, aby automatické doplňovanie fungovalo.
Povolenie automatického doplňovania pre aliasy v Bashi
Problém s Bashom je, že sa snaží doplniť (kedykoľvek stlačíte Tab) alias, namiesto príkazu, na ktorý sa alias odkazuje (ako to robí Zsh). Keďže nemáte skripty na doplňovanie pre všetkých 800 aliasov, automatické doplňovanie nefunguje.
Projekt ponúka všeobecné riešenie tohto problému. Pripojuje sa k mechanizmu doplňovania pre aliasy, dovnútra doplní alias na príkaz a vráti možnosti doplnenia pre doplnený príkaz. To znamená, že doplnenie pre alias sa správa presne tak isto, ako pre kompletný príkaz.
Následne najprv vysvetlím, ako nainštalovať complete-alias, a potom, ako ho nastaviť, aby sa povolilo doplnenie pre všetky aliasy kubectl.
Inštalácia complete-alias
Najprv, complete-alias závisí od . Preto pred inštalovaním complete-alias je potrebné zabezpečiť, aby bol bash-completion nainštalovaný. Pokyny na inštaláciu boli predtým uvedené pre Linux a MacOS.
Dôležitá poznámka pre používateľov MacOS: ako aj skript automatického doplňovania kubectl, complete-alias nefunguje s Bash 3.2, ktorý je predvolene používaný v MacOS. Konkrétne, complete-alias závisí od bash-completion v2 (brew install bash-completion@2), pre ktorý je potrebný minimálne Bash 4.1. To znamená, že na používanie complete-alias v MacOS musíte nainštalovať novšiu verziu Bash.
Musíte si stiahnuť skript z a zahrnúť ho do svojho súboru ~~/.bashrc:
source ~/bash_completion.shPo reštartovaní príkazového rozhrania bude complete-alias úplne nainštalované.
Aktivácia automatického doplnenia pre aliasy kubectl
Technicky complete-alias poskytuje funkciu shellu _complete_alias. Táto funkcia kontroluje alias a vracia návrhy doplnenia pre príkaz aliasu.
Na priradenie funkcie k určitým aliasom je potrebné použiť zabudovaný mechanizmus Bash , aby ste nastavili _complete_alias ako funkciu doplnenia aliasu.
Ako príklad si vezmime alias k, ktorý predstavuje príkaz kubectl. Aby ste nastavili _complete_alias ako funkciu doplnenia pre tento alias, musíte vykonať nasledujúci príkaz:
$ complete -F _complete_alias k Výsledkom je, že zakaždým, keď automaticky doplníte alias k, sa vyvolá funkcia _complete_alias, ktorá kontroluje alias a vracia návrhy doplnenia pre príkaz kubectl.
Ako druhý príklad vezmime alias kg, ktorý predstavuje kubectl get:
$ complete -F _complete_alias kg Podobne ako v predchádzajúcom príklade, keď automaticky doplníte kg, dostanete tie isté návrhy doplnenia, ktoré by ste dostali pre kubectl get.
Všimnite si, že takto je možné použiť complete-alias pre akýkoľvek alias vo vašom systéme.
Preto, aby ste aktivovali automatické doplnenie pre všetky aliasy kubectl, musíte vykonať vyššie uvedený príkaz pre každý z nich. Nasledujúci úryvok to robí presne, za predpokladu, že ste nainštalovali kubectl-aliases do ~/ .kubectl-aliases:
for _a in $(sed '/^alias /!d;s/^alias //;s/=.*$//' ~/ .kubectl_aliases);
do
complete -F _complete_alias "$_a"
done Tento kus kódu treba umiestniť do vášho ~~/.bashrc, reštartovať príkazové rozhranie a pre všetkých 800 aliasov kubectl bude dostupné automatické doplnenie.
6. Rozšírenie kubectl pomocou pluginov
Začínajúc , kubectl podporuje , ktorý umožňuje rozšíriť jeho funkcie o ďalšie príkazy.
Ak poznáte , potom sú pluginy kubectl postavené na rovnakom princípe.
V tejto kapitole vám ukážeme, ako inštalovať pluginy, kde ich hľadať a ako vytvoriť vlastné pluginy.
Inštalácia pluginov
Pluginy kubectl sa distribuujú ako jednoduché spustiteľné súbory s názvom vo forme kubectl-x. Prefix kubectl- je povinný, za ním nasleduje nová podpríkaz kubectl, ktorý umožňuje spustiť plugin.
Napríklad plugin hello sa bude distribuovať ako súbor s názvom kubectl-hello.
Aby ste nainštalovali plugin, musíte skopírovať súbor kubectl-x do akéhokoľvek adresára vo vašej premennej PATH a sprístupniť ho ako spustiteľný, napríklad pomocou chmod +x. Okamžite po tom môžete spustiť plugin pomocou kubectl x.
Môžete použiť nasledujúci príkaz na zobrazenie zoznamu všetkých pluginov, ktoré sú aktuálne nainštalované vo vašom systéme:
$ kubectl plugin listTento príkaz tiež zobrazuje varovania, ak máte niekoľko pluginov so zhodnými názvami, alebo ak existuje súbor pluginov, ktorý nie je spustiteľný.
Hľadanie a inštalácia pluginov pomocou Krew
Pluginy Kubectl sú vhodné na zdieľanie alebo opakované použitie ako softvérové balíky. Ale kde nájsť pluginy, ktoré zdieľali iní?
je zameraný na poskytovanie jednotného riešenia pre zdieľanie, vyhľadávanie, inštaláciu a správu pluginov kubectl. Projekt sa nazýva "správca balíkov pre pluginy kubectl" (Krew je podobný ).
Krew je zoznam pluginov kubectl, ktoré si môžete vybrať a nainštalovať. Krew je taktiež plugin pre kubectl.
To znamená, že inštalácia Krew funguje v podstate ako inštalácia akéhokoľvek iného pluginu kubectl. Môžete nájsť podrobné pokyny na .
Najdôležitejšie príkazy Krew:
# Поиск в списке плагинов
$ kubectl krew search [<query>]
# Посмотреть информацию о плагине
$ kubectl krew info <plugin>
# Установить плагин
$ kubectl krew install <plugin>
# Обновить все плагины до последней версии
$ kubectl krew upgrade
# Посмотреть все плагины, установленные через Krew
$ kubectl krew list
# Деинсталлировать плагин
$ kubectl krew remove <plugin>Majte na pamäti, že inštalácia pluginov pomocou Krew nebráni inštalácii pluginov bežným spôsobom, ako je popísané vyššie.
Všimnite si, že príkaz kubectl krew list zobrazuje iba tie pluginy, ktoré boli nainštalované s pomocou Krew, pričom príkaz kubectl plugin list vymenováva všetky pluginy, teda tie, ktoré sú nainštalované s pomocou Krew, a tie, ktoré sú nainštalované inými spôsobmi.
Hľadanie pluginov na iných miestach
Krew je mladý projekt, v súčasnosti má jeho len asi 30 pluginov. Ak nemôžete nájsť to, čo potrebujete, môžete nájsť pluginy aj inde, napríklad na GitHub.
Odporúčam pozrieť sekciu GitHub . Tam nájdete niekoľko desiatok dostupných pluginov, na ktoré sa oplatí pozrieť.
Písanie vlastných pluginov
Môžete si napísať vlastné — nie je to ťažké. Musíte vytvoriť spustiteľný súbor, ktorý robí to, čo potrebujete, nazvať ho ako kubectl-x a nainštalovať ho, ako bolo uvedené vyššie.
Súbor môže byť bash skript, python skript alebo skompilovaná go aplikácia — to nie je dôležité. Jedinou podmienkou je, aby sa dal priamo vykonať v operačnom systéme.
Poďme si teraz vytvoriť príklad pluginu. V predchádzajúcej časti ste použili príkaz kubectl na zobrazenie zoznamu kontajnerov pre každý pod. Túto príkaz môžete jednoducho premeniť na plugin, ktorý môžete zavolať, napríklad s kubectl img.
Vytvorte súbor kubectl-img nasledujúceho obsahu:
#!/bin/bash
kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image' Teraz urobte súbor spustiteľným pomocou chmod +x kubectl-img a premiestnite ho do akéhokoľvek adresára vo vašom PATH. Hneď po tom môžete začať používať plugin kubectl img.
Ako už bolo spomenuté, pluginy kubectl môžu byť napísané v akomkoľvek programovacom jazyku alebo skripte. Ak používate skripty príkazového riadku, máte výhodu v možnosti ľahko volať kubectl z pluginu. Môžete však písať zložitejšie pluginy v skutočných programovacích jazykoch, s použitím . Ak používate Go, môžete tiež využiť , ktorá existuje špeciálne pre písanie pluginov kubectl.
Ako zdieľať svoje pluginy
Ak si myslíte, že vaše pluginy môžu byť užitočné pre iných, nebojte sa ich zdieľať na GitHub. Určite ich pridajte do témy .
Môžete tiež požiadať o pridanie svojho pluginu do . Pokyny, ako to urobiť, nájdete v .
Automatické doplňovanie príkazov
V súčasnosti pluginy nepodporujú automatické doplňovanie. To znamená, že musíte zadať celé meno pluginu a celé názvy argumentov.
V repozitári GitHub kubectl existuje pre túto funkciu . Takže je možné, že táto funkcia bude niekedy v budúcnosti realizovaná.
Veľa šťastia!!!
Čo ďalšie si prečítať na túto tému:
- .
- .
- .
Zdroj: habr.com







