
Pokud pracujete s Kubernetes, pravděpodobně je kubectl jedním z nejpoužívanějších nástrojů. A pokaždé, když strávíte hodně času prací s určitým nástrojem, stojí za to se ho dobře naučit a efektivně využívat.
Tým Přeložila jsem článek Daniela Weibela, ve kterém najdete tipy a triky pro efektivní práci s kubectl. Také vám pomůže hlouběji porozumět fungování Kubernetes.
Podle autora je cílem článku učinit vaši každodenní práci s Kubernetes nejen efektivnější, ale také příjemnější!
Úvod: co je kubectl
Předtím, než se naučíte používat kubectl efektivněji, je důležité mít základní porozumění tomu, co to je a jak to funguje.
Z pohledu uživatele je kubectl řídicím panelem, který umožňuje provádět operace Kubernetes.
Z technického hlediska je kubectl klientem Kubernetes API.
Kubernetes API je HTTP REST API. Toto API je skutečným uživatelským rozhraním Kubernetes, přes které je plně ovládáno. To znamená, že každá operace Kubernetes je představena jako koncový bod API a může být provedena HTTP požadavkem na tento koncový bod.
Hlavním úkolem kubectl je tedy provádět HTTP požadavky na API Kubernetes:

Kubernetes je plně orientovaný na zdroje. To znamená, že podporuje vnitřní stav zdrojů a všechny operace Kubernetes jsou operacemi CRUD.
Plně ovládáte Kubernetes spravováním těchto zdrojů a Kubernetes zjišťuje, co dělat, na základě aktuálního stavu zdrojů. Z tohoto důvodu je odkaz na API Kubernetes uspořádán jako seznam typů zdrojů s nimi souvisejícími operacemi.
Pojďme si uvést příklad.
Představte si, že chcete vytvořit zdroj ReplicaSet. Abyste to udělali, popíšete ReplicaSet v souboru s názvem replicaset.yaml, pak spustíte příkaz:
$ kubectl create -f replicaset.yamlVýsledkem bude vytvoření zdroje ReplicaSet. Ale co se děje za kulisami?
V Kubernetes existuje operace pro vytvoření ReplicaSetu. Stejně jako jakákoli jiná operace, je poskytována jako koncový bod API. Konkrétní koncový bod API pro tuto operaci vypadá takto:
POST /apis/apps/v1/namespaces/{namespace}/replicasetsKoncové body API všech operací Kubernetes lze nalézt v (včetně ). Chcete-li provést skutečný požadavek na koncovou adresu, je nejprve nutné přidat URL adresu serveru API k cestám koncových bodů uvedeným v API průvodci.
Když tedy provedete výše uvedený příkaz, kubectl odešle HTTP požadavek POST na výše uvedenou koncovou adresu API. Definice ReplicaSet, kterou jste uvedli v souboru replicaset.yaml, je předána v těle požadavku.
Takto funguje kubectl pro všechny příkazy, které interagují s klastrem Kubernetes. Ve všech těchto případech kubectl jednoduše odesílá HTTP požadavky na odpovídající koncové body API Kubernetes.
Všimněte si, že Kubernetes lze plně spravovat pomocí takové utility jako je curl, ručně odesíláním HTTP požadavků na API Kubernetes. Kubectl jen usnadňuje používání API Kubernetes.
To jsou základy toho, co je kubectl a jak funguje. Ale je tu ještě něco ohledně API Kubernetes, co by měl každý uživatel kubectl vědět. Pojďme se stručně ponořit do vnitřního světa Kubernetes.
Vnitřní svět Kubernetes
Kubernetes se skládá z řady nezávislých komponent, které běží jako samostatné procesy na uzlech klastru. Některé komponenty pracují na hlavních uzlech, jiné na pracovních uzlech, každá komponenta plní svou speciální úlohu.
Zde jsou nejdůležitější komponenty na hlavních uzlech:
- Úložiště — ukládá definice zdrojů ().
- API server — poskytuje API a spravuje úložiště.
- Správce kontrolerů — zajišťuje, že stavy zdrojů odpovídají specifikacím.
- Plánovač — plánuje pody na pracovních uzlech.
A zde je jeden z nejdůležitějších komponentů na pracovních uzlech:
- Kubelet — spravuje spuštění kontejnerů na pracovním uzlu.
Chcete-li pochopit, jak tyto komponenty spolupracují, zvažte následující příklad.
Představte si, že právě provedete kubectl create -f replicaset.yaml, po čemž kubectl provede HTTP požadavek POST na (přenáší definici zdroje ReplicaSet).
Co se stane v klastru?
- Po provedení
kubectl create -f replicaset.yamlAPI server uloží definici vašeho zdroje ReplicaSet do úložiště:
- Poté se spustí kontroler ReplicaSet ve správci kontrolerů, který se stará o vytváření, úpravy a mazání zdrojů ReplicaSet:

- Kontroler ReplicaSet vytváří definici podu pro každou repliku ReplicaSet (v souladu se šablonou podu v definici ReplicaSet) a ukládá je do úložiště:

- Spouští se plánovač, který sleduje pody, jež dosud nebyly přiděleny žádnému pracovního uzlu:

- Plánovač vybírá vhodný pracovní uzel pro každý pod a přidává tuto informaci do definice podu ve skladu:

- Na pracovním uzlu, kterému je pod přidělen, se spouští Kubelet, ten sleduje pody přiřazené tomuto uzlu:

- Kubelet načítá definici podu ze skladu a dává příkazy prostředí pro provádění kontejnerů, jako je Docker, na uzlu:

Níže je textová verze tohoto popisu.
Žádost API k koncovému bodu pro vytvoření ReplicaSet je zpracována API serverem. API server ověřuje žádost a ukládá definici zdroje ReplicaSet do skladu.
Tato událost aktivuje kontroler ReplicaSet, což je podproces správce kontrolerů. Kontroler ReplicaSet sleduje vytváření, aktualizaci a odstraňování zdrojů ReplicaSet ve skladu a dostává oznámení o události, když k tomu dojde.
Úkolem kontroleru ReplicaSet je zajistit, že existuje potřebný počet podů repliky ReplicaSet. V našem příkladu pody zatím neexistují, a proto kontroler ReplicaSet vytváří tyto definice podů (podle šablony podu v definici ReplicaSet) a ukládá je do skladu.
Vytvoření nových podů spouští plánovač, který sleduje definice podů, které dosud nebyly naplánovány pro pracovní uzly. Plánovač vybírá vhodný pracovní uzel pro každý pod a aktualizuje definice podů ve skladu.
Mějte na paměti, že do tohoto okamžiku nebyl v clusteru nikde spuštěn kód pracovní zátěže. Vše, co bylo dosud provedeno, — je vytváření a aktualizace zdrojů ve skladu na hlavním uzlu.
Poslední událost spouští Kubelet, který sleduje pody naplánované pro jejich pracovní uzly. Kubelet pracovní uzlu, pro který jsou vaše pody ReplicaSet nainstalovány, musí vydat pokyn prostředí pro provádění kontejnerů, jako je Docker, aby stáhlo požadované obrazy kontejnerů a spustilo je.
V tuto chvíli je konečně vaše aplikace ReplicaSet spuštěna!
Role API Kubernetes
Jak jste viděli v předchozím příkladu, komponenty Kubernetes (kromě API serveru a skladu) sledují změny zdrojů ve skladu a mění informace o zdrojích ve skladu.
Samozřejmě, tyto komponenty nekomunikují přímo se skladováním, ale pouze prostřednictvím API Kubernetes.
Podívejme se na následující příklady:
- Kontroler ReplicaSet používá koncovou bod API s parametrem
watchpro sledování změn zdrojů ReplicaSet. - Kontroler ReplicaSet používá koncovou bod API (vytvořit pod) pro vytváření podů.
- Plánovač používá koncovou bod API (upravit pod) pro aktualizaci podů s informacemi o vybrané pracovní uzlu.
Jak vidíte, toto je stejné API, ke kterému se обращает kubectl. Použití stejného API pro práci vnitřních komponent a externích uživatelů je základní koncept designu Kubernetes.
Teď můžeme shrnout, jak Kubernetes funguje:
- Skladování uchovává stav, tedy zdroje Kubernetes.
- API server poskytuje rozhraní ke skladování ve formě API Kubernetes.
- Všechny ostatní komponenty a uživatelé Kubernetes čtou, sledují a manipulují se stavem (zdroji) Kubernetes prostřednictvím API.
Znalost těchto konceptů pomůže lépe pochopit kubectl a využít jej naplno.
Teď se podívejme na řadu konkrétních rad a triků, které pomohou zvýšit efektivitu práce s kubectl.
1. Zrychlení vstupu pomocí doplňování příkazů
Jedním z nejvíce užitečných, ale často přehlížených triků, které zvyšují efektivitu práce s kubectl, je doplňování příkazů.
Doplňování příkazů umožňuje automatické vyplňování jednotlivých částí příkazů kubectl stisknutím klávesy Tab. Funguje to pro podpříkazy, možnosti a argumenty, včetně složitějších, jako jsou jména zdrojů.
Podívejte se, jak funguje doplňování příkazů kubectl:

Doplňování příkazů funguje pro shelly Bash a Zsh.
obsahuje podrobné pokyny pro nastavení automatického doplňování, ale níže uvedeme krátký výtah.
Jak funguje doplňování příkazů
Doplňování příkazů je funkce shellu, která funguje pomocí skriptu doplňování. Skript doplňování je shellový skript, který určuje chování doplňování pro konkrétní příkaz.
Kubectl automaticky generuje a prerozděluje skripty doplňování pro Bash a Zsh pomocí následujících příkazů:
$ kubectl completion bashNebo:
$ kubectl completion zshTeoreticky stačí připojit výstup těchto příkazů do příslušné shellu, aby mohl kubectl doplňovat příkazy.
V praxi se způsob připojení liší pro Bash (včetně rozdílů mezi Linuxem a MacOS) a Zsh. Níže prozkoumáme všechny tyto možnosti.
Bash v Linuxu
Doplnkový skript pro Bash závisí na balíčku bash-completion, proto je nejdříve nutné jej nainstalovat:
$ sudo apt-get install bash-completionNebo:
$ yum install bash-completionMůžete otestovat, že je balíček úspěšně nainstalován pomocí následujícího příkazu:
$ type _init_completion Pokud se při tom zobrazí kód funkce shellu, je bash-completion správně nainstalováno. Pokud příkaz vrací chybu „Nenalezeno“, je nutné přidat následující řádek do vašeho souboru ~ / .bashrc:
$ source /usr/share/bash-completion/bash_completion Zda je nutné přidávat tento řádek do souboru ~ / .bashrc nebo ne, závisí na správci balíčků, kterého jste použili pro instalaci bash-completion. Pro APT je to nezbytné, pro YUM ne.
Po instalaci bash-completion je třeba vše nastavit tak, aby byl doplňkový skript kubectl zahrnut ve všech shellových sezení.
Jeden ze způsobů, jak to udělat, je přidat následující řádek do souboru ~ / .bashrc:
source <(kubectl completion bash) Další způsob je přidat doplňkový skript kubectl do adresáře /etc/bash_completion.d (vytvořte ho, pokud neexistuje):
$ kubectl completion bash >/etc/bash_completion.d/kubectl Všechny doplňkové skripty v adresáři /etc/bash_completion.d jsou automaticky zahrnuty do bash-completion.
Obě možnosti jsou stejně použitelné.
Po restartu příkazového shellu bude doplňování příkazů kubectl fungovat.
Bash v MacOS
V MacOS je nastavení o něco složitější. Skutečností je, že ve výchozím nastavení je v MacOS nainstalován Bash verze 3.2, a skript pro doplňování kubectl vyžaduje verzi Bash minimálně 4.1 a nefunguje v Bash 3.2.
Používání zastaralé verze Bash v MacOS je spojeno s otázkami licencí. Bash verze 4 je distribuován pod licencí GPLv3, kterou Apple nepodporuje.
Pro nastavení doplňování kubectl v MacOS je třeba nainstalovat novější verzi Bash. Můžete také nainstalovat aktualizovaný Bash jako výchozí příkazovou shell, což vás v budoucnu uchrání od mnoha problémů. Není to složité, podrobnosti jsou uvedeny v článku „».
Než budete pokračovat, ujistěte se, že používáte novější verzi Bash (zkontrolujte výstup bash --version).
Skript pro doplňování v Bash závisí na projektu , proto je nejprve nutné jej nainstalovat.
Můžete nainstalovat bash-completion pomocí :
$ brew install bash-completion@2 Zde @2 označuje bash-completion verze 2. Automatické dokončování kubectl vyžaduje bash-completion v2, a bash-completion v2 vyžaduje minimálně verzi Bash 4.1.
Výstup příkazu brew-install obsahuje sekci Caveats, ve které je uvedeno, že je třeba přidat do souboru ~/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" Doporučuji však tyto řádky nepřidávat do ~/bash_profile, a v ~/ .bashrc. V takovém případě bude automatické dokončování dostupné nejen v hlavním, ale i v podřízených shellových oknech.
Po restartování shellu můžete ověřit správnost instalace pomocí následujícího příkazu:
$ type _init_completionPokud ve výstupu vidíte shellovou funkci, vše je správně nastaveno.
Nyní je třeba zajistit, aby bylo automatické dokončování kubectl zapnuto ve všech relacích.
Jedním ze způsobů je přidat následující řádek do vašeho ~/ .bashrc:
source <(kubectl completion bash) Druhý způsob je přidat skript automatického dokončování do složky /usr/local/etc/bash_completion.d:
$ kubectl completion bash
>/usr/local/etc/bash_completion.d/kubectlTento způsob bude fungovat pouze v případě, že jste nainstalovali bash-completion pomocí Homebrew. V takovém případě bash-completion načítá všechny skripty z této složky.
Pokud jste nainstalovali , není nutné provádět předchozí krok, protože skript automatického dokončování bude automaticky umístěn do složky /usr/local/etc/bash_completion.d během instalace. V takovém případě bude automatické dokončování kubectl fungovat okamžitě po instalaci bash-completion.
Výsledkem jsou všechny tyto možnosti ekvivalentní.
Zsh
Skripty automatického dokončování pro Zsh nevyžadují žádné závislosti. Vše, co potřebujete, je je aktivovat při načítání shellu.
Můžete to udělat přidáním řádku do svého ~/ .zshrc souboru:
source <(kubectl completion zsh) Pokud dostanete chybu not found: compdef po restartování svého shellu, je třeba aktivovat vestavěnou funkci compdef. Tu lze aktivovat přidáním na začátek vašeho souboru ~/ .zshrc následující:
autoload -Uz compinit
compinit2. Rychlý přehled specifikací zdrojů
Když vytváříte definice zdrojů YAML, je třeba znát pole a jejich hodnotu pro tyto zdroje. Jedním z míst, kde můžete tyto informace hledat, je API příručka, která obsahuje kompletní specifikace všech zdrojů.
Nicméně přepínání na webový prohlížeč pokaždé, když potřebujete něco hledat, je nepohodlné. Proto kubectl poskytuje příkaz kubectl explain, který zobrazuje specifikace všech zdrojů přímo ve vašem terminálu.
Formát příkazu je následující:
$ kubectl explain resource[.field]...Tým vyžádá specifikaci požadovaného zdroje nebo pole. Zobrazené informace jsou identické těm, které jsou obsaženy v dokumentaci API.
Ve výchozím nastavení kubectl explain zobrazuje pouze první úroveň vnoření polí.
Podívejte se, jak to vypadá .
Můžete zobrazit celé stromové zobrazení, pokud přidáte možnost --recursive:
$ kubectl explain deployment.spec --recursivePokud přesně nevíte, které zdroje potřebujete, můžete je všechny zobrazit následujícími příkazy:
$ kubectl api-resources Tento příkaz zobrazuje názvy zdrojů v množném čísle, například nasazení místo deployment. Také zobrazuje zkrácený název, například deploy, pro ty zdroje, které jej mají. Nebojte se těchto rozdílů. Všechny tyto varianty názvů jsou ekvivalentní pro kubectl. Takže můžete použít jakoukoli z nich pro kubectl explain.
Všechny následující příkazy jsou ekvivalentní:
$ kubectl explain deployments.spec
# nebo
$ kubectl explain deployment.spec
# nebo
$ kubectl explain deploy.spec3. Použijte vlastní formát výstupu sloupců
Výchozí 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 zde vychází pouze několik polí.
V tomto případě lze použít vlastní formát výstupu sloupců. Umožňuje definovat, která data se mají zobrazit. Můžete vypsat 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 dvojicí , 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 definován v podřízeném poli name pole metadata v popisu zdroje podu. Podrobnosti můžete nalézt v nebo zadejte příkaz kubectl explain pod.metadata.name.
Představme si, že chcete do výstupu přidat další sloupec, například zobrazující uzel, na kterém každý pod běží. K tomu můžete jednoduše přidat odpovídající specifikaci sloupce do volby vlastních sloupců:
$ 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 vybírá název uzlu z spec.nodeName — když je pod přiřazen uzlu, je jeho název zapsán do pole spec.nodeName specifikace zdrojů podu. Podrobnější informace naleznete ve výstupu kubectl explain pod.spec.nodeName.
Mějte na paměti, že pole zdrojů Kubernetes jsou citlivá na velikost písmen.
Můžete zobrazit libovolné pole zdroje jako sloupec. Stačí prozkoumat specifikaci zdroje a vyzkoušet ji s jakýmikoli poli, které se vám líbí.
Ale nejdříve se podívejme podrobněji na výrazy pro výběr polí.
Výrazy JSONPath
Výrazy pro výběr polí zdrojů se zakládají na .
JSONPath je jazyk pro dotazování dat z dokumentů JSON. Výběr jednoho pole je nejjednodušší případ použití JSONPath. Má mnohem , včetně selektorů, filtrů a tak dále.
Kubectl explain podporuje omezený počet funkcí JSONPath. Níže jsou popsány funkce a příklady jejich použití:
# Выбрать все элементы списка
$ 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'Zvláštní význam má operátor []. Mnohá pole zdrojů Kubernetes jsou seznamy a tento operátor umožňuje vybírat prvky těchto seznamů. Často se používá se zástupným znakem jako [*], aby vybral všechny prvky seznamu.
Příklady použití
Možnosti použití vlastního formátu výstupu sloupců jsou neomezené, protože můžete zobrazit jakékoli pole nebo kombinaci polí zdroje ve výstupu. Zde je několik příkladů aplikací, ale nebojte se je prozkoumat sami a najít užitečné aplikace pro vás.
- Zobrazení obrazů kontejnerů pro pody:
$ 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 příkaz zobrazuje názvy obrazů kontejnerů pro každý pod.
Pamatujte, že pod může obsahovat několik kontejnerů, a názvy obrazů budou vypsány v jednom řádku oddělené čárkami.
- Zobrazení zón dostupnosti uzlů:
$ 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 příkaz je užitečný, pokud váš cluster běží v veřejném cloudu. Zobrazuje zónu dostupnosti pro každý uzel.
Zóna dostupnosti je cloudová koncepce, která omezuje zónu replikace geografickým regionem.
Zóny dostupnosti pro každý uzel získáváme prostřednictvím speciálního označení — . Pokud je cluster spuštěn v veřejném cloudu, toto označení se automaticky vytváří a vyplňuje názvy zón dostupnosti pro každý uzel.
Označení nejsou součástí specifikace zdrojů Kubernetes, takže je nenajdete v . Můžete je však vidět (tak jako jakákoli jiná označení), když požádáte o informace o uzlech ve formátu YAML nebo JSON:
$ kubectl get nodes -o yaml # nebo $ kubectl get nodes -o jsonTo je skvělý způsob, jak se dozvědět více o zdrojích, kromě studia specifikací zdrojů.
4. Snadné přepínání mezi clustry a jmennými prostory
Když kubectl provádí požadavek na Kubernetes API, předtím čte soubor kubeconfig, aby získal všechny potřebné parametry pro připojení.
Výchozí soubor kubeconfig je ~/.kube/config. Tento soubor je obvykle vytvořen nebo aktualizován speciálním příkazem.
Když pracujete s několika clustry, váš soubor kubeconfig obsahuje připojovací parametry pro všechny tyto clustry. Potřebujete způsob, jak říci příkazu kubectl, se kterým konkrétním clustrem pracujete.
Uvnitř clusteru můžete vytvořit několik jmenných prostorů — druh virtuálního clusteru uvnitř fyzického clusteru. Kubectl také určuje, který jmenný prostor použít podle dat souboru kubeconfig. Znamená to, že potřebujete způsob, jak říci příkazu kubectl, se kterým jmenným prostorem pracovat.
V této kapitole vám ukážeme, jak to funguje a jak dosáhnout efektivní práce.
Všimněte si, že můžete mít několik souborů kubeconfig uvedených v proměnné prostředí KUBECONFIG. V takovém případě budou všechny tyto soubory sloučeny do jedné společné konfigurace při provádění. Můžete také změnit výchozí soubor kubeconfig spuštěním kubectl s parametrem --kubeconfig. Podívejte se na .
Soubory kubeconfig
Pojďme se podívat na to, co přesně obsahuje soubor kubeconfig:

Jak vidíte, soubor kubeconfig obsahuje sadu kontextů. Kontext se skládá ze tří prvků:
- Cluster — URL API serveru clustera.
- User — autentifikační údaje uživatele v clustere.
- Namespace — jmenný prostor používaný při připojení k clustere.
V praxi se často používá jeden kontext na cluster ve vašem souboru kubeconfig. Nicméně můžete mít několik kontextů na cluster, které se liší uživatelským účtem nebo jmenným prostorem. Taková konfigurace s několika kontexty se však vyskytuje zřídka, takže obvykle existuje jednoznačné přiřazení mezi clustery a kontexty.
V každém okamžiku je jeden z kontextů aktuální:

Když kubectl čte konfigurační soubor, vždy se používají informace z aktuálního kontextu. V uvedeném příkladu se kubectl připojí k clusteru Hare.
Proto, abyste se přepnuli na jiný cluster, musíte změnit aktuální kontext v souboru kubeconfig:

Nyní se kubectl připojí k clusteru Fox.
Chcete-li přepnout na jiný jmenný prostor ve stejném clusteru, musíte změnit hodnotu prvku namespace pro aktuální kontext:

V uvedeném příkladu bude kubectl používat jmenný prostor Prod clusteru Fox (dříve byl nastaven jmenný prostor Test).
Všimněte si, že kubectl také poskytuje parametry --cluster, --user, --namespace a --context, které umožňují přepsat jednotlivé prvky a samotný aktuální kontext, bez ohledu na to, co je nastaveno v souboru kubeconfig. Podívejte se na možnosti kubectl.
Teoreticky můžete manuálně měnit parametry v souboru kubeconfig. Ale je to nepohodlné. Pro usnadnění těchto operací existuje řada nástrojů, které umožňují měnit parametry automaticky.
Použijte kubectx
Velmi populární nástroj pro přepínání mezi clustery a jmennými prostory.
Nástroj poskytuje příkazy kubectx a kubens pro změnu aktuálního kontextu a prostoru názvů.
Jak již bylo zmíněno, změna aktuálního kontextu znamená změnu clusteru, pokud máte pouze jeden kontext pro cluster.
Tady je příklad provádění těchto příkazů:

V podstatě tyto příkazy pouze editují soubor kubeconfig, jak bylo popsáno výše.
Chcete-li nainstalovat kubectx, řiďte se pokyny na
Oba příkazy podporují automatické doplňování názvů kontextů a prostorů názvů, což vám umožňuje je nezadávat úplně. Pokyny k nastavení automatického doplňování .
Další užitečnou funkcí kubectx je . Funguje spolu s nástrojem , který je třeba instalovat samostatně. Instalace fzf automaticky zpřístupňuje interaktivní režim v kubectx. V interaktivním režimu můžete vybírat kontext a prostor názvů prostřednictvím interaktivního rozhraní volného vyhledávání, které poskytuje fzf.
Použití aliasů shellových příkazů
Nemusíte mít samostatné nástroje pro změnu aktuálního kontextu a prostoru názvů, protože kubectl také poskytuje příkazy pro to. Například příkaz kubectl config nabízí podpříkazy pro editaci souborů kubeconfig.
Zde jsou některé z nich:
kubectl config get-contexts: zobrazit všechny kontexty;kubectl config current-context: získat aktuální kontext;kubectl config use-context: změnit aktuální kontext;kubectl config set-context: změnit prvek kontextu.
Používat tyto příkazy přímo však není moc pohodlné, protože jsou dlouhé. Můžete pro ně vytvořit aliasy shellových příkazů, které se snadno provedou.
Vytvořil jsem sadu aliasů na základě těchto příkazů, které poskytují funkčnost podobnou kubectx. Zde můžete vidět jejich funkčnost:

Všimněte si, že aliasy používají fzf k poskytnutí interaktivního rozhraní volného vyhledávání (jak v interaktivním režimu kubectx). To znamená, že musíte , abyste mohli tyto aliasy používat.
Tady jsou samotné definice aliasů:
# Получить текущий контекст
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/^..//")"' Chcete-li nainstalovat tyto aliasy, musíte přidat výše uvedené definice do svého souboru ~/ .bashrc nebo ~/ .zshrc a restartovat svůj shell.
Použití pluginů
Kubectl umožňuje načítání pluginů, které se vykonávají stejně jako hlavní příkazy. Můžete například nainstalovat plugin kubectl-foo a spustit ho zadáním příkazu kubectl foo.
Bylo by pohodlné měnit kontext a jmenné prostory tímto způsobem, například spouštění kubectl ctx pro změnu kontextu a kubectl ns pro změnu jmenného prostoru.
Napsal jsem dva pluginy, které to dělají:
Fungování pluginů se zakládá na aliasech z předchozí sekce.
Takto fungují:

Všimněte si, že pluginy používají fzf pro zajištění interaktivního rozhraní s volným hledáním (jako v interaktivním režimu kubectx). To znamená, že potřebujete, abyste mohli tyto aliasy používat.
K instalaci pluginů je potřeba stáhnout skripty shellu s názvy a do libovolného adresáře ve vaší proměnné PATH a učinit je spustitelnými, například pomocí chmod +x. Ihned poté budete moci používat kubectl ctx a kubectl ns.
5. Zkrácení vstupu s autoaliasy
Aliasy příkazového shellu jsou dobrý způsob, jak urychlit vstup. Projekt obsahuje přibližně 800 zkratek pro základní příkazy kubectl.
Můžete se divit — jak si zapamatovat 800 aliasů? Ale není potřeba je všechny pamatovat, neboť jsou sestaveny podle jednoduchého schématu uvedeného níže:

Napří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
Jak vidíte, aliasy sestávají z komponent, z nichž každá označuje určitý prvek příkazu kubectl. Každý alias může mít jednu komponentu pro základní příkaz, operaci a zdroj a několik komponent pro parametry. Jednoduše „vyplňujete“ tyto komponenty zleva doprava podle uvedeného schématu.
Aktuální podrobné schéma je na . Tam také najdete.
Například alias kgpooyamlall je ekvivalentní příkazu kubectl get pods -o yaml --all-namespaces.
Relativní pořadí voleb není důležité: příkaz kgpooyamlall je ekvivalentní příkazu kgpoalloyaml.
Není nutné používat všechny komponenty jako aliasy. Například k, kg, klo, ksys, kgpo také lze použít. Dokonce je možné kombinovat aliasy a běžné příkazy nebo volby v příkazovém řádku:
Například:
- Namísto
kubectl proxymůžete napsatk proxy. - Namísto
kubectl get rolesmůžete napsatkg roles(v současné době neexistuje alias pro zdroj Roles). - Chcete-li získat údaje o konkrétním podu, můžete použít příkaz
kgpo my-pod — kubectl get pod my-pod.
Mějte na paměti, že některé aliasy vyžadují argument v příkazovém řádku. Například alias kgpol znamená kubectl get pods -l. Možnost -l vyžaduje argument — specifikaci značky. Pokud používáte alias, měl by vypadat jako kgpol app=ui.
Protože některé aliasy vyžadují argumenty, aliasy a, f a l je třeba použít jako poslední.
Celkově, jakmile tuto schématu zvládnete, budete schopni intuitivně odvodit aliasy z příkazů, které chcete vykonávat, a ušetříte tím spoustu času při zadávání.
Instalace
Pro instalaci kubectl-aliases je potřeba stáhnout soubor z GitHubu a zahrnout jej do souboru ~/ .bashrc nebo ~/ .zshrc:
source ~\/ .kubectl_aliasesAutomatické dokončování
Jak jsme již řekli, často přidáváte další slova k aliasu na příkazovém řádku. Například:
$ kgpooyaml test-pod-d4b77b989Pokud používáte automatické dokončování příkazu kubectl, pravděpodobně jste používali automatické dokončování pro věci, jako jsou názvy zdrojů. Ale je možné to udělat, když se používají aliasy?
To je velmi důležitá otázka, protože pokud automatické dokončování nefunguje, přijdete o část výhod aliasů.
Odpověď závisí na tom, jaký shell používáte:
- Pro Zsh automatické dokončování pro aliasy funguje „z krabice“.
- Pro Bash, bohužel, jsou nutné určité kroky k tomu, aby automatické dokončování fungovalo.
Aktivace automatického dokončování pro aliasy v Bash
Problém s Bashem spočívá v tom, že se pokouší doplnit (kdykoli stisknete Tab) alias a ne příkaz, na který se alias odkazuje (jak to dělá Zsh). Vzhledem k tomu, že nemáte skripty pro doplnění pro všech 800 aliasů, automatické dokončování nefunguje.
Projekt poskytuje obecné řešení tohoto problému. Připojuje se k mechanismu doplnění pro aliasy, uvnitř doplňuje alias na příkaz a vrátí varianty doplnění pro doplněný příkaz. To znamená, že doplnění pro alias funguje stejně jako pro plný příkaz.
Nejprve vysvětlím, jak nainstalovat complete-alias, a poté jak jej nastavit, aby zahrnoval doplnění pro všechny aliasy kubectl.
Instalace complete-alias
Nejprve, complete-alias závisí na . Proto před instalací complete-alias se ujistěte, že je nainstalován bash-completion. Pokyny k instalaci byly uvedeny dříve pro Linux a MacOS.
Důležitá poznámka pro uživatele MacOS: stejně jako skript pro automatické dokončování kubectl, complete-alias nefunguje s Bash 3.2, který je standardně používán v MacOS. Konkrétně, complete-alias závisí na bash-completion v2 (brew install bash-completion@2), pro který je vyžadována minimálně verze Bash 4.1. To znamená, že pro použití complete-alias na MacOS je třeba nainstalovat novější verzi Bash.
Musíte stáhnout skript z a zahrnout ho do svého souboru ~/ .bashrc:
source ~/bash_completion.shPo restartu shellu bude complete-alias plně nainstalován.
Povolení automatického dokončení pro aliasy kubectl
Technicky complete-alias poskytuje funkci shellu _complete_alias. Tato funkce kontroluje alias a vrací návrhy pro dokončení příkazů aliasu.
Pro propojení funkce s určitým aliasem je třeba použít vestavěný mechanismus Bash , abyste nastavili _complete_alias jako funkci pro doplnění aliasu.
Jako příklad vezměme alias k, který představuje příkaz kubectl. Abychom nastavili _complete_alias jako funkci pro doplnění pro tento alias, musíte provést následující příkaz:
$ complete -F _complete_alias k Výsledkem bude, že vždy, když automaticky doplníte alias k, je volána funkce _complete_alias, která kontroluje alias a vrací návrhy pro dokončení příkazu. kubectl.
Jako druhý příklad si vezměme alias kg, který představuje kubectl get:
$ complete -F _complete_alias kg Stejně jako v předchozím příkladu, když automaticky doplníte kg, dostanete stejné návrhy, které byste dostali pro kubectl get.
Všimněte si, že complete-alias lze použít pro libovolný alias ve vaší systému.
Proto je třeba provést výše uvedený příkaz pro každý z nich, abyste povolili automatické dokončení pro všechny aliasy kubectl. Následující fragment dělá přesně to za předpokladu, že jste nainstalovali kubectl-aliases v ~/ .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 třeba umístit do svého ~/ .bashrc, restartovat shell a automatické dokončení pro všechny 800 aliasů kubectl bude k dispozici.
6. Rozšíření kubectl pomocí pluginů
Od , kubectl podporuje , které umožňují rozšíření jeho funkcí o další příkazy.
Pokud znáte , pluginy kubectl jsou postaveny na stejném principu.
V této kapitole vám ukážeme, jak instalovat pluginy, kde je hledat a jak vytvářet vlastní pluginy.
Instalace pluginů
Pluginy kubectl se šíří jako jednoduché spustitelné soubory s názvem ve formátu kubectl-x. Předpona kubectl- je povinný, za ním následuje nový podpříkaz kubectl, který umožňuje volání pluginu.
Například plugin hello bude distribuován jako soubor s názvem kubectl-hello.
Pro instalaci pluginu je třeba zkopírovat soubor kubectl-x do libovolného adresáře ve vaší proměnné PATH a udělat ho spustitelným, například pomocí chmod +x. Hned poté můžete plugin spustit pomocí kubectl x.
Můžete použít následující příkaz k výpisu všech pluginů, které jsou momentálně nainstalovány ve vašem systému:
$ kubectl plugin listTento příkaz také zobrazuje varování, pokud máte více pluginů se stejnými názvy, nebo pokud je soubor pluginů, který není spustitelný.
Vyhledávání a instalace pluginů pomocí Krew
Pluginy Kubectl jsou vhodné pro sdílení nebo opětovné použití jako programové balíčky. Ale kde najít pluginy, které sdíleli ostatní?
se zaměřuje na poskytování jednotného řešení pro sdílení, vyhledávání, instalaci a správu pluginů kubectl. Projekt se označuje jako "správce balíčků pro pluginy kubectl" (Krew je podobný ).
Krew je seznam pluginů kubectl, které si můžete vybírat a instalovat. Krew je také plugin pro kubectl.
To znamená, že instalace Krew funguje v podstatě jako instalace jakéhokoli jiného pluginu kubectl. Můžete najít podrobné pokyny na .
Nejdůležitější pří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>Vezměte prosím na vědomí, že instalace pluginů pomocí Krew nebrání instalaci pluginů standardním způsobem, jak bylo popsáno výše.
Mějte na paměti, že příkaz kubectl krew list zobrazuje pouze ty pluginy, které byly nainstalovány pomocí Krew, zatímco příkaz kubectl plugin list vyjmenovává všechny pluginy, tedy ty, které byly nainstalovány pomocí Krew, a ty, které byly nainstalovány jinými způsoby.
Vyhledávání pluginů jinde
Krew je mladý projekt, momentálně má v jeho asi 30 pluginů. Pokud nemůžete najít to, co potřebujete, můžete najít pluginy na jiném místě, například na GitHub.
Doporučuji prozkoumat sekci GitHub . Tam najdete několik desítek dostupných pluginů, které stojí za to prozkoumat.
Psaní vlastních pluginů
Můžete si sami — není to složité. Musíte vytvořit spustitelný soubor, který udělá to, co je potřeba, a pojmenovat ho jako kubectl-x a nainstalovat, jak bylo popsáno výše.
Soubor může být bash skript, python skript nebo zkompilovaná go aplikace — na tom nezáleží. Jedinou podmínkou je, aby byl spustitelný přímo v operačním systému.
Pojďme nyní vytvořit příklad plug-inu. V předchozí části jste použili příkaz kubectl k výpisu seznamu kontejnerů pro každý pod. Tento příkaz můžete snadno převést na plug-in, který můžete vyvolat například pomocí kubectl img.
Vytvořte soubor kubectl-img následujícího obsahu:
#!/bin/bash
kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image' Nyní udělejte soubor spustitelným pomocí chmod +x kubectl-img a přesuňte ho do libovolného adresáře ve vaší PATH. Ihned poté můžete použít plug-in kubectl img.
Jak už bylo zmíněno, plug-iny kubectl mohou být napsány v jakémkoli programovacím jazyce nebo skriptu. Pokud používáte skripty příkazové řádky, máte výhodu snadného vyvolání kubectl z plug-inu. Můžete však psát složitější plug-iny v reálných programovacích jazycích pomocí . Pokud používáte Go, můžete také využít , která existuje speciálně pro psaní plug-inů kubectl.
Jak sdílet své plug-iny
Pokud máte pocit, že vaše plug-iny mohou být užitečné pro ostatní, neváhejte je sdílet na GitHubu. Určitě je přidejte do tématu .
Můžete také požádat o přidání vašeho plug-inu do . Pokyny, jak to provést, najdete v .
Doplňování příkazů
V současné době plug-iny nepodporují doplňování. Musíte tedy zadat celé jméno plug-inu a celé názvy argumentů.
V repozitáři GitHub kubectl je pro tuto funkci . Takže je možné, že tato funkce bude někdy implementována v budoucnu.
Hodně štěstí!!!
Co dalšího si přečíst na toto téma:
- .
- .
- .
Zdroj: habr.com







