Kako učinkovitije koristiti kubectl: detaljan vodič

Kako učinkovitije koristiti kubectl: detaljan vodič
Ako radite s Kubernetesom, kubectl je vjerojatno jedan od uslužnih programa koje najviše koristite. A kad god provodite puno vremena radeći s određenim alatom, isplati se dobro ga proučiti i naučiti kako ga učinkovito koristiti.

Momčad Kubernetes aaS s Mail.ru preveo članak Daniela Weibela u kojem ćete pronaći savjete i trikove za učinkovit rad s kubectlom. Također će vam pomoći da steknete dublje razumijevanje Kubernetesa.

Prema riječima autora, cilj članka je učiniti vaš svakodnevni rad s Kubernetesom ne samo učinkovitijim, već i ugodnijim!

Uvod: Što je kubectl

Prije nego što naučite koristiti kubectl učinkovitije, morate steći osnovno razumijevanje o tome što je to i kako radi.

Iz korisničke perspektive, kubectl je upravljačka ploča koja vam omogućuje izvođenje Kubernetes operacija.

Tehnički gledano, kubectl je Kubernetes API klijent.

Kubernetes API je HTTP REST API. Ovaj API je pravo Kubernetes korisničko sučelje, preko kojeg se potpuno kontrolira. To znači da je svaka Kubernetes operacija izložena kao krajnja točka API-ja i može se izvršiti s HTTP zahtjevom toj krajnjoj točki.

Stoga je glavni posao kubectla slanje HTTP zahtjeva Kubernetes API-ju:

Kako učinkovitije koristiti kubectl: detaljan vodič
Kubernetes je potpuno resursno orijentiran sustav. To znači da održava unutarnje stanje resursa i sve Kubernetes operacije su CRUD operacije.

Vi u potpunosti kontrolirate Kubernetes upravljajući ovim resursima, a Kubernetes shvaća što učiniti na temelju trenutnog stanja resursa. Iz tog razloga, referenca Kubernetes API-ja organizirana je kao popis vrsta resursa s njihovim pridruženim operacijama.

Pogledajmo primjer.

Recimo da želite stvoriti ReplicaSet resurs. Da biste to učinili, opišite ReplicaSet u datoteci imenom replicaset.yaml, zatim pokrenite naredbu:

$ kubectl create -f replicaset.yaml

Ovo će stvoriti resurs ReplicaSet. Ali što se događa iza kulisa?

Kubernetes ima operaciju stvaranja ReplicaSeta. Kao i svaka druga operacija, izložena je kao API krajnja točka. Konkretna API krajnja točka za ovu operaciju izgleda ovako:

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

API krajnje točke za sve Kubernetes operacije mogu se pronaći na API referenca (uključujući gornju krajnju točku). Da biste uputili stvarni zahtjev krajnjoj točki, prvo morate dodati URL API poslužitelja stazama krajnje točke koje su navedene u referenci API-ja.

Stoga, kada izvršite gornju naredbu, kubectl šalje HTTP POST zahtjev gornjoj API krajnjoj točki. Definicija ReplicaSet koju ste naveli u datoteci replicaset.yaml, šalje se u tijelu zahtjeva.

Ovako radi kubectl za sve naredbe koje su u interakciji s Kubernetes klasterom. U svim tim slučajevima kubectl jednostavno šalje HTTP zahtjeve odgovarajućim Kubernetes API krajnjim točkama.

Imajte na umu da Kubernetesom možete u potpunosti upravljati pomoću uslužnog programa 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 korisnik kubectla trebao znati. Bacimo brzi pogled na unutarnji svijet Kubernetesa.

Unutarnji svijet Kubernetesa

Kubernetes se sastoji od skupa neovisnih komponenti koje se izvode kao zasebni procesi na čvorovima klastera. Neke komponente rade na glavnim čvorovima, druge na radnim čvorovima, a svaka komponenta obavlja svoj specifični zadatak.

Ovdje su najvažnije komponente na glavnim čvorovima:

  1. Svod - pohranjuje definicije resursa (obično je itd).
  2. API poslužitelj — pruža API i upravlja pohranom.
  3. Upravitelj kontrolera — Osigurava da su statusi resursa u skladu sa specifikacijama.
  4. Planer — raspoređuje mahune na radnim čvorovima.

I ovdje je jedna najvažnija komponenta na radnim čvorovima:

  1. kubelet — upravlja pokretanjem spremnika 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 uputio HTTP POST zahtjev za ReplicaSet API krajnja točka (prolaskom definicije resursa ReplicaSet).

Što se događa u klasteru?

  1. Nakon odrađivanja kubectl create -f replicaset.yaml API poslužitelj pohranjuje vašu definiciju resursa ReplicaSet u pohranu:

    Kako učinkovitije koristiti kubectl: detaljan vodič

  2. Zatim se pokreće ReplicaSet kontroler u upravitelju kontrolera, koji upravlja stvaranjem, modificiranjem i brisanjem ReplicaSet resursa:

    Kako učinkovitije koristiti kubectl: detaljan vodič

  3. Kontroler ReplicaSet stvara definiciju pod-a za svaku repliku ReplicaSet-a (prema predlošku pod-a u definiciji ReplicaSet-a) i pohranjuje ih u pohranu:

    Kako učinkovitije koristiti kubectl: detaljan vodič

  4. Planer se pokreće, prateći podove koji još nisu dodijeljeni nijednom radnom čvoru:

    Kako učinkovitije koristiti kubectl: detaljan vodič

  5. Planer odabire prikladan radni čvor za svaki pod i dodaje ove informacije definiciji pod-a u trgovini:

    Kako učinkovitije koristiti kubectl: detaljan vodič

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

    Kako učinkovitije koristiti kubectl: detaljan vodič

  7. Kubelet čita definiciju pod-a iz pohrane i daje upute runtimeu spremnika, kao što je Docker, da pokrene spremnike na čvoru:

    Kako učinkovitije koristiti kubectl: detaljan vodič

Ispod je tekstualna verzija ovog opisa.

API zahtjev za krajnju točku stvaranja ReplicaSet-a obrađuje API poslužitelj. API poslužitelj provjerava autentičnost zahtjeva i pohranjuje definiciju resursa ReplicaSet u pohranu.

Ovaj događaj pokreće kontroler ReplicaSet, koji je potproces upravitelja kontrolera. Kontroler ReplicaSet nadzire stvaranje, ažuriranje i brisanje ReplicaSet resursa u spremištu i prima obavijest o događaju kada se to dogodi.

Posao kontrolera ReplicaSet je osigurati postojanje potrebnog broja ReplicaSet mahuna. U našem primjeru još ne postoje podovi, tako da kontroler ReplicaSet stvara ove definicije podova (prema predlošku podova u definiciji ReplicaSet) i pohranjuje ih u pohranu.

Stvaranje novih podova pokreće planer koji prati definicije podova koje još nisu zakazane za radne čvorove. Planer odabire prikladan radni čvor za svaki pod i ažurira definicije pod-a u repozitoriju.

Imajte na umu da se do ove točke nijedan kod radnog opterećenja nije izvodio nigdje u klasteru. Sve što je do sada napravljeno - ovo je stvaranje i ažuriranje resursa u repozitoriju na glavnom čvoru.

Posljednji događaj pokreće Kubelets, koji nadzire podove zakazane za svoje radne čvorove. Kubelet radnog čvora na kojem su instalirani vaši ReplicaSet moduli mora dati upute runtimeu spremnika, kao što je Docker, da preuzme potrebne slike spremnika 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 Kubernetesa (osim API poslužitelja i pohrane) prate promjene resursa u pohrani i mijenjaju informacije o resursima u pohrani.

Naravno, ove komponente ne komuniciraju izravno s pohranom, već samo putem Kubernetes API-ja.

Razmotrite sljedeće primjere:

  1. Kontroler ReplicaSet koristi krajnju točku API-ja popis ReplicaSets s parametrom watch za praćenje promjena u ReplicaSet resursima.
  2. Kontroler ReplicaSet koristi krajnju točku API-ja stvoriti Pod (stvori mahunu) za stvaranje mahuna.
  3. Planer koristi krajnju točku API-ja patch mahuna (uredi pod) za ažuriranje podova s ​​informacijama o odabranom radnom čvoru.

Kao što vidite, ovo je isti API kojem kubectl pristupa. Korištenje istog API-ja za unutarnje komponente i vanjske korisnike temeljni je koncept u dizajnu Kubernetesa.

Sada možemo sažeti kako radi Kubernetes:

  1. Stanje skladišnih pohrana, odnosno resursa Kubernetesa.
  2. API poslužitelj pruža sučelje za pohranu u obliku Kubernetes API-ja.
  3. Sve druge Kubernetes komponente i korisnici čitaju, promatraju i manipuliraju Kubernetes stanjem (resursima) putem API-ja.

Poznavanje ovih koncepata pomoći će vam da bolje razumijete kubectl i izvučete maksimum iz njega.

Sada pogledajmo neke konkretne savjete i trikove koji će vam pomoći da poboljšate svoju produktivnost s kubectlom.

1. Ubrzajte unos pomoću dovršetka naredbe

Jedna od najkorisnijih, ali često zanemarenih, tehnika za poboljšanje performansi s kubectlom je dovršavanje naredbi.

Dovršavanje naredbi omogućuje vam automatsko dovršavanje dijelova kubectl naredbi pomoću tipke Tab. Ovo funkcionira za podnaredbe, opcije i argumente, uključujući nešto tako složeno kao što su nazivi resursa.

Pogledajte kako funkcionira dovršavanje naredbe kubectl:

Kako učinkovitije koristiti kubectl: detaljan vodič
Dovršavanje naredbi radi za Bash i Zsh ljuske.

Službeni vodič sadrži detaljne upute za postavljanje automatskog dovršavanja, no u nastavku ćemo dati kratak izvadak.

Kako funkcionira dovršavanje naredbi

Dovršavanje naredbi je značajka ljuske koja radi pomoću skripte za dovršavanje. Skripta proširenja je skripta ljuske koja definira ponašanje proširenja za određenu naredbu.

Kubectl automatski generira i ispisuje skripte proširenja za Bash i Zsh pomoću sljedećih naredbi:

$ kubectl completion bash

ili:

$ kubectl completion zsh

U teoriji, dovoljno je spojiti izlaz ovih naredbi na odgovarajuću naredbenu ljusku kako bi kubectl mogao nadopuniti naredbe.

U praksi se metoda povezivanja razlikuje za Bash (uključujući razlike između Linuxa i MacOS-a) i Zsh. U nastavku ćemo pogledati sve te opcije.

Bash na Linuxu

Bash completion skripta ovisi o bash-completion paketu, pa ga morate prvo instalirati:

$ sudo apt-get install bash-completion

ili:

$ yum install bash-completion

Možete provjeriti je li paket uspješno instaliran pomoću sljedeće naredbe:

$ type _init_completion

Ako ovo ispisuje kod funkcije ljuske, tada je bash-dovršavanje ispravno instalirano. Ako naredba daje pogrešku "Nije pronađeno", trebate dodati sljedeći redak svojoj datoteci ~ / .bashrc:

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

Je li potrebno dodati ovu liniju u datoteku ~ / .bashrc ili ne ovisi o upravitelju paketa koji ste koristili za instaliranje bash-completion. Ovo je potrebno za APT, ali ne i za YUM.

Nakon instaliranja bash-completion, morate sve konfigurirati tako da skripta za dovršavanje kubectl bude omogućena u svim sesijama ljuske.

Jedan od načina da to učinite je dodavanje sljedećeg retka 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 dodatne skripte u katalogu /etc/bash_completion.d automatski se uključuju u bash-dovršetak.

Obje opcije su jednako primjenjive.

Nakon ponovnog pokretanja ljuske, dovršetak naredbe kubectl će raditi.

Bash na MacOS-u

Na MacOS-u podešavanje je malo kompliciranije. Činjenica je da prema zadanim postavkama MacOS koristi Bash verziju 3.2, a skripta za automatsko dovršavanje kubectl zahtijeva Bash verziju od najmanje 4.1 i ne radi u Bashu 3.2.

Postoje problemi s licenciranjem povezani s korištenjem zastarjele verzije Basha na MacOS-u. Bash verzija 4 je licencirana pod GPLv3, koji Apple ne podržava.

Da biste konfigurirali automatsko dovršavanje kubectl na MacOS-u, trebate instalirati noviju verziju Basha. 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 navedeni u članku "Ažuriranje Basha na MacOS-u".

Prije nastavka provjerite koristite li noviju verziju Basha (provjerite izlaz bash --version).

Bash dovršena skripta razlikuje se ovisno o projektu bash-završetak, pa ga morate prvo instalirati.

Možete instalirati bash-completion pomoću Homebrew:

$ brew install bash-completion@2

Ovdje @2 stoji za 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 Caveats koji navodi što treba dodati u datoteku ~/.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 retke ~/.bash_profile, i u ~/.bashrc. U ovom slučaju, automatsko dovršavanje bit će dostupno ne samo u glavnoj, već iu dječjim naredbenim školjkama.

Nakon ponovnog pokretanja naredbene ljuske, možete provjeriti je li instalacija ispravna pomoću sljedeće naredbe:

$ type _init_completion

Ako vidite funkciju ljuske u izlazu, onda je sve ispravno konfigurirano.

Sada moramo osigurati da je automatsko dovršavanje kubectl omogućeno u svim sesijama.

Jedan od načina je dodati sljedeći redak u vaš ~/.bashrc:

source <(kubectl completion bash)

Drugi način je dodavanje skripte za automatsko dovršavanje u mapu /usr/local/etc/bash_completion.d:

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

Ova će metoda funkcionirati 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 izvođenjem prethodnog koraka, budući da će se skripta za automatsko dovršavanje automatski smjestiti u mapu /usr/local/etc/bash_completion.d tijekom instalacije. U ovom slučaju, kubectl autocompletion počet će 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 trebate učiniti je omogućiti ih kada učitate naredbenu ljusku.

To možete učiniti dodavanjem retka u svoj ~/.zshrc datoteka:

source <(kubectl completion zsh)

Ako dobijete pogrešku not found: compdef nakon ponovnog pokretanja ljuske morate omogućiti ugrađenu funkciju compdef. Možete ga omogućiti dodavanjem na početak svoje datoteke ~/.zshrc sljedeće:

autoload -Uz compinit
compinit

2. Brzi pregled specifikacija resursa

Kada kreirate definicije YAML resursa, morate znati polja i njihovo značenje za te resurse. Jedno mjesto za traženje ovih informacija je API referenca, koja sadrži kompletne specifikacije za sve resurse.

Međutim, nezgodno je prebacivanje na web preglednik svaki put kad trebate nešto pretražiti. Stoga kubectl daje naredbu kubectl explain, koji prikazuje specifikacije svih resursa izravno u vašem terminalu.

Format naredbe je sljedeći:

$ kubectl explain resource[.field]...

Naredba će ispisati specifikaciju traženog resursa ili polja. Prikazane informacije identične su onima sadržanim u API priručniku.

Po defaultu kubectl explain prikazuje samo prvu razinu ugniježđenja polja.

Pogledajte kako to izgleda Zatim možete.

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

$ kubectl explain deployment.spec --recursive

Ako ne znate točno koji su resursi potrebni, možete ih sve prikazati sljedećom naredbom:

$ kubectl api-resources

Ova naredba prikazuje nazive resursa u obliku množine, npr. deployments umjesto deployment. Također prikazuje kratki naziv, na primjer deploy, za one resurse koji ga imaju. Ne brinite zbog ovih razlika. 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 izlazni format naredbe 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 je format prikladan, ali sadrži ograničenu količinu informacija. U usporedbi s punim formatom definicije izvora, ovdje se prikazuje samo nekoliko polja.

U ovom slučaju možete koristiti prilagođeni izlazni format stupca. Omogućuje vam da odredite koje podatke želite ispisati. Možete prikazati bilo koje polje resursa kao zaseban stupac.

Upotreba prilagođenog formata određena je pomoću opcija:

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

Svaki izlazni stupac možete definirati kao par <header>:<jsonpath>Gdje <header> je naziv stupca 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 jedan stupac s nazivima mahuna.

Izraz opcije odabire nazive mahuna iz polja metadata.name. To je zato što je naziv modula definiran u polju za naziv 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.

Recimo sada da želite dodati dodatni stupac u izlaz, na primjer, prikazujući čvor na kojem se svaki pod izvodi. 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 odabire naziv čvora iz spec.nodeName — kada je pod dodijeljen čvoru, njegovo se ime 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 polja Kubernetes resursa razlikuju velika i mala slova.

Možete vidjeti bilo koje polje resursa kao stupac. Samo pregledajte specifikaciju resursa i isprobajte je s bilo kojim poljima koja želite.

Ali prvo, pogledajmo pobliže izraze za odabir polja.

Izrazi JSONPath

Izrazi za odabir polja resursa temelje se na JSONPath.

JSONPath je jezik za dohvaćanje podataka iz JSON dokumenata. Odabir jednog polja je najjednostavniji slučaj upotrebe za JSONPath. On ima mnogo veći glas, uključujući birače, filtre i tako dalje.

Kubectl objašnjenje podržava ograničen broj značajki JSONPath. U nastavku su opisane mogućnosti i primjeri njihove upotrebe:

# Выбрать все элементы списка
$ 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'

Posebno je važan operator []. Mnoga Kubernetes polja resursa su popisi, a ovaj vam operator omogućuje odabir članova tih popisa. Često se koristi sa zamjenskim znakom kao što je [*] za odabir svih elemenata popisa.

Primjeri primjene

Mogućnosti za korištenje prilagođenog izlaznog formata stupca su beskrajne, jer možete prikazati bilo koje polje ili kombinaciju polja resursa u izlazu. Evo nekoliko primjera aplikacija, ali slobodno ih sami istražite i pronađite aplikacije koje vam odgovaraju.

  1. Prikaz slika spremnika 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 spremnika za svaku mahunu.

    Upamtite da pod može sadržavati nekoliko spremnika, tada će nazivi slika biti prikazani u jednom retku, odvojeni zarezima.

  2. Prikaz zona dostupnosti čvora:
    $ 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 koncept je oblaka koji ograničava zonu replikacije na geografsku regiju.

    Zone dostupnosti za svaki čvor dobivaju se putem posebne oznake - failure-domain.beta.kubernetes.io/zone. Ako se klaster izvodi u javnom oblaku, ova se oznaka automatski stvara i popunjava nazivima zona dostupnosti za svaki čvor.

    Oznake nisu dio Kubernetes specifikacije resursa, tako da nećete pronaći informacije o njima API vodič. Međutim, mogu se 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 naučite više o resursima, uz učenje specifikacija resursa.

4. Jednostavno prebacivanje između klastera i prostora imena

Kada kubectl uputi zahtjev Kubernetes API-ju, prvo čita kubeconfig datoteku kako bi dobio sve potrebne parametre za vezu.

Prema zadanim postavkama datoteka kubeconfig je ~/.kube/config. Obično se ova datoteka stvara ili ažurira posebnom naredbom.

Kada radite s više klastera, vaša kubeconfig datoteka sadrži postavke za povezivanje sa svim tim klasterima. Trebate način da naredbi kubectl kažete s kojim klasterom radite.

Unutar klastera možete stvoriti više imenskih prostora — vrstu virtualnog klastera unutar fizičkog klastera. Kubectl također određuje koji prostor imena koristiti na temelju kubeconfig datoteke. To znači da također trebate način da naredbi kubectl kažete s kojim prostorom imena treba raditi.

U ovom ćemo poglavlju objasniti kako funkcionira i kako ga učiniti učinkovitim.

Imajte na umu da možete imati više datoteka kubeconfig navedenih u varijabli okoline KUBECONFIG. U tom će slučaju sve te datoteke biti kombinirane u jednu zajedničku konfiguraciju tijekom izvođenja. Također možete promijeniti zadanu kubeconfig datoteku pokretanjem kubectl s parametrom --kubeconfig. Izgled službena dokumentacija.

kubeconfig datoteke

Pogledajmo što točno kubeconfig datoteka sadrži:

Kako učinkovitije koristiti kubectl: detaljan vodič
Kao što vidite, datoteka kubeconfig sadrži skup konteksta. Kontekst se sastoji od tri elementa:

  • Klaster — API URL poslužitelja klastera.
  • Korisnik - korisničke vjerodajnice za provjeru autentičnosti u klasteru.
  • Namespace - imenski prostor koji se koristi prilikom pridruživanja klasteru.

U praksi često koriste jedan kontekst po klasteru u svom kubeconfigu. Međutim, možete imati više konteksta po klasteru, diferenciranih prema korisniku ili prostoru imena. Međutim, ova konfiguracija s više konteksta je neuobičajena, tako da obično postoji mapiranje jedan na jedan između klastera i konteksta.

U bilo kojem trenutku, jedan od konteksta je aktualan:

Kako učinkovitije koristiti kubectl: detaljan vodič
Kada kubectl čita konfiguracijsku datoteku, uvijek uzima informacije iz trenutnog konteksta. U gornjem primjeru, kubectl će se povezati s klasterom Hare.

Sukladno tome, da biste se prebacili na drugi klaster, trebate promijeniti trenutni kontekst u datoteci kubeconfig:

Kako učinkovitije koristiti kubectl: detaljan vodič
Sada će se kubectl spojiti na Fox klaster.

Da biste se prebacili na drugi prostor imena u istom klasteru, trebate promijeniti vrijednost elementa prostora imena za trenutni kontekst:

Kako učinkovitije koristiti kubectl: detaljan vodič
U gornjem primjeru, kubectl će koristiti prostor imena Prod klastera Fox (prethodno je postavljen prostor imena Test).

Imajte na umu da kubectl također nudi opcije --cluster, --user, --namespace и --context, koji vam omogućuju da prebrišete pojedinačne elemente i sam trenutni kontekst, bez obzira što je postavljeno u kubeconfig. Izgled kubectl options.

U teoriji, možete ručno promijeniti postavke u kubeconfig. Ali nezgodno je. Za pojednostavljenje ovih operacija, postoje različiti uslužni programi koji vam omogućuju automatsku promjenu parametara.

Koristite kubectx

Vrlo popularan uslužni program za prebacivanje između klastera i imenskih prostora.

Uslužni program pruža naredbe kubectx и kubens za promjenu trenutnog konteksta i imenskog prostora.

Kao što je spomenuto, promjena trenutnog konteksta znači promjenu klastera ako imate samo jedan kontekst po klasteru.

Evo primjera pokretanja ovih naredbi:

Kako učinkovitije koristiti kubectl: detaljan vodič
U biti, ove naredbe jednostavno uređuju datoteku kubeconfig kao što je gore opisano.

instalirati kubectx, slijedite upute na Github.

Obje naredbe podržavaju automatsko dovršavanje naziva konteksta i prostora imena, što eliminira potrebu za njihovim potpunim upisivanjem. Upute za postavljanje automatskog dovršavanja ovdje.

Još jedna korisna značajka kubectx je interaktivni način rada. Radi u kombinaciji s uslužnim programom fzf, koji se mora zasebno instalirati. Instaliranje fzf-a automatski čini interaktivni način rada dostupnim u kubectx. Interaktivno, možete odabrati kontekst i imenski prostor kroz interaktivno besplatno sučelje za pretraživanje koje nudi fzf.

Korištenje aliasa ljuske

Ne trebate zasebne alate za promjenu trenutnog konteksta i prostora imena jer kubectl također nudi naredbe za to. Da, tim kubectl config pruža podnaredbe za uređivanje kubeconfig datoteka.

Evo nekih od njih:

  • kubectl config get-contexts: prikazati sve kontekste;
  • kubectl config current-context: dobiti trenutni kontekst;
  • kubectl config use-context: promijeniti trenutni kontekst;
  • kubectl config set-context: Promijenite element konteksta.

Međutim, izravno korištenje ovih naredbi nije baš zgodno jer su dugačke. Za njih možete napraviti pseudonime ljuske koje je lako izvršiti.

Stvorio sam skup aliasa na temelju ovih naredbi koje pružaju funkcionalnost sličnu kubectxu. Ovdje ih možete vidjeti na djelu:

Kako učinkovitije koristiti kubectl: detaljan vodič
Imajte na umu da aliasi koriste fzf za pružanje interaktivnog besplatnog sučelja za pretraživanje (poput kubectx-ovog interaktivnog načina rada). To znači da trebate instalirajte fzfkoristiti ove pseudonime.

Evo definicija samih aliasa:

# Получить текущий контекст
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/^..//")"'

Za postavljanje ovih pseudonima morate dodati gornje definicije u svoju datoteku ~/.bashrc ili ~/.zshrc i ponovno pokrenite svoju ljusku.

Korištenje dodataka

Kubectl vam omogućuje učitavanje dodataka koji se izvršavaju na isti način kao i osnovne naredbe. Možete, na primjer, instalirati dodatak kubectl-foo i pokrenuti ga izvršavanjem naredbe kubectl foo.

Bilo bi zgodno promijeniti kontekst i imenski prostor na ovaj način, npr. trčanjem kubectl ctx promijeniti kontekst i kubectl ns za promjenu imenskog prostora.

Napisao sam dva dodatka koji to rade:

Rad dodataka temelji se na aliasima iz prethodnog odjeljka.

Evo kako funkcioniraju:

Kako učinkovitije koristiti kubectl: detaljan vodič
Imajte na umu da dodaci koriste fzf za pružanje interaktivnog sučelja za besplatno pretraživanje (poput kubectx-ovog interaktivnog načina rada). To znači da trebate instalirajte fzfkoristiti ove pseudonime.

Da biste instalirali dodatke, morate preuzeti skripte ljuske pod nazivom 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 pomoću autoaliasa

Aliasi ljuske dobar su način za ubrzavanje unosa. Projekt kubectl-aliasi sadrži oko 800 prečaca za osnovne kubectl naredbe.

Možda se pitate - kako zapamtiti 800 aliasa? Ali ne morate ih sve zapamtiti, jer su izgrađeni prema jednostavnoj shemi, koja je dana u nastavku:

Kako učinkovitije koristiti kubectl: detaljan vodič
Na primjer:

  1. kgpooyaml - kubectl dobiti mahune oyaml
  2. ksysgsvcw — kubectl -n kube-system get svc w
  3. ksysrmcm -kubectl -n kube-sustav rm cm
  4. kgdepallsl - kubectl dobiti implementaciju svih sl

Kao što vidite, aliasi se sastoje od komponenti od kojih svaka predstavlja određeni element naredbe kubectl. Svaki alias može imati jednu komponentu za osnovnu naredbu, operaciju i resurs te više komponenti za parametre. Jednostavno "napunite" te komponente slijeva nadesno prema gornjem dijagramu.

Trenutačni detaljni dijagram nalazi se na GitHub. Tamo također možete pronaći potpuni popis aliasa.

Na primjer, alias kgpooyamlall je ekvivalentan naredbi kubectl get pods -o yaml --all-namespaces.

Relativni poredak opcija nije važan: naredba kgpooyamlall je ekvivalentna naredbi kgpoalloyaml.

Ne morate koristiti sve komponente kao aliase. Na primjer k, kg, klo, ksys, kgpo također se može koristiti. Štoviše, možete kombinirati aliase i redovne naredbe ili opcije u naredbenom retku:

Na primjer:

  1. Umjesto kubectl proxy možete napisati k proxy.
  2. Umjesto kubectl get roles možete napisati kg roles (trenutačno ne postoji alias za resurs Uloge).
  3. Da biste dobili podatke za određeni modul, možete koristiti naredbu kgpo my-pod — kubectl get pod my-pod.

Imajte na umu da neki aliasi zahtijevaju argument naredbenog retka. Na primjer, alias kgpol sredstva kubectl get pods -l. Opcija -l zahtijeva argument – ​​specifikaciju oznake. Ako koristite alias, izgledat će ovako kgpol app=ui.

Budući da neki aliasi zahtijevaju argumente, aliasi a, f i l moraju se koristiti zadnji.

Općenito, nakon što shvatite ovu shemu, možete intuitivno izvesti pseudonime iz naredbi koje želite izvršiti i uštedjeti puno vremena za tipkanje.

instalacija

Da biste instalirali kubectl-aliase, morate preuzeti datoteku .kubectl_aliases s GitHuba i uključite ga u datoteku ~/.bashrc ili ~/.zshrc:

source ~/.kubectl_aliases

Automatsko dovršavanje

Kao što smo već rekli, često dodajete dodatne riječi aliasu u naredbenom retku. Na primjer:

$ kgpooyaml test-pod-d4b77b989

Ako koristite dovršavanje naredbi kubectl, vjerojatno ste koristili automatsko dovršavanje za stvari poput imena resursa. Ali može li se to učiniti kada se koriste aliasi?

Ovo je vrlo važno pitanje jer ako automatsko dovršavanje ne radi, izgubit ćete neke od prednosti aliasa.

Odgovor ovisi o tome koju ljusku koristite:

  1. Za Zsh, dovršavanje aliasa radi odmah.
  2. Za Bash, nažalost, potrebno je malo rada da bi automatsko dovršavanje radilo.

Omogućivanje automatskog dovršavanja za aliase u Bashu

Problem s Bashom je taj što pokušava dovršiti (svaki put kada pritisnete Tab) alias, a ne naredbu na koju se alias odnosi (kao što Zsh radi, na primjer). Budući da nemate skripte za dovršavanje za svih 800 aliasa, automatsko dovršavanje ne radi.

Projekt kompletan-alias daje opće rješenje za ovaj problem. Povezuje se s mehanizmom dovršetka za pseudonime, interno proširuje pseudonim u naredbu i vraća opcije dovršetka za dovršenu naredbu. To znači da se ispuna za alias ponaša potpuno isto kao i za punu naredbu.

U nastavku ću prvo objasniti kako instalirati complete-alias, a zatim kako ga konfigurirati da omogući dovršetak za sve kubectl aliase.

Instaliranje kompletnog aliasa

Prije svega, potpuni alias ovisi o bash-završetak. Stoga, prije instaliranja complete-aliasa, morate biti sigurni da je instaliran bash-completion. Upute za instalaciju već su dane za Linux i MacOS.

Važna napomena za korisnike MacOS-a: Kao skripta za automatsko dovršavanje kubectl, complete-alias ne radi s Bashom 3.2, koji je zadani na MacOS-u. Konkretno, complete-alias ovisi o bash-completion v2 (brew install bash-completion@2), koji zahtijeva najmanje Bash 4.1. To znači da za korištenje complete-aliasa na MacOS-u trebate instalirati noviju verziju Basha.

Morate preuzeti skriptu bash_completion.sh od GitHub spremište i uključite ga u svoju datoteku ~/.bashrc:

source ~/bash_completion.sh

Nakon ponovnog pokretanja ljuske, complete-alias će biti potpuno instaliran.

Omogućavanje automatskog dovršavanja za aliase kubectl

Tehnički potpuni alias pruža funkciju omotača _complete_alias. Ova funkcija provjerava alias i vraća savjete za završetak za naredbu alias.

Da biste funkciju pridružili određenom aliasu, trebate koristiti ugrađeni mehanizam Bash potpun, instalirati _complete_alias kao funkcija dovršavanja aliasa.

Kao primjer, uzmimo alias 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 toga je da kad god autokompletirate alias k, funkcija se poziva _complete_alias, koji provjerava alias i vraća savjete za završetak naredbe kubectl.

Kao drugi primjer, uzmimo alias kg, koji označava kubectl get:

$ complete -F _complete_alias kg

Baš kao u prethodnom primjeru, kada samodovršavate kg, dobivate iste savjete za dovršavanje koje biste dobili za kubectl get.

Imajte na umu da možete koristiti complete-alias za bilo koji alias na vašem sustavu.

Stoga, da biste omogućili automatsko dovršavanje za sve aliase kubectl, trebate pokrenuti gornju naredbu za svaki od njih. Sljedeći isječak radi upravo to, pod uvjetom da ste postavili kubectl-aliase 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 vaš ~/.bashrc, ponovno pokrenite naredbenu ljusku i automatsko dovršavanje će postati dostupno za svih 800 kubectl aliasa.

6. Proširenje kubectla s dodacima

Počevši od inačica 1.12, kubectl podržava plugin mehanizam, koji vam omogućuju proširenje njegovih funkcija dodatnim naredbama.

Ako vam je poznato Git plugin mehanizmi, tada su kubectl dodaci izgrađeni na istom principu.

U ovom poglavlju objasnit ćemo kako instalirati dodatke, gdje ih pronaći i kako izraditi vlastite dodatke.

Instaliranje dodataka

Kubectl dodaci distribuiraju se kao jednostavne izvršne datoteke s nazivom poput kubectl-x. Prefiks kubectl- je potrebno, nakon čega slijedi nova podnaredba kubectl koja vam omogućuje pozivanje dodatka.

Na primjer, dodatak hello bit će distribuiran kao datoteka pod nazivom kubectl-hello.

Da biste instalirali dodatak, morate kopirati datoteku kubectl-x u bilo koji direktorij u vašem PATH-u i učinite ga izvršnim, na primjer s chmod +x. Odmah nakon toga možete pozvati dodatak s kubectl x.

Možete koristiti sljedeću naredbu za popis svih dodataka koji su trenutno instalirani na vašem sustavu:

$ kubectl plugin list

Ova naredba će također prikazati upozorenja ako imate više dodataka s istim imenom ili ako postoji datoteka dodataka koja nije izvršna.

Pronalaženje i instaliranje dodataka pomoću Krew

Dodaci Kubectl mogu se dijeliti ili ponovno koristiti poput softverskih paketa. Ali gdje možete pronaći dodatke koje su drugi podijelili?

Projekt Krew ima za cilj pružiti objedinjeno rješenje za dijeljenje, pretraživanje, instaliranje i upravljanje kubectl dodacima. Projekt sebe naziva "menadžer paketa za kubectl dodatke" (Krew je sličan Skuhati).

Krew je popis kubectl dodataka koje možete odabrati i instalirati. U isto vrijeme, Krew je i dodatak za kubectl.

To znači da instaliranje Krew-a funkcionira kao instaliranje bilo kojeg drugog kubectl dodatka. Detaljne upute 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 pomoću Krew-a ne ometa instaliranje dodataka korištenjem gore opisane standardne metode.

Imajte na umu da naredba kubectl krew list prikazuje samo dodatke koji su instalirani pomoću Krew, dok naredba kubectl plugin list navodi sve dodatke, odnosno one instalirane pomoću Krew-a i one instalirane na druge načine.

Pronalaženje dodataka negdje drugdje

Krew je mlad projekt, trenutno u svom popis samo oko 30 dodataka. Ako ne možete pronaći ono što vam je potrebno, dodatke možete pronaći negdje drugdje, kao što je GitHub.

Preporučujem da pogledate odjeljak GitHub kubectl-dodaci. Tamo ćete pronaći desetke dostupnih dodataka koje vrijedi provjeriti.

Pisanje vlastitih dodataka

možete sami stvoriti dodatke - Nije teško. Morate stvoriti izvršnu datoteku koja radi ono što trebate, nazovite je kao kubectl-x i instalirajte kako je gore opisano.

Datoteka može biti bash skripta, python skripta ili kompajlirana GO aplikacija - nije bitno. Jedini uvjet je da se može izravno izvršiti u operativnom sustavu.

Kreirajmo sada primjer dodatka. U prethodnom odjeljku upotrijebili ste naredbu kubectl za popis spremnika za svaku pod. Lako je ovu naredbu pretvoriti u dodatak koji možete pozvati npr. kubectl img.

Stvorite datoteku 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 pomoću chmod +x kubectl-img i premjestite ga u bilo koji direktorij u vašem PATH-u. Odmah nakon toga možete koristiti dodatak kubectl img.

Kao što je spomenuto, kubectl dodaci mogu se napisati na bilo kojem programskom ili skriptnom jeziku. Ako koristite skripte ljuske, prednost je mogućnosti jednostavnog pozivanja kubectl iz dodatka. Međutim, možete pisati složenije dodatke u stvarnim programskim jezicima pomoću Kubernetes klijentska biblioteka. Ako koristite Go, možete također koristiti cli-runtime biblioteka, koji postoji posebno za pisanje kubectl dodataka.

Kako dijeliti svoje dodatke

Ako mislite da bi vaši dodaci mogli biti korisni drugima, slobodno ih podijelite na GitHubu. Svakako ih dodajte u temu kubectl-dodaci.

Također možete zatražiti da se vaš dodatak doda Krewov popis. Upute kako to učiniti su u GitHub repozitoriji.

Završetak naredbe

Dodaci trenutno ne podržavaju automatsko dovršavanje. Odnosno, morate unijeti puni naziv dodatka i pune nazive argumenata.

GitHub kubectl repozitorij za ovu funkciju ima otvoreni zahtjev. Stoga je moguće da će ova značajka biti implementirana u budućnosti.

Sretno!!!

Što još pročitati na temu:

  1. Tri razine automatskog skaliranja u Kubernetesu i kako ih učinkovito koristiti.
  2. Kubernetes u duhu piratstva s predloškom za implementaciju.
  3. Naš kanal Oko Kubernetesa u Telegramu.

Izvor: www.habr.com

Kupite pouzdan hosting za stranice s DDoS zaštitom, VPS VDS poslužiteljima 🔥 Kupite pouzdan web hosting sa DDoS zaštitom, VPS VDS servere | ProHoster