Kako učinkoviteje uporabljati kubectl: podroben vodnik

Kako učinkoviteje uporabljati kubectl: podroben vodnik
Če delate s Kubernetesom, potem je kubectl verjetno eden izmed pripomočkov, ki jih največ uporabljate. In kadarkoli porabite veliko časa za delo z določenim orodjem, se ga splača dobro preučiti in se naučiti učinkovito uporabljati.

Ekipa Kubernetes aaS iz Mail.ru prevedel članek Daniela Weibla, v katerem boste našli nasvete in trike za učinkovito delo s kubectl. Pomagal vam bo tudi pri globljem razumevanju Kubernetesa.

Kot pravi avtor, je cilj članka narediti vaše vsakodnevno delo s Kubernetesom ne le učinkovitejše, temveč tudi prijetnejše!

Uvod: Kaj je kubectl

Preden se lahko naučite učinkoviteje uporabljati kubectl, morate pridobiti osnovno razumevanje, kaj je in kako deluje.

Z vidika uporabnika je kubectl nadzorna plošča, ki vam omogoča izvajanje operacij Kubernetes.

Tehnično gledano je kubectl odjemalec Kubernetes API.

Kubernetes API je HTTP REST API. Ta API je pravi uporabniški vmesnik Kubernetes, prek katerega je popolnoma nadzorovan. To pomeni, da je vsaka operacija Kubernetes izpostavljena kot končna točka API-ja in jo je mogoče izvesti z zahtevo HTTP do te končne točke.

Zato je glavna naloga kubectla pošiljanje zahtev HTTP API-ju Kubernetes:

Kako učinkoviteje uporabljati kubectl: podroben vodnik
Kubernetes je popolnoma virno usmerjen sistem. To pomeni, da ohranja notranje stanje virov in vse operacije Kubernetes so operacije CRUD.

Z upravljanjem teh virov imate popoln nadzor nad Kubernetesom, Kubernetes pa ugotovi, kaj storiti glede na trenutno stanje virov. Iz tega razloga je referenca Kubernetes API organizirana kot seznam vrst virov z njihovimi povezanimi operacijami.

Poglejmo si primer.

Recimo, da želite ustvariti vir ReplicaSet. Če želite to narediti, opišite ReplicaSet v datoteki z imenom replicaset.yaml, nato zaženite ukaz:

$ kubectl create -f replicaset.yaml

To bo ustvarilo vir ReplicaSet. Toda kaj se dogaja v zakulisju?

Kubernetes ima operacijo ustvarjanja ReplicaSet. Kot katera koli druga operacija je tudi ta izpostavljena kot končna točka API-ja. Končna točka API-ja za to operacijo je videti takole:

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

Končne točke API-ja za vse operacije Kubernetes lahko najdete na API referenca (vključno zgornja končna točka). Če želite poslati dejansko zahtevo končni točki, morate najprej dodati URL strežnika API na poti končne točke, ki so navedene v referenci API-ja.

Zato, ko izvedete zgornji ukaz, kubectl pošlje zahtevo HTTP POST zgornji končni točki API-ja. Definicija ReplicaSet, ki ste jo navedli v datoteki replicaset.yaml, se pošlje v telesu zahteve.

Tako kubectl deluje za vse ukaze, ki komunicirajo z gručo Kubernetes. V vseh teh primerih kubectl preprosto naredi zahteve HTTP do ustreznih končnih točk Kubernetes API.

Upoštevajte, da lahko v celoti upravljate Kubernetes z uporabo pripomočka, kot je npr curlz ročnim pošiljanjem zahtev HTTP API-ju Kubernetes. Kubectl preprosto olajša uporabo API-ja Kubernetes.

To so osnove, kaj je kubectl in kako deluje. Obstaja pa še nekaj o API-ju Kubernetes, kar bi moral vedeti vsak uporabnik kubectl. Na hitro poglejmo v notranji svet Kubernetesa.

Notranji svet Kubernetesa

Kubernetes je sestavljen iz niza neodvisnih komponent, ki se izvajajo kot ločeni procesi na vozliščih gruče. Nekatere komponente delujejo na glavnih vozliščih, druge na delovnih vozliščih, pri čemer vsaka komponenta izvaja svojo specifično nalogo.

Tu so najpomembnejše komponente na glavnih vozliščih:

  1. skladišče - shrani definicije virov (ponavadi je itd).
  2. API strežnik — zagotavlja API in upravlja shranjevanje.
  3. Upravitelj krmilnika — Zagotavlja, da so statusi virov skladni s specifikacijami.
  4. Razporejevalnik — načrtuje pode na delovnih vozliščih.

In tukaj je ena najpomembnejša komponenta na delovnih vozliščih:

  1. kubelet — upravlja zagon vsebnikov na delovnem vozlišču.

Da bi razumeli, kako te komponente delujejo skupaj, si oglejmo primer.

Predpostavimo, da ste pravkar zaključili kubectl create -f replicaset.yaml, po katerem je kubectl poslal zahtevo HTTP POST za Končna točka API-ja ReplicaSet (posredovanje definicije vira ReplicaSet).

Kaj se dogaja v grozdu?

  1. Po opravljenem kubectl create -f replicaset.yaml Strežnik API shrani vašo definicijo vira ReplicaSet v shrambo:

    Kako učinkoviteje uporabljati kubectl: podroben vodnik

  2. Nato se v upravitelju krmilnika zažene krmilnik ReplicaSet, ki upravlja ustvarjanje, spreminjanje in brisanje virov ReplicaSet:

    Kako učinkoviteje uporabljati kubectl: podroben vodnik

  3. Krmilnik ReplicaSet ustvari definicijo pod za vsako repliko ReplicaSet (v skladu s predlogo pod v definiciji ReplicaSet) in jih shrani v shrambo:

    Kako učinkoviteje uporabljati kubectl: podroben vodnik

  4. Zažene se razporejevalnik, ki sledi podom, ki še niso bili dodeljeni nobenemu delovnemu vozlišču:

    Kako učinkoviteje uporabljati kubectl: podroben vodnik

  5. Razporejevalnik izbere primerno delovno vozlišče za vsak pod in te informacije doda definiciji poda v trgovini:

    Kako učinkoviteje uporabljati kubectl: podroben vodnik

  6. Na delovnem vozlišču, ki mu je dodeljen pod, se zažene Kubelet, ki sledi podom, dodeljenim temu vozlišču:

    Kako učinkoviteje uporabljati kubectl: podroben vodnik

  7. Kubelet prebere definicijo sklopa iz pomnilnika in ukaže izvajalnemu okolju vsebnika, kot je Docker, naj zažene vsebnike v vozlišču:

    Kako učinkoviteje uporabljati kubectl: podroben vodnik

Spodaj je besedilna različica tega opisa.

Zahtevo API do končne točke ustvarjanja ReplicaSet obdela strežnik API. Strežnik API overi zahtevo in shrani definicijo vira ReplicaSet v shrambo.

Ta dogodek zažene krmilnik ReplicaSet, ki je podproces upravljalnika krmilnika. Krmilnik ReplicaSet spremlja ustvarjanje, posodabljanje in brisanje virov ReplicaSet v shrambi in prejme obvestilo o dogodku, ko se to zgodi.

Naloga krmilnika ReplicaSet je zagotoviti, da obstaja potrebno število podov ReplicaSet. V našem primeru podi še ne obstajajo, zato krmilnik ReplicaSet ustvari te definicije podov (v skladu s predlogo podov v definiciji ReplicaSet) in jih shrani v shrambo.

Ustvarjanje novih podov sproži razporejevalnik, ki spremlja definicije podov, ki še niso načrtovane za delovna vozlišča. Razporejevalnik izbere primerno delovno vozlišče za vsak pod in posodobi definicije podov v repozitoriju.

Upoštevajte, da se do te točke nikjer v gruči ni izvajala nobena delovna koda. Vse, kar je bilo do sedaj narejeno - to je ustvarjanje in posodabljanje virov v repozitoriju na glavnem vozlišču.

Zadnji dogodek sproži Kubelets, ki spremlja pode, načrtovane za njihova delovna vozlišča. Kubelet delavskega vozlišča, na katerem so nameščeni vaši moduli ReplicaSet, mora izvajalnemu okolju vsebnika, kot je Docker, dati ukaz, naj prenese zahtevane slike vsebnika in jih zažene.

Na tej točki se vaša aplikacija ReplicaSet končno izvaja!

Vloga Kubernetes API

Kot ste videli v prejšnjem primeru, komponente Kubernetes (razen strežnika API in pomnilnika) spremljajo spremembe virov v pomnilniku in spreminjajo informacije o virih v pomnilniku.

Seveda te komponente ne komunicirajo neposredno s shrambo, ampak samo prek API-ja Kubernetes.

Razmislite o naslednjih primerih:

  1. Krmilnik ReplicaSet uporablja končno točko API seznam ReplicaSets s parametrom watch za spremljanje sprememb virov ReplicaSet.
  2. Krmilnik ReplicaSet uporablja končno točko API ustvari Pod (ustvari pod) za ustvarjanje podov.
  3. Razporejevalnik uporablja končno točko API patch pod (uredi pod) za posodobitev podov z informacijami o izbranem delovnem vozlišču.

Kot lahko vidite, je to isti API, do katerega dostopa kubectl. Uporaba istega API-ja za notranje komponente in zunanje uporabnike je temeljni koncept oblikovanja Kubernetes.

Zdaj lahko povzamemo, kako deluje Kubernetes:

  1. Stanje shramb za shranjevanje, to je virov Kubernetes.
  2. Strežnik API ponuja vmesnik za shranjevanje v obliki API-ja Kubernetes.
  3. Vse druge komponente in uporabniki Kubernetes berejo, opazujejo in manipulirajo stanje Kubernetes (viri) prek API-ja.

Poznavanje teh konceptov vam bo pomagalo bolje razumeti kubectl in ga kar najbolje izkoristiti.

Zdaj pa si poglejmo nekaj posebnih nasvetov in trikov, ki vam bodo pomagali izboljšati produktivnost s kubectl.

1. Pospešite vnos z dokončanjem ukaza

Ena najbolj uporabnih, a pogosto spregledanih tehnik za izboljšanje zmogljivosti s kubectl je dokončanje ukaza.

Dokončanje ukazov omogoča samodejno dokončanje delov ukazov kubectl s tipko Tab. To deluje za podukaze, možnosti in argumente, vključno z nečim tako zapletenim, kot so imena virov.

Oglejte si, kako deluje dokončanje ukaza kubectl:

Kako učinkoviteje uporabljati kubectl: podroben vodnik
Dokončanje ukazov deluje za lupine Bash in Zsh.

Uradni vodnik vsebuje podrobna navodila za nastavitev samodokončanja, spodaj pa bomo podali kratek izvleček.

Kako deluje dokončanje ukaza

Dokončanje ukaza je funkcija lupine, ki deluje z uporabo skripta za dokončanje. Razširitveni skript je lupinski skript, ki definira vedenje razširitve za določen ukaz.

Kubectl samodejno ustvari in izpiše razširitvene skripte za Bash in Zsh z uporabo naslednjih ukazov:

$ kubectl completion bash

Или:

$ kubectl completion zsh

Teoretično je dovolj, da izhod teh ukazov povežete z ustrezno ukazno lupino, tako da lahko kubectl dopolnjuje ukaze.

V praksi je način povezave drugačen za Bash (vključno z razlikami med Linuxom in MacOS) in Zsh. Spodaj si bomo ogledali vse te možnosti.

Bash na Linuxu

Skript za dokončanje Bash je odvisen od paketa za dokončanje bash, zato ga morate najprej namestiti:

$ sudo apt-get install bash-completion

Или:

$ yum install bash-completion

Z naslednjim ukazom lahko preverite, ali je paket uspešno nameščen:

$ type _init_completion

Če to prikaže kodo funkcije ukazne lupine, je dokončanje bash pravilno nameščeno. Če ukaz prikaže napako »Ni najdeno«, morate svoji datoteki dodati naslednjo vrstico ~ / .bashrc:

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

Ali je treba to vrstico dodati v datoteko ~ / .bashrc ali ne je odvisno od upravitelja paketov, ki ste ga uporabili za namestitev bash-completion. To je potrebno za APT, ne pa tudi za YUM.

Po namestitvi bash-completion morate vse konfigurirati tako, da bo skript za dokončanje kubectl omogočen v vseh sejah lupine.

Eden od načinov za to je, da v datoteko dodate naslednjo vrstico ~ / .bashrc:

source <(kubectl completion bash)

Drug način je, da dodate skript razširitve kubectl v imenik /etc/bash_completion.d (ustvari ga, če ne obstaja):

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

Vsi skripti dodatkov v katalogu /etc/bash_completion.d so samodejno vključeni v bash-dokončanje.

Obe možnosti sta enako uporabni.

Po ponovnem zagonu lupine bo dokončanje ukaza kubectl delovalo.

Bash v sistemu MacOS

V sistemu MacOS je namestitev nekoliko bolj zapletena. Dejstvo je, da MacOS privzeto uporablja različico Bash 3.2, skript za samodokončanje kubectl pa zahteva različico Bash vsaj 4.1 in ne deluje v Bash 3.2.

Obstajajo težave z licenciranjem, povezane z uporabo zastarele različice Bash v sistemu MacOS. Bash različica 4 je licencirana pod GPLv3, ki je Apple ne podpira.

Če želite konfigurirati samodejno dokončanje kubectl v sistemu MacOS, morate namestiti novejšo različico Bash. Posodobljeni Bash lahko nastavite tudi kot privzeto lupino, kar vam bo prihranilo veliko težav v prihodnosti. Ni težko, podrobnosti so navedene v članku "Posodabljanje Bash v sistemu MacOS".

Preden nadaljujete, se prepričajte, da uporabljate najnovejšo različico Bash (preverite izpis bash --version).

Skript za dokončanje Bash se razlikuje glede na projekt bash-dokončanje, zato ga morate najprej namestiti.

Bash-completion lahko namestite z uporabo Homebrew:

$ brew install bash-completion@2

Tukaj @2 pomeni bash-completion različice 2. kubectl autocompletion zahteva bash-completion v2, bash-completion v2 pa zahteva najmanj Bash različice 4.1.

Izhod ukaza brew-install vsebuje razdelek Caveats, ki določa, kaj je treba dodati v datoteko ~/.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"

Vendar priporočam, da teh vrstic ne dodate ~/.bash_profile, in v ~/.bashrc. V tem primeru bo samodokončanje na voljo ne samo v glavni, ampak tudi v podrejenih ukaznih lupinah.

Po ponovnem zagonu ukazne lupine lahko preverite, ali je namestitev pravilna z naslednjim ukazom:

$ type _init_completion

Če v izhodu vidite funkcijo lupine, je vse pravilno konfigurirano.

Zdaj moramo zagotoviti, da je samodejno dokončanje kubectl omogočeno v vseh sejah.

Eden od načinov je, da svoji vrstici dodate naslednjo vrstico ~/.bashrc:

source <(kubectl completion bash)

Drugi način je, da v mapo dodate skript za samodokončanje /usr/local/etc/bash_completion.d:

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

Ta metoda bo delovala samo, če ste namestili bash-completion z uporabo Homebrew. V tem primeru bash-completion naloži vse skripte iz tega imenika.

Če ste namestili kubectl z uporabo Homebrew, potem ni treba izvesti prejšnjega koraka, saj bo skript za samodokončanje samodejno postavljen v mapo /usr/local/etc/bash_completion.d med namestitvijo. V tem primeru bo samodejno dokončanje kubectl začelo delovati takoj, ko namestite bash-completion.

Posledično so vse te možnosti enakovredne.

zsh

Skripti za samodokončanje za Zsh ne zahtevajo nobenih odvisnosti. Vse kar morate storiti je, da jih omogočite, ko naložite ukazno lupino.

To lahko storite tako, da svojemu dodate vrstico ~/.zshrc mapa:

source <(kubectl completion zsh)

Če prejmete sporočilo o napaki not found: compdef po ponovnem zagonu lupine morate omogočiti vgrajeno funkcijo compdef. Omogočite ga lahko tako, da ga dodate na začetek datoteke ~/.zshrc naslednje:

autoload -Uz compinit
compinit

2. Hitro si oglejte specifikacije virov

Ko ustvarite definicije virov YAML, morate poznati polja in njihov pomen za te vire. Eno mesto za iskanje teh informacij je referenčni API, ki vsebuje popolne specifikacije za vse vire.

Vendar pa je preklop na spletni brskalnik vsakič, ko morate nekaj poiskati, neprijetno. Zato kubectl zagotavlja ukaz kubectl explain, ki prikazuje specifikacije vseh virov neposredno v vašem terminalu.

Oblika ukaza je naslednja:

$ kubectl explain resource[.field]...

Ukaz bo izpisal specifikacijo zahtevanega vira ali polja. Prikazane informacije so enake tistim v priročniku za API.

Privzeto kubectl explain prikazuje samo prvo raven gnezdenja polj.

Poglej, kako izgleda Nato lahko.

Če dodate možnost, lahko prikažete celotno drevo --recursive:

$ kubectl explain deployment.spec --recursive

Če ne veste natančno, kateri viri so potrebni, jih lahko vse prikažete z naslednjim ukazom:

$ kubectl api-resources

Ta ukaz prikaže imena virov v množinski obliki, npr. deployments namesto deployment. Prikaže na primer tudi kratko ime deploy, za tiste vire, ki ga imajo. Ne skrbite zaradi teh razlik. Vse te možnosti poimenovanja so enakovredne za kubectl. To pomeni, da lahko uporabite katerega koli od njih kubectl explain.

Vsi naslednji ukazi so enakovredni:

$ kubectl explain deployments.spec
# или
$ kubectl explain deployment.spec
# или        
$ kubectl explain deploy.spec

3. Uporabite izhodni format stolpca po meri

Privzeti izhodni format ukaza 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

Ta oblika je priročna, vendar vsebuje omejeno količino informacij. V primerjavi s celotno obliko definicije vira je tukaj prikazanih le nekaj polj.

V tem primeru lahko uporabite izhodni format stolpca po meri. Omogoča vam, da določite, katere podatke želite izpisati. Polje vira lahko prikažete kot ločen stolpec.

Uporaba oblike po meri se določi z možnostmi:

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

Vsak izhodni stolpec lahko definirate kot par <header>:<jsonpath>Če <header> je ime stolpca in <jsonpath> — izraz, ki definira polje vira.

Poglejmo preprost primer:

$ kubectl get pods -o custom-columns='NAME:metadata.name'

NAME
engine-544b6b6467-22qr6
engine-544b6b6467-lw5t8
engine-544b6b6467-tvgmg
web-ui-6db964458-8pdw4

Izhod vsebuje en stolpec z imeni podov.

Izraz možnosti izbere imena podov iz polja metadata.name. To je zato, ker je ime sklopa definirano v polju podrejenega imena metadata v opisu vira pod. Več podrobnosti najdete v API vodnik ali vnesite ukaz kubectl explain pod.metadata.name.

Zdaj pa recimo, da želite izhodu dodati dodaten stolpec, ki na primer prikazuje vozlišče, na katerem teče posamezen pod. Če želite to narediti, lahko preprosto dodate ustrezno specifikacijo stolpca možnosti stolpcev po meri:

$ 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 izbere ime vozlišča iz spec.nodeName — ko je pod dodeljen vozlišču, je njegovo ime zapisano v polje spec.nodeName specifikacija vira pod. Podrobnejše informacije najdete v izhodu kubectl explain pod.spec.nodeName.

Upoštevajte, da polja virov Kubernetes razlikujejo med velikimi in malimi črkami.

Vsako polje vira si lahko ogledate kot stolpec. Samo preglejte specifikacijo vira in jo preizkusite s poljubnimi polji.

Toda najprej si podrobneje oglejmo izraze za izbiro polja.

Izrazi JSONPath

Izrazi za izbiro polj virov temeljijo na JSONPath.

JSONPath je jezik za pridobivanje podatkov iz dokumentov JSON. Izbira enega polja je najpreprostejši primer uporabe za JSONPath. Ima veliko več možnosti, vključno z izbirniki, filtri itd.

Razlaga Kubectl podpira omejeno število funkcij JSONPath. Možnosti in primeri njihove uporabe so opisani spodaj:

# Выбрать все элементы списка
$ 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 še posebej pomemben. Številna polja virov Kubernetes so seznami in ta operater vam omogoča, da izberete člane teh seznamov. Pogosto se uporablja z nadomestnim znakom, kot je [*], da izberete vse elemente seznama.

Primeri uporabe

Možnosti za uporabo izhodne oblike stolpcev po meri so neskončne, saj lahko v izpisu prikažete katero koli polje ali kombinacijo polj virov. Tukaj je nekaj vzorčnih aplikacij, vendar jih lahko raziščete sami in poiščete aplikacije, ki vam ustrezajo.

  1. Prikaz slik vsebnika za stroke:
    $ 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

    Ta ukaz prikaže imena slik vsebnika za vsak pod.

    Ne pozabite, da lahko pod vsebuje več vsebnikov, potem bodo imena slik prikazana v eni vrstici, ločena z vejicami.

  2. Prikaz območij razpoložljivosti vozlišča:
    $ 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

    Ta ukaz je uporaben, če vaša gruča gostuje v javnem oblaku. Prikaže območje razpoložljivosti za vsako vozlišče.

    Območje razpoložljivosti je koncept oblaka, ki omejuje območje podvajanja na geografsko regijo.

    Območja razpoložljivosti za vsako vozlišče se pridobijo s posebno oznako - failure-domain.beta.kubernetes.io/zone. Če se gruča izvaja v javnem oblaku, se ta oznaka ustvari samodejno in napolni z imeni območij razpoložljivosti za vsako vozlišče.

    Oznake niso del specifikacije virov Kubernetes, zato informacij o njih ne boste našli v API vodnik. Vendar jih je mogoče videti (kot vse druge oznake), če zahtevate informacije o vozliščih v formatu YAML ali JSON:

    $ kubectl get nodes -o yaml
    # или
    $ kubectl get nodes -o json

    To je odličen način, da poleg učenja specifikacij virov izveste več o virih.

4. Enostavno preklapljajte med gručami in imenskimi prostori

Ko kubectl pošlje zahtevo API-ju Kubernetes, najprej prebere datoteko kubeconfig, da pridobi vse potrebne parametre za povezavo.

Privzeto je datoteka kubeconfig ~/.kube/config. Običajno se ta datoteka ustvari ali posodobi s posebnim ukazom.

Ko delate z več gručami, vaša datoteka kubeconfig vsebuje nastavitve za povezovanje z vsemi temi gručami. Potrebujete način, da poveste ukazu kubectl, s katero gručo delate.

Znotraj gruče lahko ustvarite več imenskih prostorov – vrsto navidezne gruče znotraj fizične gruče. Kubectl na podlagi datoteke kubeconfig tudi določi, kateri imenski prostor naj uporabi. To pomeni, da potrebujete tudi način, kako ukazu kubectl povedati, s katerim imenskim prostorom naj dela.

V tem poglavju bomo razložili, kako deluje in kako doseči, da deluje učinkovito.

Upoštevajte, da imate morda več datotek kubeconfig, navedenih v spremenljivki okolja KUBECONFIG. V tem primeru bodo vse te datoteke med izvajanjem združene v eno skupno konfiguracijo. Privzeto datoteko kubeconfig lahko spremenite tudi tako, da zaženete kubectl s parametrom --kubeconfig. Poglej uradna dokumentacija.

datoteke kubeconfig

Poglejmo, kaj natančno vsebuje datoteka kubeconfig:

Kako učinkoviteje uporabljati kubectl: podroben vodnik
Kot lahko vidite, datoteka kubeconfig vsebuje niz kontekstov. Kontekst je sestavljen iz treh elementov:

  • Gruča — URL API strežnika gruče.
  • Uporabnik - poverilnice za preverjanje pristnosti uporabnika v gruči.
  • Imenski prostor - imenski prostor, uporabljen pri pridružitvi gruči.

V praksi pogosto uporabljajo en kontekst na gručo v svojem kubeconfigu. Vendar pa lahko imate več kontekstov na gručo, ki se razlikujejo po uporabniku ali imenskem prostoru. Vendar je ta večkontekstna konfiguracija neobičajna, zato običajno obstaja preslikava ena proti ena med gručami in konteksti.

V danem trenutku je eden od kontekstov aktualen:

Kako učinkoviteje uporabljati kubectl: podroben vodnik
Ko kubectl prebere konfiguracijsko datoteko, vedno vzame informacije iz trenutnega konteksta. V zgornjem primeru se bo kubectl povezal z gručo Hare.

V skladu s tem morate za preklop na drugo gručo spremeniti trenutni kontekst v datoteki kubeconfig:

Kako učinkoviteje uporabljati kubectl: podroben vodnik
Zdaj se bo kubectl povezal z gručo Fox.

Če želite preklopiti na drug imenski prostor v isti gruči, morate spremeniti vrednost elementa imenskega prostora za trenutni kontekst:

Kako učinkoviteje uporabljati kubectl: podroben vodnik
V zgornjem primeru bo kubectl uporabil imenski prostor Prod gruče Fox (prej je bil nastavljen imenski prostor Test).

Upoštevajte, da kubectl ponuja tudi možnosti --cluster, --user, --namespace и --context, ki vam omogočajo, da prepišete posamezne elemente in sam trenutni kontekst, ne glede na to, kaj je nastavljeno v kubeconfig. Poglej kubectl options.

Teoretično lahko ročno spremenite nastavitve v datoteki kubeconfig. Ampak to je neprijetno. Za poenostavitev teh operacij obstajajo različni pripomočki, ki vam omogočajo samodejno spreminjanje parametrov.

Uporabi kubectx

Zelo priljubljen pripomoček za preklapljanje med gručami in imenskimi prostori.

Pripomoček ponuja ukaze kubectx и kubens da spremenite trenutni kontekst oziroma imenski prostor.

Kot že omenjeno, spreminjanje trenutnega konteksta pomeni spreminjanje gruče, če imate samo en kontekst na gručo.

Tukaj je primer izvajanja teh ukazov:

Kako učinkoviteje uporabljati kubectl: podroben vodnik
V bistvu ti ukazi preprosto uredijo datoteko kubeconfig, kot je opisano zgoraj.

za namestitev kubectx, sledite navodilom na Github.

Oba ukaza podpirata samodejno dokončanje imen konteksta in imenskega prostora, kar odpravlja potrebo po njihovem popolnem tipkanju. Navodila za nastavitev samodokončanja tukaj.

Še ena uporabna funkcija kubectx je interaktivni način. Deluje v povezavi s pripomočkom fzf, ki ga morate namestiti ločeno. Namestitev fzf samodejno omogoči interaktivni način na voljo v kubectx. Interaktivno lahko izberete kontekst in imenski prostor prek interaktivnega brezplačnega iskalnega vmesnika, ki ga ponuja fzf.

Uporaba vzdevkov lupine

Za spreminjanje trenutnega konteksta in imenskega prostora ne potrebujete ločenih orodij, ker kubectl ponuja tudi ukaze za to. Da, ekipa kubectl config ponuja podukaze za urejanje datotek kubeconfig.

Tukaj je nekaj:

  • kubectl config get-contexts: prikaz vseh kontekstov;
  • kubectl config current-context: pridobi trenutni kontekst;
  • kubectl config use-context: spremeni trenutni kontekst;
  • kubectl config set-context: spremenite element konteksta.

Vendar neposredna uporaba teh ukazov ni zelo priročna, ker so dolgi. Za njih lahko naredite vzdevke lupine, ki jih je enostavno izvesti.

Na podlagi teh ukazov sem ustvaril nabor vzdevkov, ki zagotavljajo podobno funkcionalnost kot kubectx. Tukaj jih lahko vidite v akciji:

Kako učinkoviteje uporabljati kubectl: podroben vodnik
Upoštevajte, da vzdevki uporabljajo fzf za zagotavljanje interaktivnega vmesnika za brezplačno iskanje (kot je interaktivni način kubectx). To pomeni, da potrebujete namestite fzfza uporabo teh vzdevkov.

Tukaj so definicije samih vzdevkov:

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

Če želite nastaviti te vzdevke, morate svoji datoteki dodati zgornje definicije ~/.bashrc ali ~/.zshrc in znova zaženite lupino.

Uporaba vtičnikov

Kubectl vam omogoča nalaganje vtičnikov, ki se izvajajo na enak način kot osnovni ukazi. Lahko na primer namestite vtičnik kubectl-foo in ga zaženete tako, da izvedete ukaz kubectl foo.

Primerno bi bilo spremeniti kontekst in imenski prostor na ta način, na primer z zagonom kubectl ctx spremeniti kontekst in kubectl ns da spremenite imenski prostor.

Napisal sem dva vtičnika, ki to počneta:

Delovanje vtičnikov temelji na vzdevkih iz prejšnjega razdelka.

Evo, kako delujejo:

Kako učinkoviteje uporabljati kubectl: podroben vodnik
Upoštevajte, da vtičniki uporabljajo fzf za zagotavljanje interaktivnega brezplačnega iskalnega vmesnika (kot je interaktivni način kubectx). To pomeni, da potrebujete namestite fzfza uporabo teh vzdevkov.

Če želite namestiti vtičnike, morate prenesti lupinske skripte z imenom kubectl-ctx и kubectl-ns v kateri koli imenik v vaši spremenljivki PATH in jih naredite izvršljive z npr. chmod +x. Takoj po tem boste lahko uporabljali kubectl ctx и kubectl ns.

5. Zmanjšajte vnos s samodejnimi vzdevki

Vzdevki lupine so dober način za pospešitev vnosa. Projekt kubectl vzdevki vsebuje približno 800 bližnjic za osnovne ukaze kubectl.

Morda se sprašujete - kako si zapomnite 800 vzdevkov? Vendar vam ni treba zapomniti vseh, ker so zgrajeni po preprosti shemi, ki je podana spodaj:

Kako učinkoviteje uporabljati kubectl: podroben vodnik
Na primer:

  1. kgpooyaml - kubectl get pods oyaml
  2. ksysgsvcw — kubectl -n kube-system get svc w
  3. ksysrmcm -kubectl -n kube-system rm cm
  4. kgdepallsl - kubectl pridobi razmestitev vseh sl

Kot lahko vidite, so vzdevki sestavljeni iz komponent, od katerih vsaka predstavlja poseben element ukaza kubectl. Vsak vzdevek ima lahko eno komponento za osnovni ukaz, operacijo in vir ter več komponent za parametre. Te komponente preprosto "napolnite" od leve proti desni v skladu z zgornjim diagramom.

Trenutni podroben diagram je na GitHub. Tam lahko najdete tudi celoten seznam vzdevkov.

Na primer, vzdevek kgpooyamlall je enakovreden ukazu kubectl get pods -o yaml --all-namespaces.

Relativni vrstni red možnosti ni pomemben: ukaz kgpooyamlall je enakovreden ukazu kgpoalloyaml.

Ni vam treba uporabiti vseh komponent kot vzdevkov. Na primer k, kg, klo, ksys, kgpo lahko tudi uporabimo. Poleg tega lahko v ukazni vrstici kombinirate vzdevke in običajne ukaze ali možnosti:

Na primer:

  1. Namesto kubectl proxy lahko pišeš k proxy.
  2. Namesto kubectl get roles lahko pišeš kg roles (trenutno ni vzdevka za vir Roles).
  3. Če želite pridobiti podatke za določen pod, lahko uporabite ukaz kgpo my-pod — kubectl get pod my-pod.

Upoštevajte, da nekateri vzdevki zahtevajo argument ukazne vrstice. Na primer vzdevek kgpol pomeni kubectl get pods -l. Možnost -l zahteva argument – ​​specifikacijo oznake. Če uporabite vzdevek, bo videti tako kgpol app=ui.

Ker nekateri vzdevki zahtevajo argumente, je treba vzdevke a, f in l uporabiti nazadnje.

Na splošno, ko se naučite te sheme, lahko intuitivno izpeljete vzdevke iz ukazov, ki jih želite izvesti, in prihranite veliko časa pri tipkanju.

Namestitev

Če želite namestiti kubectl-aliases, morate prenesti datoteko .kubectl_aliases iz GitHuba in ga vključite v datoteko ~/.bashrc ali ~/.zshrc:

source ~/.kubectl_aliases

Samodokončanje

Kot smo že povedali, vzdevku v ukazni vrstici pogosto dodate dodatne besede. Na primer:

$ kgpooyaml test-pod-d4b77b989

Če uporabljate dokončanje ukaza kubectl, ste verjetno že uporabili samodejno dokončanje za stvari, kot so imena virov. Toda ali je to mogoče storiti, če se uporabljajo vzdevki?

To je zelo pomembno vprašanje, ker če samodokončanje ne deluje, boste izgubili nekatere prednosti vzdevkov.

Odgovor je odvisen od tega, katero lupino uporabljate:

  1. Za Zsh dokončanje vzdevkov deluje takoj.
  2. Na žalost je za Bash potrebno nekaj dela, da samodokončanje deluje.

Omogočanje samodokončanja za vzdevke v Bashu

Težava z Bashom je, da poskuša dokončati (vsakič, ko pritisnete Tab) vzdevek, ne pa ukaza, na katerega se vzdevek nanaša (kot na primer Zsh). Ker nimate skriptov za dokončanje za vseh 800 vzdevkov, samodokončanje ne deluje.

Projekt popoln vzdevek nudi splošno rešitev tega problema. Povezuje se z mehanizmom za dokončanje vzdevkov, interno razširi vzdevek v ukaz in vrne možnosti dokončanja za dokončan ukaz. To pomeni, da se oblazinjenje za vzdevek obnaša popolnoma enako kot za polni ukaz.

V nadaljevanju bom najprej razložil, kako namestiti complete-alias in nato, kako ga konfigurirati, da bo omogočil dokončanje za vse vzdevke kubectl.

Namestitev popolnega vzdevka

Prvič, popoln vzdevek je odvisen od bash-dokončanje. Zato se morate pred namestitvijo complete-alias prepričati, da je nameščen bash-completion. Navodila za namestitev so bila predhodno na voljo za Linux in MacOS.

Pomembna opomba za uporabnike MacOS: Tako kot skript za samodokončanje kubectl tudi complete-alias ne deluje z Bash 3.2, ki je privzet v sistemu MacOS. Zlasti popolni vzdevek je odvisen od bash-dokončanja v2 (brew install bash-completion@2), ki zahteva vsaj Bash 4.1. To pomeni, da morate za uporabo popolnega vzdevka v sistemu MacOS namestiti novejšo različico Bash.

Prenesti morate skript bash_completion.sh z dne Repozitorij GitHub in ga vključite v svojo datoteko ~/.bashrc:

source ~/bash_completion.sh

Po ponovnem zagonu lupine bo kompletni vzdevek v celoti nameščen.

Omogočanje samodokončanja za vzdevke kubectl

Tehnično popoln vzdevek zagotavlja funkcijo ovoja _complete_alias. Ta funkcija preveri vzdevek in vrne namige za dokončanje ukaza alias.

Če želite funkcijo povezati z določenim vzdevkom, morate uporabiti vgrajeni mehanizem Bash dokončanje, za namestitev _complete_alias kot funkcija dopolnjevanja vzdevkov.

Kot primer vzemimo vzdevek k, ki pomeni ukaz kubectl. za namestitev _complete_alias Kot dopolnilno funkcijo za ta vzdevek morate zagnati naslednji ukaz:

$ complete -F _complete_alias k

Rezultat tega je, da se vsakič, ko samodejno dokončate vzdevek k, pokliče funkcija _complete_alias, ki preveri vzdevek in vrne namige za dokončanje ukaza kubectl.

Kot drugi primer vzemimo vzdevek kg, ki označuje kubectl get:

$ complete -F _complete_alias kg

Tako kot v prejšnjem primeru, ko samodokončate kg, dobite enake namige za dokončanje, kot bi jih dobili za kubectl get.

Upoštevajte, da lahko uporabite complete-alias za kateri koli vzdevek v vašem sistemu.

Če želite torej omogočiti samodejno dokončanje za vse vzdevke kubectl, morate za vsakega od njih zagnati zgornji ukaz. Naslednji delček naredi točno to, pod pogojem, da ste vzdevke kubectl nastavili na ~/.kubectl-aliases:

for _a in $(sed '/^alias /!d;s/^alias //;s/=.*$//' ~/.kubectl_aliases); 
do
  complete -F _complete_alias "$_a"
done

Ta del kode je treba postaviti v vaš ~/.bashrc, znova zaženite ukazno lupino in samodejno dokončanje bo na voljo za vseh 800 vzdevkov kubectl.

6. Razširitev kubectl z vtičniki

Odkar različica 1.12, kubectl podpira mehanizem vtičnikov, ki vam omogočajo razširitev njegovih funkcij z dodatnimi ukazi.

Če ste seznanjeni z Mehanizmi vtičnikov Git, potem so vtičniki kubectl zgrajeni po istem principu.

V tem poglavju bomo opisali, kako namestiti vtičnike, kje jih najti in kako ustvariti lastne vtičnike.

Namestitev vtičnikov

Vtičniki Kubectl se distribuirajo kot enostavne izvršljive datoteke z imenom kot je kubectl-x. Predpona kubectl- zahtevan, čemur sledi nov podukaz kubectl, ki omogoča klic vtičnika.

Na primer, vtičnik hello bo razdeljen kot datoteka, imenovana kubectl-hello.

Če želite namestiti vtičnik, morate kopirati datoteko kubectl-x v kateri koli imenik v vaši PATH in ga naredite izvršljivega, na primer z chmod +x. Takoj za tem lahko pokličete vtičnik z kubectl x.

Za seznam vseh vtičnikov, ki so trenutno nameščeni v vašem sistemu, lahko uporabite naslednji ukaz:

$ kubectl plugin list

Ta ukaz bo prikazal tudi opozorila, če imate več vtičnikov z istim imenom ali če obstaja datoteka vtičnikov, ki ni izvedljiva.

Iskanje in namestitev vtičnikov s programom Krew

Vtičnike Kubectl lahko delite ali ponovno uporabite kot programske pakete. Toda kje lahko najdete vtičnike, ki so jih delili drugi?

Projekt Krew želi zagotoviti enotno rešitev za skupno rabo, iskanje, namestitev in upravljanje vtičnikov kubectl. Projekt se imenuje "upravitelj paketov za vtičnike kubectl" (Krew je podoben Brew).

Krew je seznam vtičnikov kubectl, ki jih lahko izberete in namestite. Hkrati je Krew tudi vtičnik za kubectl.

To pomeni, da namestitev Krew deluje v bistvu kot namestitev katerega koli drugega vtičnika kubectl. Podrobna navodila najdete na Stran GitHub.

Najpomembnejši ukazi Krew so:

# Поиск в списке плагинов
$ kubectl krew search [<query>]
# Посмотреть информацию о плагине
$ kubectl krew info <plugin>
# Установить плагин
$ kubectl krew install <plugin>
# Обновить все плагины до последней версии
$ kubectl krew upgrade
# Посмотреть все плагины, установленные через Krew
$ kubectl krew list
# Деинсталлировать плагин
$ kubectl krew remove <plugin>

Upoštevajte, da namestitev vtičnikov z uporabo Krew ne moti namestitve vtičnikov z zgoraj opisano standardno metodo.

Upoštevajte, da ukaz kubectl krew list prikaže samo vtičnike, ki so bili nameščeni s Krew, medtem ko ukaz kubectl plugin list navaja vse vtičnike, torej tiste, ki so nameščeni z uporabo Krew, in tiste, ki so nameščeni na druge načine.

Iskanje vtičnikov drugje

Krew je mlad projekt, trenutno v svojem seznam le približno 30 vtičnikov. Če ne najdete tistega, kar potrebujete, lahko najdete vtičnike drugje, na primer GitHub.

Priporočam ogled razdelka GitHub kubectl-plugins. Tam boste našli na desetine razpoložljivih vtičnikov, ki jih je vredno preveriti.

Pisanje lastnih vtičnikov

lahko sam ustvarjanje vtičnikov - Ni težko. Ustvariti morate izvršljivo datoteko, ki naredi tisto, kar potrebujete, poimenujte jo kubectl-x in namestite, kot je opisano zgoraj.

Datoteka je lahko skript bash, skript python ali prevedena aplikacija GO – ni pomembno. Edini pogoj je, da se lahko izvaja neposredno v operacijskem sistemu.

Takoj ustvarimo primer vtičnika. V prejšnjem razdelku ste uporabili ukaz kubectl za seznam vsebnikov za vsak pod. Ta ukaz je enostavno spremeniti v vtičnik, ki ga lahko pokličete z npr. kubectl img.

Ustvarite datoteko kubectl-img naslednjo vsebino:

#!/bin/bash
kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image'

Zdaj naredite datoteko izvršljivo z chmod +x kubectl-img in ga premaknite v kateri koli imenik v vaši PATH. Takoj po tem lahko uporabite vtičnik kubectl img.

Kot že omenjeno, lahko vtičnike kubectl napišete v katerem koli programskem ali skriptnem jeziku. Če uporabljate lupinske skripte, je prednost, da lahko preprosto pokličete kubectl iz vtičnika. Vendar pa lahko z uporabo bolj zapletenih vtičnikov napišete v resničnih programskih jezikih Odjemalska knjižnica Kubernetes. Če uporabljate Go, lahko uporabite tudi cli-runtime knjižnica, ki obstaja posebej za pisanje vtičnikov kubectl.

Kako deliti svoje vtičnike

Če menite, da bi lahko bili vaši vtičniki koristni za druge, jih lahko delite na GitHub. Bodite prepričani, da jih dodate v temo kubectl-plugins.

Prav tako lahko zahtevate, da se doda vaš vtičnik Krew seznam. Navodila, kako to storiti, so v Repozitoriji GitHub.

Zaključek ukaza

Vtičniki trenutno ne podpirajo samodokončanja. To pomeni, da morate vnesti polno ime vtičnika in polna imena argumentov.

Repozitorij GitHub kubectl za to funkcijo ima odprta zahteva. Tako je možno, da bo ta funkcija uvedena nekoč v prihodnosti.

Vso srečo!!!

Kaj še prebrati na to temo:

  1. Tri ravni samodejnega skaliranja v Kubernetesu in kako jih učinkovito uporabljati.
  2. Kubernetes v duhu piratstva s predlogo za implementacijo.
  3. Naš kanal Around Kubernetes v Telegramu.

Vir: www.habr.com

Dodaj komentar