Cumu utilizà kubectl più efficace: una guida detallata

Cumu utilizà kubectl più efficace: una guida detallata
Se travagliate cù Kubernetes, allora kubectl hè probabilmente una di e utilità chì utilizate più. È ogni volta chì passate assai tempu à travaglià cù un strumentu particulari, vale a pena studià bè è amparà à aduprà in modu efficace.

squadra Kubernetes aaS da Mail.ru traduttu un articulu di Daniel Weibel in quale truverete cunsiglii è trucchi per travaglià in modu efficace cù kubectl. Vi aiuterà ancu à acquistà una cunniscenza più profonda di Kubernetes.

Sicondu l'autore, u scopu di l'articulu hè di fà u vostru travagliu di ogni ghjornu cù Kubernetes micca solu più efficace, ma ancu più piacevule!

Introduzione: Cosa hè kubectl

Prima di pudè amparà à usà kubectl in modu più efficace, avete bisognu di acquistà una cunniscenza basica di ciò chì hè è cumu funziona.

Da a perspettiva di l'utilizatori, kubectl hè un pannellu di cuntrollu chì vi permette di fà operazioni Kubernetes.

Tecnicamente parlante, kubectl hè un cliente API Kubernetes.

L'API Kubernetes hè una API REST HTTP. Questa API hè a vera interfaccia d'utilizatore Kubernetes, attraversu quale hè cumpletamente cuntrullata. Questu significa chì ogni operazione Kubernetes hè esposta cum'è un endpoint API è pò esse fatta cù una dumanda HTTP à quellu endpoint.

Dunque, u travagliu principale di kubectl hè di fà richieste HTTP à l'API Kubernetes:

Cumu utilizà kubectl più efficace: una guida detallata
Kubernetes hè un sistema cumpletamente orientatu à e risorse. Questu significa chì mantene u statu internu di risorse è tutte l'operazioni Kubernetes sò operazioni CRUD.

Avete un cuntrollu cumpletu di Kubernetes gestionendu queste risorse, è Kubernetes capisce ciò chì deve fà basatu annantu à u statu attuale di e risorse. Per quessa, a riferenza API Kubernetes hè urganizata cum'è una lista di tipi di risorse cù e so operazioni assuciate.

Fighjemu un esempiu.

Diciamu chì vulete creà una risorsa ReplicaSet. Per fà questu, descrive u ReplicaSet in un schedariu per nome replicaset.yaml, poi eseguite u cumandimu:

$ kubectl create -f replicaset.yaml

Questu hà da creà una risorsa ReplicaSet. Ma chì succede daretu à e scene ?

Kubernetes hà una operazione di creazione ReplicaSet. Cum'è qualsiasi altra operazione, hè esposta cum'è un endpoint API. L'endpoint API specificu per questa operazione s'assumiglia cusì:

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

I punti finali API per tutte l'operazioni Kubernetes ponu esse truvati à Riferimentu API (cumpresu l'endpoint sopra). Per fà una dumanda vera à un endpoint, deve prima aghjunghje l'URL di u servitore API à i percorsi di endpoint chì sò listati in a riferenza API.

Dunque, quandu eseguite u cumandimu sopra, kubectl manda una dumanda HTTP POST à ​​l'endpoint API sopra. A definizione di ReplicaSet chì avete furnitu in u schedariu replicaset.yaml, hè mandatu in u corpu di a dumanda.

Hè cusì chì kubectl funziona per tutti i cumandamenti chì interagiscenu cù u cluster Kubernetes. In tutti questi casi, kubectl faci solu richieste HTTP à i punti finali di l'API Kubernetes appropritati.

Per piacè nutate chì pudete gestisce cumplettamente Kubernetes utilizendu una utilità cum'è curlmandendu manualmente richieste HTTP à l'API Kubernetes. Kubectl simplifica solu l'usu di l'API Kubernetes.

Eccu i principii di ciò chì kubectl hè è cumu funziona. Ma ci hè qualcosa di più nantu à l'API Kubernetes chì ogni utilizatore kubectl deve sapè. Fighjemu un rapidu sguardu in u mondu internu di Kubernetes.

U mondu internu di Kubernetes

Kubernetes hè custituitu da un inseme di cumpunenti indipendenti chì funzionanu cum'è prucessi separati nantu à i nodi di cluster. Certi cumpunenti funzionanu nantu à i nodi maestri, altri nantu à i nodi di u travagliu, ogni cumpunente face u so propiu compitu specificu.

Eccu i cumpunenti più impurtanti nantu à i nodi principali:

  1. Volta - memorizza e definizione di risorse (di solitu hè etcd).
  2. servitore API - furnisce una API è gestisce u almacenamentu.
  3. Manager di cuntrollu - Assicura chì i statuti di risorsa cumplenu cù e specificazioni.
  4. Scheduler - pianificà pods nantu à i nodi di u travagliu.

È quì hè un cumpunente più impurtante nantu à i nodi di u travagliu:

  1. kubelet - gestisce u lanciamentu di cuntenituri nantu à u node di travagliu.

Per capisce cumu sti cumpunenti travaglianu inseme, fighjemu un esempiu.

Assumimu chì avete appena finitu kubectl create -f replicaset.yaml, dopu chì kubectl hà fattu una dumanda HTTP POST à Endpoint API ReplicaSet (passendu a definizione di risorse ReplicaSet).

Chì succede in u cluster?

  1. Dopu fattu kubectl create -f replicaset.yaml U servitore API guarda a vostra definizione di risorse ReplicaSet in u almacenamentu:

    Cumu utilizà kubectl più efficace: una guida detallata

  2. In seguitu, u controller ReplicaSet hè lanciatu in u gestore di controller, chì gestisce a creazione, mudificazione è eliminazione di risorse ReplicaSet:

    Cumu utilizà kubectl più efficace: una guida detallata

  3. U controller ReplicaSet crea una definizione di pod per ogni replica di ReplicaSet (sicondu u mudellu di pod in a definizione di ReplicaSet) è i almacena in u almacenamentu:

    Cumu utilizà kubectl più efficace: una guida detallata

  4. U pianificatore hè lanciatu, seguitendu pods chì ùn sò micca stati ancu assignati à alcunu nodu di u travagliu:

    Cumu utilizà kubectl più efficace: una guida detallata

  5. U pianificatore selezziunate un node di travagliu adattatu per ogni pod è aghjunghje sta informazione à a definizione di pod in a tenda:

    Cumu utilizà kubectl più efficace: una guida detallata

  6. Nantu à u node di u travagliu à quale u pod hè assignatu, Kubelet hè lanciatu, traccia i pods assignati à questu node:

    Cumu utilizà kubectl più efficace: una guida detallata

  7. U Kubelet leghje a definizione di pod da l'almacenamiento è urdineghja un runtime di cuntainer, cum'è Docker, per lancià cuntenituri nantu à u node:

    Cumu utilizà kubectl più efficace: una guida detallata

Quì sottu hè una versione testu di sta descrizzione.

A dumanda API à l'endpoint di creazione ReplicaSet hè trattata da u servitore API. U servitore API autentica a dumanda è almacena a definizione di risorse ReplicaSet in u almacenamentu.

Questu avvenimentu principia u controller ReplicaSet, chì hè un subprocessu di u manager di u controller. U controller ReplicaSet monitoreghja a creazione, l'aghjurnamentu è l'eliminazione di risorse ReplicaSet in u magazinu è riceve una notificazione di l'avvenimentu quandu questu accade.

U travagliu di u cuntrollu di ReplicaSet hè di assicurà chì u numeru necessariu di pods ReplicaSet esiste. In u nostru esempiu, ùn esiste micca ancu pods, cusì u controller ReplicaSet crea queste definizioni di pod (sicondu u mudellu di pod in a definizione di ReplicaSet) è i guarda in u almacenamentu.

A creazione di novi pods hè attivata da un pianificatore chì mantene a traccia di e definizioni di pod chì ùn sò micca ancu pianificate per i nodi di u travagliu. U pianificatore selezziunate un node di travagliu adattatu per ogni pod è aghjurnà e definizioni di pod in u repository.

Nota chì finu à questu puntu, nisun codice di carica di travagliu era in esecuzione in ogni locu in u cluster. Tuttu ciò chì hè statu fattu finu à avà - questu hè a creazione è l'aghjurnamentu di risorse in u repository nantu à u node maestru.

L'ultimu avvenimentu attiva Kubelets, chì monitoranu i pods pianificati per i so nodi di u travagliu. U Kubelet di u node di u travagliu nantu à quale sò installati i vostri pods ReplicaSet deve urdinà à u runtime di u containeru, cum'è Docker, per scaricà l'imaghjini di u containeru necessariu è eseguite.

À questu puntu, a vostra applicazione ReplicaSet hè finalmente in esecuzione!

Role di l'API Kubernetes

Comu avete vistu in l'esempiu precedente, i cumpunenti di Kubernetes (eccettu u servitore API è u almacenamentu) fighjate per i cambiamenti à e risorse in u almacenamentu è cambia l'infurmazioni nantu à e risorse in u almacenamentu.

Di sicuru, sti cumpunenti ùn interagiscenu micca direttamente cù l'almacenamiento, ma solu per mezu di l'API Kubernetes.

Cunsiderate i seguenti esempi:

  1. U controller ReplicaSet usa u endpoint API lista ReplicaSets cun paràmetru watch per monitorà i cambiamenti à e risorse ReplicaSet.
  2. U controller ReplicaSet usa u endpoint API creà Pod (create pod) per creà pods.
  3. Scheduler usa un endpoint API patch pod (edità pod) per aghjurnà i pods cù infurmazioni nantu à u nodu di u travagliu sceltu.

Comu pudete vede, questu hè a stessa API chì kubectl accede. Utilizà a stessa API per i cumpunenti interni è l'utilizatori esterni hè un cuncettu fundamentale in u disignu di Kubernetes.

Avà pudemu riassume cumu funziona Kubernetes:

  1. I magazzini di almacenamentu state, vale à dì, risorse Kubernetes.
  2. U servitore API furnisce una interfaccia à u almacenamiento in forma di l'API Kubernetes.
  3. Tutti l'altri cumpunenti Kubernetes è l'utilizatori leghjenu, osservanu è manipulanu u statu di Kubernetes (risorse) attraversu l'API.

Sapendu sti cuncetti vi aiuterà à capisce megliu u kubectl è ottene u più.

Avà fighjemu alcuni cunsiglii è trucchi specifichi chì aiutanu à migliurà a vostra produtividade cù kubectl.

1. Accelerate l'input usendu u cumpletu di cumandamenti

Una di e tecniche più utili, ma spessu trascurate, per migliurà u rendiment cù kubectl hè a cumminazione di cumandamenti.

Cumpiimentu di u cumandamentu permette di cumplettà automaticamente parti di cumandamenti kubectl cù a chjave Tab. Questu travaglia per i subcumandamenti, l'opzioni è l'argumenti, cumprese qualcosa cum'è cumplessu cum'è i nomi di risorse.

Vede cumu funziona u cumpletu di u cumandamentu di kubectl:

Cumu utilizà kubectl più efficace: una guida detallata
Cume cumpletu travaglia per i cunchiglia Bash è Zsh.

Guida ufficiale cuntene struzzioni dettagliate per a stallazione di l'autocompletion, ma quì sottu furniremu un brevi estrattu.

Cumu funziona a cumminazione di cumandamenti

Cumpiimentu di cumanda hè una funzione di shell chì travaglia cù un script di cumpiimentu. Un script di estensione hè un script di shell chì definisce u cumpurtamentu di una estensione per un cumandamentu specificu.

Kubectl genera automaticamente è produce script di estensione per Bash è Zsh utilizendu i seguenti cumandamenti:

$ kubectl completion bash

O:

$ kubectl completion zsh

In teoria, hè abbastanza per cunnette l'output di sti cumandamenti à a cunchiglia di cumanda adattata per chì kubectl pò cumplementà i cumandamenti.

In pratica, u metudu di cunnessione hè diversu per Bash (cumprese e differenzi trà Linux è MacOS) è Zsh. Quì sottu, avemu da guardà tutte queste opzioni.

Bash nantu à Linux

U script di cumpleta Bash dipende da u pacchettu di cumpletu bash, cusì avete bisognu di stallà prima:

$ sudo apt-get install bash-completion

O:

$ yum install bash-completion

Pudete pruvà chì u pacchettu hè stallatu bè cù u cumandimu seguitu:

$ type _init_completion

Se questu produce u codice di funzione di shell, allora bash-completion hè stallatu currettamente. Se u cumandimu dà un errore "Not Found", avete bisognu di aghjunghje a seguente linea à u vostru schedariu ~ / .bashrc:

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

Hè necessariu aghjunghje sta linea à u schedariu ~ / .bashrc o micca dipende da u gestore di pacchetti chì avete usatu per installà bash-completion. Questu hè necessariu per APT, ma micca per YUM.

Dopu a stallazione di bash-completion, avete bisognu di cunfigurà tuttu in modu chì u script di cumplimentu di kubectl hè attivatu in tutte e sessioni di shell.

Una manera di fà questu hè di aghjunghje a seguente linea à u schedariu ~ / .bashrc:

source <(kubectl completion bash)

Un altru modu hè di aghjunghje l'script di estensione kubectl à u cartulare /etc/bash_completion.d (create si ùn esiste micca):

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

Tutti i script add-on in u catalogu /etc/bash_completion.d sò automaticamente inclusi in bash-completion.

E duie opzioni sò ugualmente applicabili.

Dopu avè riavviatu a cunchiglia, u cumpletu di u cumandamentu kubectl funzionerà.

Bash nantu à MacOS

In MacOS, a cunfigurazione hè un pocu più cumplicata. U fattu hè chì per automaticamente, MacOS usa Bash versione 3.2, è u script di autocompletion kubectl richiede una versione Bash di almenu 4.1 è ùn funziona micca in Bash 3.2.

Ci sò prublemi di licenza assuciati cù l'usu di una versione obsoleta di Bash in MacOS. Bash versione 4 hè licenziatu sottu GPLv3, chì ùn hè micca supportatu da Apple.

Per cunfigurà l'autocompletion di kubectl in MacOS, avete bisognu di installà una versione più recente di Bash. Pudete ancu stabilisce u Bash aghjurnatu cum'è u vostru shell predeterminatu, chì vi salverà assai prublemi in u futuru. Ùn hè micca difficiule, i dettagli sò datu in l'articulu "Aghjurnà Bash nantu à MacOS».

Prima di cuntinuà, assicuratevi di utilizà una versione recente di Bash (verificate u output bash --version).

U script di cumpleta Bash varieghja da u prugettu bash-cumplementu, cusì avete bisognu di stallà prima.

Pudete installà bash-completion usendu Homebrew:

$ brew install bash-completion@2

@2 sta per bash-completion versione 2. kubectl autocompletion richiede bash-completion v2, è bash-completion v2 richiede un minimu di Bash versione 4.1.

Cumanda di output brew-install cuntene una sezione Caveats, chì specifica ciò chì deve esse aghjuntu à u schedariu ~/.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"

Tuttavia, ricumandemu di aghjunghje queste linee micca ~/.bash_profileè in ~/.bashrc. In questu casu, l'autocompletion serà dispunibule micca solu in u principale, ma ancu in cunchiglia di cumanda di u zitellu.

Dopu avè riavviatu a shell di cumanda, pudete verificà chì a stallazione hè curretta usendu u cumandimu seguente:

$ type _init_completion

Se vede una funzione di shell in u output, allora tuttu hè cunfiguratu bè.

Avà avemu bisognu di assicurà chì l'autocompletion di kubectl hè attivatu in tutte e sessioni.

Una manera hè di aghjunghje a seguente linea à u vostru ~/.bashrc:

source <(kubectl completion bash)

A seconda manera hè di aghjunghje un script autocomplete à u cartulare /usr/local/etc/bash_completion.d:

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

Stu metudu funziona solu s'ellu avete installatu bash-completion cù Homebrew. In questu casu, bash-completion carica tutti i script da stu cartulare.

Sè avete installatu kubectl cù Homebrew, tandu ùn ci hè bisognu di fà u passu precedente, postu chì u script di autocompletion serà automaticamente postu in u cartulare /usr/local/etc/bash_completion.d durante a stallazione. In questu casu, l'autocompletion di kubectl cumincià à travaglià appena installate bash-completion.

In u risultatu, tutte queste opzioni sò equivalenti.

Zsh

I scripts di cumpletimentu automaticu per Zsh ùn necessitanu micca dipendenze. Tuttu ciò chì duvete fà hè di attivà quandu caricate u shell di cumanda.

Pudete fà questu aghjunghjendu una linea à u vostru ~/.zshrc schedariu:

source <(kubectl completion zsh)

Sè riceve un errore not found: compdef dopu à ripiglià a vostra cunchiglia, avete bisognu di attivà a funzione integrata compdef. Pudete attivà si aghjunghjendu à u principiu di u vostru schedariu ~/.zshrc i seguenti:

autoload -Uz compinit
compinit

2. Quickly vede specificazioni risorsa

Quandu create definizioni di risorse YAML, avete bisognu di cunnosce i campi è u so significatu per quelli risorse. Un locu per circà sta infurmazione hè in a riferenza API, chì cuntene specificazioni cumpletu per tutti i risorse.

In ogni casu, cambià à u navigatore web ogni volta chì avete bisognu di cercà qualcosa hè inconveniente. Dunque kubectl furnisce u cumandamentu kubectl explain, chì mostra e specificazioni di tutte e risorse in u vostru terminal.

U formatu di cumandamentu hè u seguitu:

$ kubectl explain resource[.field]...

U cumandimu prucede a specificazione di a risorsa o di u campu dumandatu. L'infurmazione affissata hè identica à quella contenuta in u manual API.

automaticamente kubectl explain mostra solu u primu livellu di nidificazione di campi.

Vede ciò chì pare pò esse quì.

Pudete vede l'arburu sanu se aghjunghje l'opzione --recursive:

$ kubectl explain deployment.spec --recursive

Se ùn sapete micca esattamente quali risorse sò necessarie, pudete vede tutti cù u cumandimu seguente:

$ kubectl api-resources

Questa cumanda mostra i nomi di risorse in forma plurale, per esempiu. deployments invece di deployment. Mostra ancu u nome curtu, per esempiu deploy, per quelli risorse chì l'anu. Ùn vi preoccupate micca di sti differenzi. Tutte queste opzioni di nomi sò equivalenti per kubectl. Questu hè, pudete aduprà qualsiasi di elli kubectl explain.

Tutti i seguenti cumandamenti sò equivalenti:

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

3. Aduprà un furmatu di pruduzzioni colonna persunalizata

Formatu di output di cumanda predefinitu 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

Stu formatu hè cunvene, ma cuntene una quantità limitata di informazioni. Comparatu à u furmatu di definizione di risorsa cumpleta, solu uni pochi di campi sò affissati quì.

In questu casu, pudete aduprà un furmatu di pruduzzioni di colonna persunalizata. Permette à voi di determinà ciò chì dati a pruduzzioni. Pudete vede ogni campu di risorsa cum'è una colonna separata.

L'usu di un furmatu persunalizatu hè determinatu cù l'opzioni:

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

Pudete definisce ogni colonna di output cum'è una coppia <header>:<jsonpath>induve <header> hè u nome di a colonna, è <jsonpath> - una espressione chì definisce un campu di risorsa.

Fighjemu un esempiu simplice:

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

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

L'output cuntene una colonna cù i nomi di i pods.

L'espressione di l'opzione selezziunate i nomi di pod da u campu metadata.name. Questu hè chì u nome di u pod hè definitu in u campu di u nome di u zitellu metadata in a descrizzione di risorse di u pod. Più dettagli ponu esse truvati in Guida API o scrive u cumandamentu kubectl explain pod.metadata.name.

Avà dicemu chì vulete aghjunghje una colonna extra à l'output, per esempiu chì mostra u node chì ogni pod hè in esecuzione. Per fà questu, pudete simpricimenti aghjunghje a specificazione di a colonna adatta à l'opzione di colonne persunalizati:

$ 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

L'espressione selezziunà u nome di u nodu spec.nodeName - quandu un pod hè assignatu à un node, u so nome hè scrittu in u campu spec.nodeName specificazione di risorse pod. L'infurmazione più dettagliata pò esse truvata in u output kubectl explain pod.spec.nodeName.

Per piacè nutate chì i campi di risorse di Kubernetes sò sensibili à u casu.

Pudete vede ogni campu di risorsa cum'è una colonna. Basta à esaminà a specificazione di risorsa è pruvate cù qualsiasi campi chì ti piace.

Ma prima, fighjemu un ochju più vicinu à l'espressioni di selezzione di campu.

Espressioni JSONPath

L'espressioni per selezziunà i campi di risorse sò basati JSONPath.

JSONPath hè una lingua per ricuperà dati da documenti JSON. A selezzione di un unicu campu hè u casu d'usu più simplice per JSONPath. Hà assai più pussibulità, cumpresi selettori, filtri è cusì.

Kubectl spiega supporta un numeru limitatu di funzioni JSONPath. E pussibulità è esempi di u so usu sò descritti quì sottu:

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

L'operatore [] hè particularmente impurtante. Parechji campi di risorse di Kubernetes sò listi, è questu operatore vi permette di selezziunà i membri di quelli listi. Hè spessu usatu cù un wildcard cum'è [*] per selezziunà tutti l'elementi di una lista.

Esempi di applicazione

E pussibulità di utilizà un formatu di output di colonna persunalizata sò infinite, postu chì pudete vede qualsiasi campu o cumminazione di campi di risorse in u output. Eccu alcuni appiicazioni di mostra, ma sentite liberu di scopre elli stessi è truvà applicazioni chì travaglianu per voi.

  1. Visualizà l'imaghjini di u containeru per i pods:
    $ 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

    Questa cumanda mostra i nomi di l'imaghjini di u containeru per ogni pod.

    Ricurdativi chì un podu pò cuntene parechji cuntenituri, allora i nomi di l'imaghjini seranu affissati nantu à una linea, siparati da virgule.

  2. Visualizzazione di e zone di dispunibilità di nodi:
    $ 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

    Stu cumandamentu hè utile se u vostru cluster hè ospitatu in un nuvulu publicu. Mostra a zona di dispunibilità per ogni node.

    A zona di dispunibilità hè un cuncettu di nuvola chì limita a zona di replicazione à una regione geografica.

    I zoni di dispunibilità per ogni nodu sò ottenuti attraversu una etichetta speciale - failure-domain.beta.kubernetes.io/zone. Se u cluster hè in esecuzione in un nuvulu publicu, sta etichetta hè creata automaticamente è cumpleta cù i nomi di e zone di dispunibilità per ogni node.

    L'etichette ùn sò micca parte di l'specificazione di risorse Kubernetes, cusì ùn truverete micca infurmazione nantu à elli Guida API. Tuttavia, ponu esse vistu (cum'è qualsiasi altre etichette) se dumandate infurmazione nantu à i nodi in u formatu YAML o JSON:

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

    Questu hè un bonu modu per amparà di più nantu à e risorse, in più di l'apprendimentu di specificazioni di risorse.

4. Cambia facilmente trà clusters è namespaces

Quandu kubectl fa una dumanda à l'API Kubernetes, prima leghje u schedariu kubeconfig per uttene tutti i paràmetri necessarii per a cunnessione.

Per automaticamente, u schedariu kubeconfig hè ~/.kube/config. Di genere, stu schedariu hè creatu o aghjurnatu da un cumandamentu speciale.

Quandu travagliate cù parechji clusters, u vostru schedariu kubeconfig cuntene paràmetri per cunnette à tutti quelli clusters. Avete bisognu di un modu per dì à u cumandamentu di kubectl chì cluster hè travagliatu.

Dentru un cluster, pudete creà spazii di nomi multipli - un tipu di cluster virtuale in un cluster fisicu. Kubectl determina ancu quale spaziu di nomi per utilizà basatu annantu à u schedariu kubeconfig. Questu significa chì avete ancu bisognu di un modu per dì à u cumandamentu kubectl chì u spaziu di nomi per travaglià.

In questu capitulu spiegheremu cumu si travaglia è cumu fà u funziunamentu efficace.

Nota chì pudete avè parechje schedarii kubeconfig listati in a variabile d'ambiente KUBECONFIG. In questu casu, tutti questi schedari seranu cumminati in una cunfigurazione cumuni in runtime. Pudete ancu cambià u schedariu predeterminatu di kubeconfig eseguendu kubectl cù u paràmetru --kubeconfig. Fighjate documentazione ufficiale.

i schedari kubeconfig

Videmu ciò chì esattamente u schedariu kubeconfig cuntene:

Cumu utilizà kubectl più efficace: una guida detallata
Comu pudete vede, u schedariu kubeconfig cuntene un inseme di cuntesti. U cuntestu hè custituitu da trè elementi:

  • Cluster - URL API di u servitore di cluster.
  • User - credenziali di autentificazione di l'utilizatori in u cluster.
  • Namespace - u namespace utilizatu quandu si unisce à u cluster.

In pratica, spessu usanu un cuntestu per cluster in u so kubeconfig. In ogni casu, pudete avè parechje cuntesti per cluster, differenziati per l'utilizatori o u spaziu di nomi. Tuttavia, sta cunfigurazione multi-cuntestu hè pocu cumuni, cusì ci hè di solitu una mappatura unu à unu trà clusters è cuntesti.

In ogni mumentu, unu di i cuntesti hè attuale:

Cumu utilizà kubectl più efficace: una guida detallata
Quandu kubectl leghje un schedariu di cunfigurazione, sempre piglia infurmazione da u cuntestu attuale. In l'esempiu sopra, kubectl si cunnetta à u cluster Hare.

Dunque, per cambià à un altru cluster, avete bisognu di cambià u cuntestu attuale in u schedariu kubeconfig:

Cumu utilizà kubectl più efficace: una guida detallata
Avà kubectl hà da cunnette à u cluster Fox.

Per cambià à un spaziu di nome differente in u stessu cluster, avete bisognu di cambià u valore di l'elementu di u namespace per u cuntestu attuale:

Cumu utilizà kubectl più efficace: una guida detallata
In l'esempiu di sopra, kubectl utilizerà u spaziu di nomi Prod di u cluster Fox (previamente u spaziu di nome Test hè statu stabilitu).

Nota chì kubectl furnisce ancu opzioni --cluster, --user, --namespace и --context, chì permettenu di sovrascrive elementi individuali è u cuntestu attuale stessu, indipendentemente da ciò chì hè stabilitu in u kubeconfig. Fighjate kubectl options.

In teoria, pudete cambià manualmente i paràmetri in u kubeconfig. Ma hè inconveniente. Per simplificà queste operazioni, ci sò parechje utilità chì permettenu di cambià i paràmetri automaticamente.

Aduprate kubectx

Una utilità assai populari per cambià trà clusters è namespaces.

L'utilità furnisce cumandamenti kubectx и kubens per cambià u cuntestu attuale è u spaziu di nome rispettivamente.

Comu diciatu, cambià u cuntestu attuale significa cambià u cluster si avete solu un cuntestu per cluster.

Eccu un esempiu di eseguisce questi cumandamenti:

Cumu utilizà kubectl più efficace: una guida detallata
Essenzialmente, questi cumandamenti simpricimenti edità u schedariu kubeconfig cum'è descrittu sopra.

installà kubectx, seguitate l'istruzzioni nantu Github.

I dui cumandamenti supportanu l'autocompletion di u cuntestu è i nomi di u spaziu di nomi, chì eliminanu a necessità di scriveli completamente. Istruzzioni per a stallazione di l'autocompletion ccà.

Un'altra funzione utile kubectxmodu interattivu. Funziona in cunghjunzione cù l'utilità fzf, chì deve esse stallatu separatamente. L'installazione di fzf rende automaticamente u modu interattivu dispunibule in kubectx. In modu interattivu, pudete selezziunà u cuntestu è u spaziu di nomi attraversu l'interfaccia interattiva di ricerca libera furnita da fzf.

Utilizà l'aliasi di shell

Ùn avete bisognu di strumenti separati per cambià u cuntestu attuale è u spaziu di nomi perchè kubectl furnisce ancu cumandamenti per questu. Iè, squadra kubectl config furnisce subcumandamenti per edità i schedari kubeconfig.

Eccu alcuni di elli:

  • kubectl config get-contexts: mostra tutti i cuntesti;
  • kubectl config current-context: ottene u cuntestu attuale;
  • kubectl config use-context: cambià u cuntestu attuale;
  • kubectl config set-context: Cambia l'elementu di u cuntestu.

Tuttavia, aduprà sti cumandamenti direttamente ùn hè micca assai còmuda perchè sò longu. Pudete fà alias di cunchiglia per elli chì sò faciuli d'eseguisce.

Aghju creatu un inseme di alias basatu annantu à questi cumandamenti chì furniscenu funziunalità simili à kubectx. Quì li pudete vede in azione:

Cumu utilizà kubectl più efficace: una guida detallata
Nota chì l'alias usanu fzf per furnisce una interfaccia interattiva di ricerca libera (cum'è u modu interattivu di kubectx). Questu significa chì avete bisognu installà fzfper aduprà sti alias.

Eccu e definizione di l'aliasi stessi:

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

Per stabilisce questi alias avete bisognu di aghjunghje e definizioni sopra à u vostru schedariu ~/.bashrc o ~/.zshrc è reboot u vostru shell.

Utilizà i plugins

Kubectl permette di carricà plugins chì sò eseguiti in u listessu modu cum'è cumandamenti basi. Pudete, per esempiu, installà u plugin kubectl-foo è eseguisce u cumandamentu kubectl foo.

Saria cunvenutu per cambià u cuntestu è u spaziu di nomi in questu modu, per esempiu in esecuzione kubectl ctx per cambià u cuntestu è kubectl ns per cambià u namespace.

Aghju scrittu dui plugins chì facenu questu:

U travagliu di i plugins hè basatu annantu à l'aliasi da a sezione precedente.

Eccu cumu travaglianu:

Cumu utilizà kubectl più efficace: una guida detallata
Nota chì i plugins utilizanu fzf per furnisce una interfaccia interattiva di ricerca libera (cum'è u modu interattivu di kubectx). Questu significa chì avete bisognu installà fzfper aduprà sti alias.

Per installà i plugins, avete bisognu di scaricà script di shell chjamatu kubectl-ctx и kubectl-ns à qualsiasi repertoriu in a vostra variabile PATH è rende eseguibili cù p.e. chmod +x. Immediatamente dopu à questu puderete aduprà kubectl ctx и kubectl ns.

5. Reduce input cù autoaliases

L'aliasi di Shell sò un bonu modu per accelerà l'input. Prughjettu kubectl-aliases cuntene circa 800 shortcuts per cumandamenti basi kubectl.

Puderete esse dumandate - cumu si ricorda 800 alias? Ma ùn avete bisognu di ricurdà tutti, perchè sò custruiti secondu un schema simplice, chì hè datu quì sottu:

Cumu utilizà kubectl più efficace: una guida detallata
Per esempiu:

  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 uttene implementazione tuttu sl

Comu pudete vede, l'aliasi sò custituiti da cumpunenti, ognunu di i quali rapprisenta un elementu specificu di u cumandamentu kubectl. Ogni alias pò avè un cumpunente per u cumandamentu di basa, l'operazione è a risorsa, è parechji cumpunenti per i paràmetri. Simply "populate" sti cumpunenti da manca à diritta secondu u schema sopra.

U diagramma detallatu attuale hè à GitHub. Ci si pò ancu truvà lista completa di alias.

Per esempiu, l'alias kgpooyamlall hè equivalente à u cumandamentu kubectl get pods -o yaml --all-namespaces.

L'ordine relative di l'opzioni ùn hè micca impurtante: cumanda kgpooyamlall hè equivalente à u cumandamentu kgpoalloyaml.

Ùn avete micca aduprà tutti i cumpunenti cum'è alias. Per esempiu k, kg, klo, ksys, kgpo pò ancu esse usatu. Inoltre, pudete combine alias è cumandamenti regulari o opzioni nantu à a linea di cummanda:

Per esempiu:

  1. Invece kubectl proxy pudete scrive k proxy.
  2. Invece kubectl get roles pudete scrive kg roles (ùn ci hè attualmente un alias per a risorsa Roles).
  3. Per uttene dati per un pod specificu, pudete aduprà u cumandamentu kgpo my-pod — kubectl get pod my-pod.

Per piacè nutate chì certi alias necessitanu un argumentu di linea di cummanda. Per esempiu, alias kgpol significa kubectl get pods -l. Opzione -l richiede un argumentu - una specificazione di l'etichetta. Sè vo aduprate un alias, sarà cum'è kgpol app=ui.

Perchè certi aliasi necessitanu argumenti, l'aliasi a, f, è l deve esse usatu l'ultimi.

In generale, una volta chì avete u colpu di stu schema, pudete intuitivamente derivà alias da i cumandamenti chì vulete eseguisce è risparmià assai tempu di scrive.

Stallazione

Per installà kubectl-aliases, avete bisognu di scaricà u schedariu .kubectl_aliases da GitHub è include in u schedariu ~/.bashrc o ~/.zshrc:

source ~/.kubectl_aliases

Cumplementu automaticu

Comu avemu dettu prima, spessu aghjunghje parolle supplementari à un alias in a linea di cummanda. Per esempiu:

$ kgpooyaml test-pod-d4b77b989

Sè aduprate u cumpletu di u cummandu kubectl, avete probabilmente utilizatu l'autocompletion per cose cum'è i nomi di risorse. Ma pò esse fattu quandu l'alias sò usati?

Questa hè una quistione assai impurtante perchè se l'autocompletion ùn viaghja micca, perderà alcuni di i benefici di l'alias.

A risposta dipende da quale shell chì site aduprate:

  1. Per Zsh, u cumpletu di l'alias funziona fora di a scatula.
  2. Per Bash, sfurtunatamenti, un pocu di travagliu hè necessariu per uttene l'autocompletion à travaglià.

Abilitazione di l'autocompletion per alias in Bash

U prublema cù Bash hè chì prova di cumplettà (ogni volta chì pressu Tab) l'alias, micca u cumandamentu chì l'alias si riferisce (cum'è Zsh, per esempiu). Siccomu ùn avete micca script di cumpleta per tutti i 800 alias, l'autocompletion ùn funziona micca.

U prugettu cumpletu-alias furnisce una suluzione generale à stu prublema. Cunnette à u mecanismu di cumplimentu per l'aliasi, espansione internamente l'alias à un cumandamentu, è torna l'opzioni di cumpleta per u cumandamentu cumpletu. Questu significa chì u padding per un alias cumporta esattamente u listessu cum'è per un cumandamentu cumpletu.

In u seguitu, spiegheraghju prima cumu installà l'alias cumpletu è dopu cumu cunfigurà per attivà a cumpleta per tutti l'alias kubectl.

Installazione cumpleta-alias

Prima di tuttu, cumpleta-alias dipende bash-cumplementu. Per quessa, prima di stallà cumpleta-alias, vi tocca à assicurà chì bash-completion hè stallatu. Istruzzioni di installazione sò state furnite prima per Linux è MacOS.

Nota impurtante per l'utilizatori di MacOS: Cum'è l'script di autocompletion kubectl, l'alias cumpletu ùn funziona micca cù Bash 3.2, chì hè u predeterminatu in MacOS. In particulare, l'alias cumpletu dipende da bash-completion v2 (brew install bash-completion@2), chì richiede almenu Bash 4.1. Questu significa chì per utilizà l'alias cumpletu in MacOS avete bisognu di installà una versione più nova di Bash.

Avete bisognu di scaricà u script bash_completion.sh из Repository GitHub è include lu in u vostru schedariu ~/.bashrc:

source ~/bash_completion.sh

Dopu avè riavviatu a cunchiglia, l'alias cumpletu serà stallatu cumplettamente.

Abilitazione di l'autocompletion per l'alias kubectl

Tecnicamente cumpletu-alias furnisce una funzione wrapper _complete_alias. Questa funzione verifica l'alias è torna suggerimenti di cumpleta per u cumandamentu di l'alias.

Per associà una funzione cù un alias specificu, avete bisognu di utilizà u mecanismu Bash integratu cumpleta, per stallà _complete_alias cum'è una funzione di cumpleta alias.

Per esempiu, pigliemu l'alias k, chì significa u cumandamentu kubectl. à stallà _complete_alias Cum'è una funzione cumplementaria per questu alias, duvete eseguisce u cumandimu seguente:

$ complete -F _complete_alias k

U risultatu di questu hè chì ogni volta chì autocomplete un alias k, a funzione hè chjamata _complete_alias, chì verifica l'alias è torna suggerimenti di cumpiimentu per u cumandamentu kubectl.

Cum'è un secondu esempiu, pigliemu l'alias kg, chì denota kubectl get:

$ complete -F _complete_alias kg

Cum'è in l'esempiu precedente, quandu autocomplete kg, avete i stessi suggerimenti di cumpleta chì avete da ottene per kubectl get.

Nota chì pudete aduprà l'alias cumpletu per qualsiasi alias in u vostru sistema.

Dunque, per attivà l'autocompletion per tutti l'aliasi di kubectl, avete bisognu di eseguisce u cumandamentu sopra per ognunu di elli. U snippet seguente face esattamente questu, basta chì avete stabilitu kubectl-aliases à ~/.kubectl-aliases:

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

Stu pezzu di codice deve esse piazzatu in u vostru ~/.bashrc, riavvia a shell di cumanda è l'autocompletion sarà dispunibule per tutti l'aliasi di 800 kubectl.

6. Estende kubectl cù plugins

A cumincià da versione 1.12, kubectl supporta mecanismu di plugin, chì permettenu di espansione e so funzioni cù cumandamenti supplementari.

Sè vo site familiarizatu Meccanismi di plugin Git, allura i plugins kubectl sò custruiti nantu à u listessu principiu.

In questu capitulu, avemu da copre cumu installà plugins, induve truvà elli, è cumu creà i vostri plugins.

Installazione di plugins

I plugins Kubectl sò distribuiti cum'è schedarii eseguibili simplici cù u nome cum'è kubectl-x. Prefissu kubectl- hè necessariu, seguita da un novu subcumandamentu kubectl chì permette di chjamà u plugin.

Per esempiu, u plugin hello serà distribuitu cum'è un schedariu chjamatu kubectl-hello.

Per installà u plugin, avete bisognu di cupià u schedariu kubectl-x à qualsiasi repertoriu in u vostru PATH è rende eseguibile, per esempiu cù chmod +x. Immediatamente dopu à questu pudete chjamà u plugin cù kubectl x.

Pudete aduprà u cumandimu seguitu per listà tutti i plugins chì sò attualmente installati in u vostru sistema:

$ kubectl plugin list

Stu cumandamentu vi vede ancu avvirtimenti si avete parechje plugins cù u stessu nome, o s'ellu ci hè un schedariu di plugin chì ùn hè micca eseguibile.

Truvà è installà plugins cù Krew

I plugins Kubectl ponu esse spartuti o riutilizati cum'è pacchetti di software. Ma induve pudete truvà plugins chì l'altri anu spartutu?

Prughjettu Krew hà u scopu di furnisce una soluzione unificata per sparta, ricerca, installazione è gestione di plugins kubectl. U prughjettu si chjama un "gestore di pacchetti per i plugins kubectl" (Krew hè simile à Brew).

Krew hè una lista di plugins kubectl chì pudete selezziunate è installate. À u listessu tempu, Krew hè ancu un plugin per kubectl.

Questu significa chì l'installazione di Krew funziona essenzialmente cum'è installà qualsiasi altru plugin kubectl. Pudete truvà struzzioni dettagliate à Pagina GitHub.

I cumandamenti Krew più impurtanti sò:

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

Per piacè nutate chì l'installazione di plugins cù Krew ùn interferiscenu micca cù l'installazione di plugins cù u metudu standard descrittu sopra.

Per piacè nutate chì u cumandamentu kubectl krew list mostra solu plugins chì sò stati installati cù Krew, mentri u cumandamentu kubectl plugin list elenca tutti i plugins, vale à dì quelli installati cù Krew è quelli installati da altri metudi.

Truvà Plugins Altrò

Krew hè un prughjettu ghjovanu, attualmente in u so a lista solu circa 30 plugins. Se ùn pudete micca truvà ciò chì avete bisognu, pudete truvà plugins in altrò, cum'è GitHub.

Vi cunsigliu di guardà a sezione GitHub kubectl-plugins. Ci truverete decine di plugins dispunibili chì valenu a pena di verificà.

Scrivite i vostri plugins

pudete sè stessu creà plugins - Ùn hè micca difficiule. Avete bisognu di creà un eseguibile chì faci ciò chì avete bisognu, nome cum'è kubectl-x è stallà cum'è discrittu sopra.

U schedariu puderia esse un script bash, un script python, o una applicazione GO compilata - ùn importa micca. L'unica cundizione hè chì pò esse direttamente eseguitu in u sistema operatore.

Creemu un plugin di esempiu avà. In a sezione precedente, avete utilizatu u cumandamentu kubectl per listà i cuntenituri per ogni pod. Hè facilitu per trasfurmà stu cumandamentu in un plugin chì pudete chjamà cù per esempiu. kubectl img.

Crea un schedariu kubectl-img u seguenti cuntenutu:

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

Avà fate u schedariu eseguibile cù chmod +x kubectl-img è spustà in ogni repertoriu in u vostru PATH. Immediatamente dopu, pudete aduprà u plugin kubectl img.

Cumu l'anu dettu, i plugins kubectl ponu esse scritti in ogni lingua di prugrammazione o di scrittura. Sè vo aduprate script di shell, u vantaghju di pudè chjamà facilmente kubectl da u plugin. Tuttavia, pudete scrive plugins più cumplessi in linguaggi di prugrammazione reali utilizendu Biblioteca cliente Kubernetes. Sè vo aduprate Go, pudete puru aduprà libreria cli-runtime, chì esiste specificamente per scrive plugins kubectl.

Cumu sparte i vostri plugins

Se pensate chì i vostri plugins puderanu esse utili à l'altri, sentite liberu di sparte in GitHub. Assicuratevi di aghjunghje à u tema kubectl-plugins.

Pudete ancu dumandà chì u vostru plugin sia aghjuntu Lista di Crew. Istruzzioni nantu à cumu fà questu sò in Repository GitHub.

Cumandamentu cumpletu

I plugins ùn supportanu attualmente l'autocompletion. Questu hè, duvete inserisce u nome cumpletu di u plugin è i nomi completi di l'argumenti.

U repository GitHub kubectl per sta funzione hà dumanda aperta. Allora hè pussibule chì sta funzione serà implementata in qualchì tempu in u futuru.

Bona Furtuna!!!

Chì altru à leghje nantu à u tema:

  1. Trè livelli di autoscaling in Kubernetes è cumu aduprà in modu efficace.
  2. Kubernetes in u spiritu di pirateria cù un mudellu per l'implementazione.
  3. U nostru canale Intornu à Kubernetes in Telegram.

Source: www.habr.com

Add a comment