Kako efikasnije koristiti kubectl: detaljan vodič

Kako efikasnije koristiti kubectl: detaljan vodič
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 Kubernetes aaS sa Mail.ru 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:

Kako efikasnije koristiti kubectl: detaljan vodič
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.yaml

Ovo ć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}/replicasets

API krajnje tačke za sve Kubernetes operacije se mogu naći na API reference (uključujući gornju krajnju tačku). 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:

  1. Trezor - pohranjuje definicije resursa (obično je itd).
  2. API server — pruža API i upravlja skladištenjem.
  3. Controller Manager — Osigurava da su statusi resursa u skladu sa specifikacijama.
  4. Planer — raspoređuje podove na radničkim čvorovima.

A evo jedne najvažnije komponente na radničkim čvorovima:

  1. 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 ReplicaSet API krajnja tačka (prolaženje ReplicaSet definicije resursa).

Šta se dešava u klasteru?

  1. Nakon odrade kubectl create -f replicaset.yaml API server pohranjuje vašu ReplicaSet definiciju resursa u pohranu:

    Kako efikasnije koristiti kubectl: detaljan vodič

  2. Zatim, ReplicaSet kontroler se pokreće u upravljaču kontrolera, koji upravlja kreiranjem, modifikacijom i brisanjem ReplicaSet resursa:

    Kako efikasnije koristiti kubectl: detaljan vodič

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

    Kako efikasnije koristiti kubectl: detaljan vodič

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

    Kako efikasnije koristiti kubectl: detaljan vodič

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

    Kako efikasnije koristiti kubectl: detaljan vodič

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

    Kako efikasnije koristiti kubectl: detaljan vodič

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

    Kako efikasnije koristiti kubectl: detaljan vodič

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:

  1. ReplicaSet kontroler koristi API krajnju točku lista ReplicaSets sa parametrom watch za praćenje promjena u ReplicaSet resursima.
  2. ReplicaSet kontroler koristi API krajnju točku kreiraj Pod (kreiraj pod) za kreiranje podova.
  3. Planer koristi API krajnju tačku patch pod (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:

  1. Skladišni prostori navode, odnosno Kubernetes resurse.
  2. API server pruža interfejs za skladište u obliku Kubernetes API-ja.
  3. 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:

Kako efikasnije koristiti kubectl: detaljan vodič
Dovršavanje naredbi radi za Bash i Zsh školjke.

Službeni vodič 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 bash

Ili:

$ kubectl completion zsh

U teoriji, dovoljno je spojiti izlaz ovih komandi na odgovarajuću komandnu ljusku tako da kubectl može dopuniti komande.

U praksi, način povezivanja je drugačiji za Bash (uključujući razlike između Linuxa i MacOS-a) i Zsh. U nastavku ćemo pogledati sve ove opcije.

Bash na Linuxu

Bash completion skripta zavisi od bash-completion paketa, tako da je prvo morate instalirati:

$ sudo apt-get install bash-completion

Ili:

$ yum install bash-completion

Mož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 “Ažuriranje Bash-a na MacOS-u".

Prije nego što nastavite, provjerite koristite li najnoviju verziju Bash-a (provjerite izlaz bash --version).

Bash skripta za završetak se razlikuje od projekta bash-završetak, pa ga prvo morate instalirati.

Možete instalirati bash-completion koristeći homebrew:

$ 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_completion

Ako 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/kubectl

Ova 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 kubectl koristeći Homebrew, 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
compinit

2. 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 onda.

Možete prikazati cijelo stablo ako dodate opciju --recursive:

$ kubectl explain deployment.spec --recursive

Ako 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.spec

3. 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       78d

Ovaj 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-8pdw4

Izlaz 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 API vodič 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.

JSONPath je jezik za preuzimanje podataka iz JSON dokumenata. Odabir jednog polja je najjednostavniji slučaj upotrebe za JSONPath. Ima mnogo veći glas, 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.

  1. 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      wordpress

    Ova 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.

  2. 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-1b

    Ova 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 - failure-domain.beta.kubernetes.io/zone. 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 API vodič. 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 json

    Ovo 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 službena dokumentacija.

kubeconfig datoteke

Hajde da vidimo šta tačno sadrži datoteka kubeconfig:

Kako efikasnije koristiti kubectl: detaljan vodič
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:

Kako efikasnije koristiti kubectl: detaljan vodič
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:

Kako efikasnije koristiti kubectl: detaljan vodič
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:

Kako efikasnije koristiti kubectl: detaljan vodič
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:

Kako efikasnije koristiti kubectl: detaljan vodič
U suštini, ove komande jednostavno uređuju kubeconfig datoteku kao što je gore opisano.

za instaliranje kubectx, slijedite upute na Github.

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 ovdje.

Još jedna korisna funkcija kubectx To je interaktivni način rada. Radi u sprezi sa uslužnim programom fzf, 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:

Kako efikasnije koristiti kubectl: detaljan vodič
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 instaliraj fzfda 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:

Kako efikasnije koristiti kubectl: detaljan vodič
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 trebate instaliraj fzfda koristite ove pseudonime.

Da biste instalirali dodatke, morate preuzeti shell skripte named kubectl-ctx и kubectl-ns 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 kubectl-aliases 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:

Kako efikasnije koristiti kubectl: detaljan vodič
Na primjer:

  1. kgpooyaml - kubectl get pods oyaml
  2. ksysgsvcw — kubectl -n kube-sistem dobiti svc w
  3. ksysrmcm -kubectl -n kube-sistem rm cm
  4. 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 GitHub. Tamo takođe možete pronaći puna lista alijasa.

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:

  1. Umjesto kubectl proxy može pisati k proxy.
  2. Umjesto kubectl get roles može pisati kg roles (trenutno ne postoji pseudonim za resurs Roles).
  3. 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 .kubectl_aliases sa GitHub-a i uključite ga u datoteku ~/.bashrc ili ~/.zshrc:

source ~/.kubectl_aliases

Autocompletion

Kao što smo ranije rekli, često dodajete dodatne riječi pseudonima na komandnoj liniji. Na primjer:

$ kgpooyaml test-pod-d4b77b989

Ako 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:

  1. Za Zsh, alias completion radi odmah.
  2. 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 potpuni alias 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 bash-završetak. Stoga, prije instaliranja full-aliasa, morate biti sigurni da je bash-completion instaliran. Uputstva za instalaciju su ranije davana za Linux i MacOS.

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 bash_completion.sh из GitHub spremište i uključite ga u svoj fajl ~/.bashrc:

source ~/bash_completion.sh

Nakon 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 kompletan, 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 verzija 1.12, kubectl podržava plugin mehanizam, koji vam omogućava da proširite njegove funkcije dodatnim naredbama.

Ako ste upoznati sa Mehanizmi Git dodataka, 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 list

Ova 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?

Project Krew 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 Brew).

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 GitHub stranica.

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 lista 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 kubectl-plugins. Tamo ćete pronaći desetine dostupnih dodataka koje vrijedi provjeriti.

Pisanje vlastitih dodataka

možete sami kreirajte dodatke - 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 Kubernetes klijentska biblioteka. Ako koristite Go, također možete koristiti cli-runtime biblioteka, 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 kubectl-plugins.

Također možete zatražiti da se doda vaš dodatak Krew lista. Uputstva o tome kako to učiniti su u GitHub spremišta.

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 otvoreni zahtjev. Tako da je moguće da će ova funkcija biti implementirana nekada u budućnosti.

Sretno !!!

Šta još pročitati na temu:

  1. Tri nivoa automatskog skaliranja u Kubernetesu i kako ih efikasno koristiti.
  2. Kubernetes u duhu piraterije sa šablonom za implementaciju.
  3. Naš kanal Oko Kubernetesa u Telegramu.

izvor: www.habr.com

Dodajte komentar