
Ako radite sa Kubernetesom, kubectl je vjerovatno jedan od uslužnih programa koje najčešće koristite. I kad god provedete puno vremena radeći s određenim alatom, isplati se dobro ga proučiti i naučiti kako ga efikasno koristiti.
tim preveo je članak Daniela Weibela u kojem ćete pronaći savjete i trikove za efikasan rad sa kubectl-om. Takođe će vam pomoći da steknete dublje razumevanje Kubernetesa.
Prema rečima autora, cilj članka je da vaš svakodnevni rad sa Kubernetesom učini ne samo efikasnijim, već i prijatnijim!
Uvod: Šta je kubectl
Pre nego što naučite da efikasnije koristite kubectl, morate steći osnovno razumevanje šta je to i kako funkcioniše.
Iz perspektive korisnika, kubectl je kontrolni panel koji vam omogućava da izvodite Kubernetes operacije.
Tehnički gledano, kubectl je Kubernetes API klijent.
Kubernetes API je HTTP REST API. Ovaj API je pravi Kubernetes korisnički interfejs, preko kojeg se potpuno kontroliše. To znači da je svaka Kubernetes operacija izložena kao API krajnja tačka i da se može izvršiti sa HTTP zahtevom do te krajnje tačke.
Stoga je glavni posao kubectl-a da napravi HTTP zahtjeve za Kubernetes API:

Kubernetes je sistem koji je u potpunosti orijentisan na resurse. To znači da održava interno stanje resursa i da su sve Kubernetes operacije CRUD operacije.
Vi imate potpunu kontrolu nad Kubernetesom tako što upravljate ovim resursima, a Kubernetes smišlja šta da radi na osnovu trenutnog stanja resursa. Iz tog razloga, Kubernetes API referenca je organizovana kao lista tipova resursa sa njihovim pridruženim operacijama.
Pogledajmo primjer.
Recimo da želite da kreirate ReplicaSet resurs. Da biste to učinili, opišete ReplicaSet u datoteci po imenu replicaset.yaml, zatim pokrenite naredbu:
$ kubectl create -f replicaset.yamlOvo će kreirati ReplicaSet resurs. Ali šta se dešava iza kulisa?
Kubernetes ima operaciju kreiranja ReplicaSet-a. Kao i svaka druga operacija, izložena je kao API krajnja tačka. Konkretna API krajnja tačka za ovu operaciju izgleda ovako:
POST /apis/apps/v1/namespaces/{namespace}/replicasetsAPI krajnje tačke za sve Kubernetes operacije se mogu naći na (uključujući ). Da biste napravili stvarni zahtjev krajnjoj točki, prvo morate dodati URL API servera u staze krajnje točke koje su navedene u API referenci.
Stoga, kada izvršite gornju naredbu, kubectl šalje HTTP POST zahtjev gornjoj API krajnjoj tački. ReplicaSet definicija koju ste dali u datoteci replicaset.yaml, šalje se u tijelu zahtjeva.
Ovako kubectl radi za sve komande koje su u interakciji sa Kubernetes klasterom. U svim ovim slučajevima, kubectl jednostavno šalje HTTP zahtjeve odgovarajućim Kubernetes API krajnjim tačkama.
Imajte na umu da možete u potpunosti upravljati Kubernetesom koristeći uslužni program kao što je curlručnim slanjem HTTP zahtjeva Kubernetes API-ju. Kubectl jednostavno olakšava korištenje Kubernetes API-ja.
Ovo su osnove onoga što je kubectl i kako radi. Ali postoji još nešto o Kubernetes API-ju što bi svaki kubectl korisnik trebao znati. Zavirimo na brzinu u unutrašnji svet Kubernetesa.
Unutrašnji svet Kubernetesa
Kubernetes se sastoji od skupa nezavisnih komponenti koje se pokreću kao zasebni procesi na čvorovima klastera. Neke komponente rade na glavnim čvorovima, druge na radnim čvorovima, a svaka komponenta obavlja svoj specifični zadatak.
Evo najvažnijih komponenti na glavnim čvorovima:
- Trezor - pohranjuje definicije resursa ().
- API server — pruža API i upravlja skladištenjem.
- Controller Manager — Osigurava da su statusi resursa u skladu sa specifikacijama.
- Planer — raspoređuje podove na radničkim čvorovima.
A evo jedne najvažnije komponente na radničkim čvorovima:
- kubelet — upravlja pokretanjem kontejnera na radnom čvoru.
Da bismo razumjeli kako ove komponente rade zajedno, pogledajmo primjer.
Pretpostavimo da ste upravo završili kubectl create -f replicaset.yaml, nakon čega je kubectl napravio HTTP POST zahtjev za (prolaženje ReplicaSet definicije resursa).
Šta se dešava u klasteru?
- Nakon odrade
kubectl create -f replicaset.yamlAPI server pohranjuje vašu ReplicaSet definiciju resursa u pohranu:
- Zatim, ReplicaSet kontroler se pokreće u upravljaču kontrolera, koji upravlja kreiranjem, modifikacijom i brisanjem ReplicaSet resursa:

- ReplicaSet kontroler kreira pod definiciju za svaku ReplicaSet repliku (prema predlošku pod u definiciji ReplicaSet) i pohranjuje ih u memoriju:

- Planer je pokrenut, prateći podove koji još nisu dodijeljeni nijednom radnom čvoru:

- Planer bira odgovarajući radni čvor za svaki pod i dodaje ove informacije definiciji pod u prodavnici:

- Na radnom čvoru kojem je pod dodijeljen, Kubelet se pokreće, prati podove koji su dodijeljeni ovom čvoru:

- Kubelet čita definiciju pod iz skladišta i daje instrukcije vremenu izvođenja kontejnera, kao što je Docker, da pokrene kontejnere na čvoru:

Ispod je tekstualna verzija ovog opisa.
API zahtjev do krajnje točke kreiranja ReplicaSet-a obrađuje API server. API server provjerava autentičnost zahtjeva i pohranjuje definiciju ReplicaSet resursa u memoriju.
Ovaj događaj pokreće ReplicaSet kontroler, koji je podproces menadžera kontrolera. ReplicaSet kontroler nadgleda kreiranje, ažuriranje i brisanje ReplicaSet resursa u prodavnici i prima obavijest o događaju kada se to dogodi.
Posao ReplicaSet kontrolera je osigurati da postoji potreban broj ReplicaSet podova. U našem primjeru još ne postoje podovi, tako da ReplicaSet kontroler kreira ove definicije podova (prema predlošku pod u definiciji ReplicaSet) i pohranjuje ih u memoriju.
Kreiranje novih podova pokreće planer koji prati definicije podova koje još nisu zakazane za radne čvorove. Planer bira odgovarajući radni čvor za svaki pod i ažurira definicije modula u spremištu.
Imajte na umu da do ove tačke nigdje u klasteru nije bio pokrenut kod radnog opterećenja. Sve što je do sada urađeno - ovo je kreiranje i ažuriranje resursa u spremištu na glavnom čvoru.
Posljednji događaj pokreće Kubelets, koji nadgledaju podove zakazane za njihove radne čvorove. Kubelet radnog čvora na kojem su instalirani vaši ReplicaSet podovi mora uputiti vrijeme izvođenja kontejnera, kao što je Docker, da preuzme potrebne slike kontejnera i pokrene ih.
U ovom trenutku, vaša ReplicaSet aplikacija konačno radi!
Uloga Kubernetes API-ja
Kao što ste vidjeli u prethodnom primjeru, komponente Kubernetes (osim API servera i skladišta) prate promjene resursa u skladištu i mijenjaju informacije o resursima u skladištu.
Naravno, ove komponente ne komuniciraju direktno sa skladištem, već samo preko Kubernetes API-ja.
Razmotrite sljedeće primjere:
- ReplicaSet kontroler koristi API krajnju točku sa parametrom
watchza praćenje promjena u ReplicaSet resursima. - ReplicaSet kontroler koristi API krajnju točku (kreiraj pod) za kreiranje podova.
- Planer koristi API krajnju tačku (uredi pod) za ažuriranje podova s informacijama o odabranom radnom čvoru.
Kao što vidite, ovo je isti API kojem kubectl pristupa. Korišćenje istog API-ja za interne komponente i eksterne korisnike je osnovni koncept u dizajnu Kubernetesa.
Sada možemo sažeti kako Kubernetes funkcionira:
- Skladišni prostori navode, odnosno Kubernetes resurse.
- API server pruža interfejs za skladište u obliku Kubernetes API-ja.
- Sve ostale komponente i korisnici Kubernetesa čitaju, posmatraju i manipulišu Kubernetes stanjem (resursima) preko API-ja.
Poznavanje ovih koncepata pomoći će vam da bolje razumijete kubectl i izvučete maksimum iz njega.
Pogledajmo sada neke specifične savjete i trikove koji će vam pomoći da poboljšate vašu produktivnost uz kubectl.
1. Ubrzajte unos pomoću dovršavanja naredbe
Jedna od najkorisnijih, ali često zanemarenih tehnika za poboljšanje performansi sa kubectl-om je dovršavanje komande.
Dovršavanje komande vam omogućava da automatski dovršite dijelove kubectl komandi pomoću tipke Tab. Ovo radi za podnaredbe, opcije i argumente, uključujući nešto tako složeno kao što su imena resursa.
Pogledajte kako funkcionira završetak komande kubectl:

Dovršavanje naredbi radi za Bash i Zsh školjke.
sadrži detaljna uputstva za podešavanje automatskog dovršavanja, ali u nastavku ćemo dati kratak izvod.
Kako funkcionira završetak naredbe
Dovršavanje naredbe je funkcija ljuske koja radi pomoću skripte za dovršavanje. Skripta ekstenzije je shell skripta koja definira ponašanje ekstenzije za određenu naredbu.
Kubectl automatski generiše i ispisuje ekstenzije za Bash i Zsh koristeći sljedeće naredbe:
$ kubectl completion bashIli:
$ kubectl completion zshU teoriji, dovoljno je spojiti izlaz ovih komandi na odgovarajuću komandnu ljusku tako da kubectl može dopuniti komande.
U praksi, metoda povezivanja se razlikuje za Bash (uključujući razlike između Linux i MacOS) i Zsh. U nastavku ćemo obraditi sve ove opcije.
Udariti Linux
Bash completion skripta zavisi od bash-completion paketa, tako da je prvo morate instalirati:
$ sudo apt-get install bash-completionIli:
$ yum install bash-completionMožete testirati da li je paket uspješno instaliran koristeći sljedeću naredbu:
$ type _init_completion Ako ovo daje shell funkcijski kod, tada je bash-completion ispravno instaliran. Ako naredba daje grešku "Nije pronađeno", morate dodati sljedeći red u vašu datoteku ~ / .bashrc:
$ source /usr/share/bash-completion/bash_completion Da li je potrebno dodati ovaj red u fajl ~ / .bashrc ili ne zavisi od menadžera paketa koji ste koristili da instalirate bash-completion. Ovo je neophodno za APT, ali ne i za YUM.
Nakon instaliranja bash-completion-a, morate sve konfigurirati tako da kubectl skripta za završetak bude omogućena u svim sesijama ljuske.
Jedan od načina da to učinite je dodavanje sljedećeg reda u datoteku ~ / .bashrc:
source <(kubectl completion bash) Drugi način je dodavanje skripte ekstenzije kubectl u direktorij /etc/bash_completion.d (kreirajte ga ako ne postoji):
$ kubectl completion bash >/etc/bash_completion.d/kubectl Sve skripte dodataka u katalogu /etc/bash_completion.d su automatski uključeni u bash-dovršenje.
Obje opcije su podjednako primjenjive.
Nakon ponovnog pokretanja ljuske, završetak komande kubectl će raditi.
Bash na MacOS-u
Na MacOS-u je podešavanje malo složenije. Činjenica je da MacOS podrazumevano koristi Bash verziju 3.2, a kubectl skripta za autodovršavanje zahteva Bash verziju od najmanje 4.1 i ne radi u Bash 3.2.
Postoje problemi s licenciranjem povezani s korištenjem zastarjele verzije Bash-a na MacOS-u. Bash verzija 4 je licencirana pod GPLv3, koju Apple ne podržava.
Da biste konfigurisali kubectl autodovršavanje na MacOS-u, morate instalirati noviju verziju Bash-a. Također možete postaviti ažurirani Bash kao svoju zadanu ljusku, što će vam uštedjeti mnogo problema u budućnosti. Nije teško, detalji su dati u članku “".
Prije nego što nastavite, provjerite koristite li najnoviju verziju Bash-a (provjerite izlaz bash --version).
Bash skripta za završetak se razlikuje od projekta , pa ga prvo morate instalirati.
Možete instalirati bash-completion koristeći :
$ brew install bash-completion@2 to je @2 označava bash-completion verziju 2. kubectl autocompletion zahtijeva bash-completion v2, a bash-completion v2 zahtijeva minimalno Bash verziju 4.1.
Izlaz naredbe brew-install sadrži odjeljak Upozorenja, koji specificira šta treba dodati datoteci ~/.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" Međutim, preporučujem da ne dodajete ove redove ~/.bash_profileand in ~/.bashrc. U ovom slučaju, autodovršavanje će biti dostupno ne samo u glavnoj, već iu podređenim komandnim školjkama.
Nakon ponovnog pokretanja komandne ljuske, možete provjeriti da li je instalacija ispravna koristeći sljedeću naredbu:
$ type _init_completionAko vidite funkciju ljuske u izlazu, onda je sve ispravno konfigurirano.
Sada moramo osigurati da je kubectl automatsko dovršavanje omogućeno u svim sesijama.
Jedan od načina je da dodate sljedeći red u svoj ~/.bashrc:
source <(kubectl completion bash) Drugi način je dodavanje skripte za autodovršavanje u folder /usr/local/etc/bash_completion.d:
$ kubectl completion bash
>/usr/local/etc/bash_completion.d/kubectlOva metoda će raditi samo ako ste instalirali bash-completion koristeći Homebrew. U ovom slučaju, bash-completion učitava sve skripte iz ovog direktorija.
Ako ste instalirali , tada nema potrebe za obavljanjem prethodnog koraka, jer će skripta za automatsko dovršavanje automatski biti smještena u folder /usr/local/etc/bash_completion.d tokom instalacije. U ovom slučaju, kubectl autocompletion će početi raditi čim instalirate bash-completion.
Kao rezultat toga, sve ove opcije su ekvivalentne.
Zsh
Skripte za automatsko dovršavanje za Zsh ne zahtijevaju nikakve ovisnosti. Sve što treba da uradite je da ih omogućite kada učitate komandnu ljusku.
To možete učiniti dodavanjem linije u svoj ~/.zshrc fajl:
source <(kubectl completion zsh) Ako dobijete grešku not found: compdef nakon ponovnog pokretanja ljuske, morate omogućiti ugrađenu funkciju compdef. Možete ga omogućiti dodavanjem na početak datoteke ~/.zshrc sledeće:
autoload -Uz compinit
compinit2. Brzo pogledajte specifikacije resursa
Kada kreirate definicije YAML resursa, morate znati polja i njihovo značenje za te resurse. Jedno mjesto za traženje ovih informacija je u API referenci, koja sadrži kompletne specifikacije za sve resurse.
Međutim, prebacivanje na web pretraživač svaki put kada trebate nešto tražiti je nezgodno. Stoga kubectl pruža naredbu kubectl explain, koji prikazuje specifikacije svih resursa direktno u vašem terminalu.
Format naredbe je sljedeći:
$ kubectl explain resource[.field]...Naredba će ispisati specifikaciju traženog resursa ili polja. Prikazane informacije su identične onima sadržanim u priručniku za API.
po defaultu kubectl explain prikazuje samo prvi nivo ugniježđenja polja.
Pogledajte kako to izgleda .
Možete prikazati cijelo stablo ako dodate opciju --recursive:
$ kubectl explain deployment.spec --recursiveAko ne znate tačno koji su resursi potrebni, možete ih sve prikazati sljedećom naredbom:
$ kubectl api-resources Ova naredba prikazuje imena resursa u obliku množine, npr. deployments umjesto deployment. Također prikazuje kratko ime, na primjer deploy, za one resurse koji ga imaju. Ne brinite o ovim razlikama. Sve ove opcije imenovanja su ekvivalentne za kubectl. Odnosno, možete koristiti bilo koji od njih za kubectl explain.
Sve sljedeće naredbe su ekvivalentne:
$ kubectl explain deployments.spec
# или
$ kubectl explain deployment.spec
# или
$ kubectl explain deploy.spec3. Koristite prilagođeni izlazni format stupca
Zadani format izlaza komande 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 78dOvaj format je zgodan, ali sadrži ograničenu količinu informacija. U poređenju s punim formatom definicije resursa, ovdje je prikazano samo nekoliko polja.
U ovom slučaju, možete koristiti prilagođeni izlazni format stupca. Omogućava vam da odredite koje podatke želite da izbacite. Možete prikazati bilo koje polje resursa kao zasebnu kolonu.
Upotreba prilagođenog formata određuje se pomoću opcija:
-o custom-columns=<header>:<jsonpath>[,<header>:<jsonpath>]... Svaki izlazni stupac možete definirati kao par <header>:<jsonpath>gde <header> je naziv kolone i <jsonpath> — izraz koji definira polje resursa.
Pogledajmo jednostavan primjer:
$ kubectl get pods -o custom-columns='NAME:metadata.name'
NAME
engine-544b6b6467-22qr6
engine-544b6b6467-lw5t8
engine-544b6b6467-tvgmg
web-ui-6db964458-8pdw4Izlaz sadrži jednu kolonu s imenima podova.
Izraz opcije odabire imena podova iz polja metadata.name. To je zato što je ime modula definirano u polju imena djeteta metadata u opisu resursa pod. Više detalja možete pronaći u ili upišite naredbu kubectl explain pod.metadata.name.
Sada recimo da želite da dodate dodatnu kolonu u izlaz, na primjer da prikažete čvor na kojem se izvodi svaki pod. Da biste to učinili, možete jednostavno dodati odgovarajuću specifikaciju stupca opciji prilagođenih stupaca:
$ 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 Izraz bira ime čvora iz spec.nodeName — kada je pod dodijeljen čvoru, njegovo ime se upisuje u polje spec.nodeName specifikacija resursa pod. Detaljnije informacije možete pronaći u izlazu kubectl explain pod.spec.nodeName.
Imajte na umu da su polja resursa Kubernetes osjetljiva na velika i mala slova.
Možete vidjeti bilo koje polje resursa kao kolonu. Samo pregledajte specifikaciju resursa i isprobajte je sa svim poljima koja vam se sviđaju.
Ali prvo, pogledajmo pobliže izraze za odabir polja.
JSONPath Expressions
Izrazi za odabir polja resursa su zasnovani na .
JSONPath je jezik za preuzimanje podataka iz JSON dokumenata. Odabir jednog polja je najjednostavniji slučaj upotrebe za JSONPath. Ima mnogo , uključujući birače, filtere i tako dalje.
Kubectl objašnjenje podržava ograničen broj JSONPath funkcija. Mogućnosti i primjeri njihove upotrebe opisani su u nastavku:
# Выбрать все элементы списка
$ 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'Operator [] je posebno važan. Mnoga polja resursa Kubernetes-a su liste, a ovaj operator vam omogućava da odaberete članove tih lista. Često se koristi sa zamjenskim znakom kao što je [*] za odabir svih elemenata liste.
Primjeri primjene
Mogućnosti za korištenje prilagođenog izlaznog formata kolone su beskrajne, jer možete prikazati bilo koje polje ili kombinaciju polja resursa u izlazu. Evo nekoliko primjera aplikacija, ali slobodno ih istražite i pronađite aplikacije koje vam odgovaraju.
- Prikaz slika kontejnera za mahune:
$ 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 wordpressOva naredba prikazuje nazive slika kontejnera za svaki pod.
Zapamtite da pod može sadržavati nekoliko kontejnera, tada će imena slika biti prikazana u jednom redu, odvojena zarezima.
- Prikaz zona dostupnosti čvorova:
$ 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-1bOva naredba je korisna ako je vaš klaster smješten u javnom oblaku. Prikazuje zonu dostupnosti za svaki čvor.
Zona dostupnosti je koncept oblaka koji ograničava zonu replikacije na geografsku regiju.
Zone dostupnosti za svaki čvor dobijaju se preko posebne oznake - . Ako klaster radi u javnom oblaku, ova oznaka se kreira automatski i popunjava nazivima zona dostupnosti za svaki čvor.
Oznake nisu dio Kubernetes specifikacije resursa, tako da nećete naći informacije o njima . Međutim, one se mogu vidjeti (kao i sve druge oznake) ako zatražite informacije o čvorovima u YAML ili JSON formatu:
$ kubectl get nodes -o yaml # или $ kubectl get nodes -o jsonOvo je sjajan način da saznate više o resursima, pored učenja specifikacija resursa.
4. Lako prelazite između klastera i imenskih prostora
Kada kubectl uputi zahtjev Kubernetes API-ju, on prvo čita kubeconfig datoteku kako bi dobio sve potrebne parametre za vezu.
Podrazumevano je kubeconfig datoteka ~/.kube/config. Obično se ova datoteka kreira ili ažurira posebnom naredbom.
Kada radite sa više klastera, vaša kubeconfig datoteka sadrži postavke za povezivanje sa svim tim klasterima. Potreban vam je način da kažete komandi kubectl s kojim klasterom radite.
Unutar klastera, možete kreirati više imenskih prostora—tip virtuelnog klastera unutar fizičkog klastera. Kubectl također određuje koji će imenski prostor koristiti na osnovu kubeconfig datoteke. To znači da vam je također potreban način da kažete komandi kubectl s kojim imenskim prostorom treba raditi.
U ovom poglavlju ćemo objasniti kako to funkcionira i kako ga učiniti djelotvornim.
Imajte na umu da možda imate više datoteka kubeconfig navedenih u varijabli okruženja KUBECONFIG. U ovom slučaju, svi ovi fajlovi će biti kombinovani u jednu zajedničku konfiguraciju tokom vremena izvršavanja. Također možete promijeniti zadanu kubeconfig datoteku pokretanjem kubectl sa parametrom --kubeconfig. Vidi .
kubeconfig datoteke
Hajde da vidimo šta tačno sadrži datoteka kubeconfig:

Kao što vidite, datoteka kubeconfig sadrži skup konteksta. Kontekst se sastoji od tri elementa:
- Klaster — API URL servera klastera.
- Korisnik - vjerodajnice za provjeru autentičnosti korisnika u klasteru.
- Imenski prostor - imenski prostor koji se koristi prilikom pridruživanja klasteru.
U praksi, oni često koriste jedan kontekst po klasteru u svom kubeconfigu. Međutim, možete imati više konteksta po klasteru, diferenciranih prema korisniku ili imenskom prostoru. Međutim, ova multikontekstualna konfiguracija je neuobičajena, tako da obično postoji mapiranje jedan-na-jedan između klastera i konteksta.
U svakom trenutku, jedan od konteksta je aktuelan:

Kada kubectl čita konfiguracionu datoteku, uvijek uzima informacije iz trenutnog konteksta. U gornjem primjeru, kubectl će se povezati na Hare klaster.
Shodno tome, da biste se prebacili na drugi klaster, morate promijeniti trenutni kontekst u kubeconfig datoteci:

Sada će se kubectl povezati na Fox klaster.
Da biste se prebacili na drugi imenski prostor u istom klasteru, trebate promijeniti vrijednost elementa imenskog prostora za trenutni kontekst:

U gornjem primjeru, kubectl će koristiti Prod imenski prostor Fox klastera (prethodno je postavljen Test imenski prostor).
Imajte na umu da kubectl takođe nudi opcije --cluster, --user, --namespace и --context, koji vam omogućavaju da prepišete pojedinačne elemente i sam trenutni kontekst, bez obzira na to što je postavljeno u kubeconfig. Pogledaj kubectl options.
U teoriji, možete ručno promijeniti postavke u kubeconfig. Ali to je nezgodno. Da biste pojednostavili ove operacije, postoje različiti uslužni programi koji vam omogućavaju da automatski mijenjate parametre.
Koristite kubectx
Vrlo popularan uslužni program za prebacivanje između klastera i imenskih prostora.
Uslužni program pruža komande kubectx и kubens da promijenite trenutni kontekst i imenski prostor.
Kao što je spomenuto, promjena trenutnog konteksta znači promjenu klastera ako imate samo jedan kontekst po klasteru.
Evo primjera pokretanja ovih naredbi:

U suštini, ove komande jednostavno uređuju kubeconfig datoteku kao što je gore opisano.
za instaliranje kubectx, slijedite upute na
Obje naredbe podržavaju automatsko dovršavanje imena konteksta i imenskog prostora, što eliminira potrebu za njihovim upisivanjem u potpunosti. Upute za postavljanje automatskog dovršavanja .
Još jedna korisna funkcija kubectx To je . Radi u sprezi sa uslužnim programom , koji se mora instalirati zasebno. Instaliranje fzf-a automatski čini interaktivni način dostupnim kubectx. Interaktivno, možete odabrati kontekst i imenski prostor kroz interaktivno besplatno sučelje za pretraživanje koje pruža fzf.
Korištenje alijasa ljuske
Ne trebaju vam odvojeni alati da promijenite trenutni kontekst i prostor imena jer kubectl također pruža komande za ovo. Da, tim kubectl config pruža podnaredbe za uređivanje kubeconfig datoteka.
Evo nekih od njih:
kubectl config get-contexts: prikaz svih konteksta;kubectl config current-context: dobiti trenutni kontekst;kubectl config use-context: promijeniti trenutni kontekst;kubectl config set-context: Promijenite element konteksta.
Međutim, direktno korištenje ovih naredbi nije baš zgodno jer su dugačke. Za njih možete napraviti pseudonime ljuske koje je lako izvršiti.
Napravio sam skup alijasa na osnovu ovih naredbi koje pružaju funkcionalnost sličnu kubectx-u. Ovdje ih možete vidjeti na djelu:

Imajte na umu da pseudonimi koriste fzf da obezbede interaktivni besplatni interfejs za traženje (kao što je kubectx-ov interaktivni režim). To znači da trebate da koristite ove pseudonime.
Evo definicija samih alijasa:
# Получить текущий контекст
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/^..//")"' Da biste postavili ove pseudonime, morate dodati gornje definicije u svoju datoteku ~/.bashrc ili ~/.zshrc i ponovo pokrenite svoju školjku.
Korištenje dodataka
Kubectl vam omogućava da učitate dodatke koji se izvršavaju na isti način kao i osnovne komande. Možete, na primjer, instalirati kubectl-foo dodatak i pokrenuti ga izvršavanjem naredbe kubectl foo.
Bilo bi zgodno promijeniti kontekst i imenski prostor na ovaj način, na primjer pokretanjem kubectl ctx promijeniti kontekst i kubectl ns da promijenite imenski prostor.
Napisao sam dva dodatka koji ovo rade:
Rad dodataka je zasnovan na pseudonima iz prethodnog odeljka.
Evo kako rade:

Imajte na umu da dodaci koriste fzf da obezbede interaktivni besplatni interfejs za pretragu (kao što je kubectx-ov interaktivni režim). To znači da trebateda koristite ove pseudonime.
Da biste instalirali dodatke, morate preuzeti shell skripte named и u bilo koji direktorij u vašoj PATH varijabli i učinite ih izvršnim s npr. chmod +x. Odmah nakon toga moći ćete koristiti kubectl ctx и kubectl ns.
5. Smanjite unos sa automatskim aliasima
Shell aliasi su dobar način da se ubrza unos. Projekt sadrži oko 800 prečica za osnovne kubectl komande.
Možda se pitate – kako pamtite 800 alijasa? Ali ne morate ih sve zapamtiti, jer su izgrađeni prema jednostavnoj shemi, koja je data u nastavku:

Na primjer:
- kgpooyaml - kubectl get pods oyaml
- ksysgsvcw — kubectl -n kube-sistem dobiti svc w
- ksysrmcm -kubectl -n kube-sistem rm cm
- kgdepallsl - kubectl dobiti implementaciju svih sl
Kao što vidite, aliasi se sastoje od komponenti, od kojih svaka predstavlja određeni element komande kubectl. Svaki pseudonim može imati jednu komponentu za osnovnu naredbu, operaciju i resurs i više komponenti za parametre. Ove komponente jednostavno "naseljate" s lijeva na desno prema dijagramu iznad.
Trenutni detaljni dijagram je na . Tamo takođe možete pronaći.
Na primjer, alias kgpooyamlall je ekvivalentan naredbi kubectl get pods -o yaml --all-namespaces.
Relativni redosled opcija nije važan: komanda kgpooyamlall je ekvivalentna naredbi kgpoalloyaml.
Ne morate koristiti sve komponente kao pseudonime. Na primjer k, kg, klo, ksys, kgpo takođe se može koristiti. Štaviše, možete kombinovati pseudonime i regularne komande ili opcije na komandnoj liniji:
Na primjer:
- Umjesto
kubectl proxymože pisatik proxy. - Umjesto
kubectl get rolesmože pisatikg roles(trenutno ne postoji pseudonim za resurs Roles). - Da biste dobili podatke za određeni pod, možete koristiti naredbu
kgpo my-pod — kubectl get pod my-pod.
Imajte na umu da neki aliasi zahtijevaju argument komandne linije. Na primjer, alias kgpol znači kubectl get pods -l. Opcija -l zahtijeva argument - specifikaciju oznake. Ako koristite pseudonim to će izgledati ovako kgpol app=ui.
Budući da neki pseudonimi zahtevaju argumente, alijasi a, f i l se moraju koristiti poslednji.
Uopšteno govoreći, kada se savladate sa ovom šemom, možete intuitivno da izvedete alijase iz komandi koje želite da izvršite i uštedite mnogo vremena za kucanje.
Instalacija
Da biste instalirali kubectl-aliases, morate preuzeti datoteku sa GitHub-a i uključite ga u datoteku ~/.bashrc ili ~/.zshrc:
source ~/.kubectl_aliasesAutocompletion
Kao što smo ranije rekli, često dodajete dodatne riječi pseudonima na komandnoj liniji. Na primjer:
$ kgpooyaml test-pod-d4b77b989Ako koristite dovršavanje naredbe kubectl, vjerovatno ste koristili automatsko dovršavanje za stvari kao što su imena resursa. Ali da li se to može učiniti kada se koriste aliasi?
Ovo je vrlo važno pitanje jer ako automatsko dovršavanje ne radi, izgubit ćete neke od prednosti alijasa.
Odgovor zavisi od toga koju školjku koristite:
- Za Zsh, alias completion radi odmah.
- Za Bash, nažalost, potrebno je nešto poraditi da bi automatsko dovršavanje radilo.
Omogućavanje automatskog dovršavanja za pseudonime u Bashu
Problem sa Bash-om je u tome što pokušava da dovrši (svaki put kada pritisnete Tab) pseudonim, a ne naredbu na koju se pseudonim odnosi (kao Zsh, na primer). Pošto nemate skripte za dovršavanje za svih 800 aliasa, automatsko dovršavanje ne radi.
Projekat daje opće rješenje za ovaj problem. Povezuje se sa mehanizmom dovršavanja za pseudonime, interno proširuje pseudonim na komandu i vraća opcije dovršavanja za završenu komandu. To znači da se dopuna za alias ponaša potpuno isto kao i za punu komandu.
U nastavku ću prvo objasniti kako instalirati potpuni alias, a zatim kako ga konfigurirati da omogući završetak za sve kubectl pseudonime.
Instaliranje kompletnog aliasa
Prije svega, potpuni alias ovisi o Stoga, prije instaliranja complete-alias-a, morate se uvjeriti da je bash-completion instaliran. Upute za instalaciju su date ranije za Linux i MacOS-u.
Važna napomena za korisnike MacOS-a: Kao i kubectl skripta za autodovršavanje, full-alias ne radi sa Bash 3.2, što je podrazumevano na MacOS-u. Konkretno, full-alias zavisi od bash-completion v2 (brew install bash-completion@2), što zahtijeva najmanje Bash 4.1. To znači da za korištenje potpunog alias-a na MacOS-u morate instalirati noviju verziju Bash-a.
Morate preuzeti skriptu из i uključite ga u svoj fajl ~/.bashrc:
source ~/bash_completion.shNakon ponovnog pokretanja ljuske, kompletan alias će biti u potpunosti instaliran.
Omogućavanje automatskog dovršavanja za kubectl pseudonime
Tehnički kompletan alias pruža funkciju omotača _complete_alias. Ova funkcija provjerava pseudonim i vraća naznake završetka za naredbu alias.
Da biste povezali funkciju sa određenim aliasom, morate koristiti ugrađeni Bash mehanizam , za instalaciju _complete_alias kao funkcija dovršavanja aliasa.
Kao primjer, uzmimo pseudonim k, koji označava naredbu kubectl. instalirati _complete_alias Kao dopunsku funkciju za ovaj alias, trebali biste pokrenuti sljedeću naredbu:
$ complete -F _complete_alias k Rezultat ovoga je da kad god autodovršavate alias k, funkcija se poziva _complete_alias, koji provjerava pseudonim i vraća naznake za završetak naredbe kubectl.
Kao drugi primjer, uzmimo pseudonim kgšto stoji kubectl get:
$ complete -F _complete_alias kg Baš kao u prethodnom primjeru, kada automatski dovršite kg, dobit ćete iste savjete za završetak kao i za kubectl get.
Imajte na umu da možete koristiti potpuni alias za bilo koji pseudonim na vašem sistemu.
Stoga, da biste omogućili automatsko dovršavanje za sve kubectl pseudonime, morate pokrenuti gornju naredbu za svaki od njih. Sljedeći isječak radi upravo to, pod uslovom da ste postavili kubectl-aliases na ~/.kubectl-aliases:
for _a in $(sed '/^alias /!d;s/^alias //;s/=.*$//' ~/.kubectl_aliases);
do
complete -F _complete_alias "$_a"
done Ovaj dio koda treba staviti u svoj ~/.bashrc, ponovo pokrenite komandnu ljusku i autodovršavanje će postati dostupno za svih 800 kubectl aliasa.
6. Proširivanje kubectl-a sa dodacima
Počevši od , kubectl podržava , koji vam omogućava da proširite njegove funkcije dodatnim naredbama.
Ako ste upoznati sa , tada su kubectl dodaci izgrađeni na istom principu.
U ovom poglavlju ćemo pokriti kako instalirati dodatke, gdje ih pronaći i kako kreirati vlastite dodatke.
Instaliranje dodataka
Kubectl dodaci se distribuiraju kao jednostavne izvršne datoteke sa imenom kao kubectl-x. Prefiks kubectl- je obavezan, nakon čega slijedi nova kubectl podkomanda koja vam omogućava da pozovete dodatak.
Na primjer, hello dodatak će se distribuirati kao datoteka pod nazivom kubectl-hello.
Da biste instalirali dodatak, morate kopirati datoteku kubectl-x u bilo koji direktorij u vašem PATH i učinite ga izvršnim, na primjer sa chmod +x. Odmah nakon toga možete pozvati dodatak sa kubectl x.
Možete koristiti sljedeću naredbu za popis svih dodataka koji su trenutno instalirani na vašem sistemu:
$ kubectl plugin listOva komanda će također prikazati upozorenja ako imate više dodataka sa istim imenom ili ako postoji datoteka dodataka koja nije izvršna.
Pronalaženje i instaliranje dodataka koristeći Krew
Kubectl dodaci se mogu dijeliti ili ponovo koristiti kao softverski paketi. Ali gdje možete pronaći dodatke koje su drugi podijelili?
ima za cilj da pruži jedinstveno rešenje za deljenje, pretraživanje, instaliranje i upravljanje kubectl dodacima. Projekat sebe naziva "upravitelj paketa za kubectl dodatke" (Krew je sličan ).
Krew je lista kubectl dodataka koje možete odabrati i instalirati. U isto vrijeme, Krew je također dodatak za kubectl.
To znači da instalacija Krew-a funkcionira u suštini kao instaliranje bilo kojeg drugog kubectl dodatka. Detaljna uputstva možete pronaći na .
Najvažnije Krew naredbe su:
# Поиск в списке плагинов
$ kubectl krew search [<query>]
# Посмотреть информацию о плагине
$ kubectl krew info <plugin>
# Установить плагин
$ kubectl krew install <plugin>
# Обновить все плагины до последней версии
$ kubectl krew upgrade
# Посмотреть все плагины, установленные через Krew
$ kubectl krew list
# Деинсталлировать плагин
$ kubectl krew remove <plugin>Imajte na umu da instaliranje dodataka koristeći Krew ne ometa instaliranje dodataka korištenjem standardne metode opisane gore.
Imajte na umu da je komanda kubectl krew list prikazuje samo dodatke koji su instalirani pomoću Krew-a, dok naredba kubectl plugin list navodi sve dodatke, odnosno one koji su instalirani koristeći Krew i one koji su instalirani drugim metodama.
Pronalaženje dodataka na drugom mjestu
Krew je mlad projekat, trenutno u fazi razvoja samo oko 30 dodataka. Ako ne možete pronaći ono što vam treba, možete pronaći dodatke na drugom mjestu, kao što je GitHub.
Preporučujem da pogledate GitHub odjeljak . Tamo ćete pronaći desetine dostupnih dodataka koje vrijedi provjeriti.
Pisanje vlastitih dodataka
možete sami - Nije teško. Morate kreirati izvršnu datoteku koja radi ono što vam treba, dajte joj ime kubectl-x i instalirajte kako je gore opisano.
Datoteka može biti bash skripta, python skripta ili kompajlirana GO aplikacija - nije važno. Jedini uslov je da se može direktno izvršiti u operativnom sistemu.
Kreirajmo sada primjer plugina. U prethodnom odeljku, koristili ste naredbu kubectl da izliste kontejnere za svaki pod. Ovu naredbu je lako pretvoriti u dodatak koji možete pozvati sa npr. kubectl img.
Kreirajte fajl kubectl-img sljedeći sadržaj:
#!/bin/bash
kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image' Sada napravite datoteku izvršnom sa chmod +x kubectl-img i premjestite ga u bilo koji direktorij u vašem PATH. Odmah nakon toga možete koristiti dodatak kubectl img.
Kao što je spomenuto, kubectl dodaci mogu biti napisani u bilo kojem programskom ili skript jeziku. Ako koristite shell skripte, prednost je što možete lako pozvati kubectl iz dodatka. Međutim, možete pisati složenije dodatke u stvarnim programskim jezicima koristeći . Ako koristite Go, također možete koristiti , koji postoji posebno za pisanje kubectl dodataka.
Kako podijeliti svoje dodatke
Ako mislite da bi vaši dodaci mogli biti korisni drugima, slobodno ih podijelite na GitHubu. Obavezno ih dodajte u temu .
Također možete zatražiti da se doda vaš dodatak . Uputstva o tome kako to učiniti su u .
Završetak naredbe
Dodaci trenutno ne podržavaju automatsko dovršavanje. To jest, morate unijeti puno ime dodatka i puna imena argumenata.
GitHub kubectl spremište za ovu funkciju ima . Tako da je moguće da će ova funkcija biti implementirana nekada u budućnosti.
Sretno !!!
Šta još pročitati na temu:
- .
- .
- .
izvor: www.habr.com







