
Dacă lucrați cu Kubernetes, este probabil ca kubectl să fie una dintre cele mai folosite unelte de către dumneavoastră. Ori de câte ori investiți mult timp în utilizarea unui anumit instrument, merită să-l studiați bine și să învățați cum să-l folosiți eficient.
Comanda articolul lui Daniel Weibella, în care găsiți sfaturi și trucuri pentru a lucra eficient cu kubectl. De asemenea, vă va ajuta să înțelegeți mai bine funcționarea Kubernetes.
Conform autorului, scopul articolului este de a face munca dumneavoastră zilnică cu Kubernetes nu doar mai eficientă, ci și mai plăcută!
Introducere: ce este kubectl
Înainte de a învăța să folosiți kubectl mai eficient, trebuie să aveți o înțelegere de bază a ceea ce este și cum funcționează.
Din perspectiva utilizatorului, kubectl este un panou de control care permite executarea operațiunilor Kubernetes.
Din punct de vedere tehnic, kubectl este clientul API Kubernetes.
API Kubernetes este un API REST HTTP. Acest API este adevăratul interfața de utilizare Kubernetes, prin care acesta este complet controlat. Asta înseamnă că fiecare operațiune Kubernetes este reprezentată ca un endpoint API și poate fi executată printr-o cerere HTTP către acest endpoint.
Prin urmare, sarcina principală a kubectl este să efectueze cereri HTTP către API-ul Kubernetes:

Kubernetes este un sistem complet orientat pe resurse. Asta înseamnă că el suportă starea internă a resurselor, iar toate operațiunile Kubernetes sunt operațiuni CRUD.
Aveți control total asupra Kubernetes-ului, gestionând aceste resurse, iar Kubernetes determină ce să facă, bazându-se pe starea actuală a resurselor. Din acest motiv, referința la API-ul Kubernetes este organizată sub forma unei liste de tipuri de resurse legate de operațiunile asociate.
Să luăm un exemplu.
Presupunem că doriți să creați o resursă ReplicaSet. Pentru a face acest lucru, descrieți ReplicaSet-ul într-un fișier denumit replicaset.yaml, apoi rulați comanda:
$ kubectl create -f replicaset.yamlCa rezultat, va fi creată o resursă ReplicaSet. Dar ce se întâmplă în spatele scenei?
În Kubernetes, există o operațiune de creare a ReplicaSet. Ca orice altă operațiune, aceasta este disponibilă ca un endpoint API. Endpoint-ul API specific pentru această operațiune arată astfel:
POST /apis/apps/v1/namespaces/{namespace}/replicasetsEndpoint-urile API pentru toate operațiunile Kubernetes pot fi găsite în (inclusiv ). Pentru a face o cerere efectivă către punctul final, trebuie să adăugați mai întâi adresa URL a serverului API la căile punctului final enumerate în documentația API.
Prin urmare, atunci când executați comanda menționată mai sus, kubectl trimite o cerere HTTP POST către punctul final API menționat anterior. Definiția ReplicaSet pe care ați specificat-o în fișierul replicaset.yaml, este transmisă în corpul cererii.
Așa funcționează kubectl pentru toate comenzile care interacționează cu clusterul Kubernetes. În toate aceste cazuri, kubectl trimite pur și simplu cereri HTTP către punctele finale corespunzătoare ale API-ului Kubernetes.
Rețineți că Kubernetes poate fi gestionat complet cu ajutorul unei astfel de unelte precum curl, trimițând manual cereri HTTP către API-ul Kubernetes. Kubectl simplifică pur și simplu utilizarea API-ului Kubernetes.
Acestea sunt fundamentele a ceea ce este kubectl și cum funcționează el. Dar mai există ceva despre API-ul Kubernetes de care fiecare utilizator kubectl ar trebui să fie conștient. Să ne scufundăm pe scurt în lumea interioară a Kubernetes.
Lumea interioară a Kubernetes
Kubernetes este format dintr-un set de componente independente, care rulează ca procese separate pe nodurile cluster-ului. Unele componente rulează pe nodurile principale, iar altele pe nodurile de lucru, fiecare componentă având sarcina sa specială.
Iată cele mai importante componente pe nodurile principale:
- Spațiu de stocare — stochează definițiile resurselor ().
- Server API — oferă API și gestionează stocarea.
- Managerul controlerului — garantează că stările resurselor corespund specificațiilor.
- Planificatorul de sarcini din Airflow este construit pe — planifică pod-urile pe nodurile de lucru.
Și iată o componentă foarte importantă pe nodurile de lucru:
- Kubelet — gestionează rularea containerelor pe nodul de lucru.
Pentru a înțelege cum aceste componente lucrează împreună, să luăm un exemplu.
Să presupunem că ați executat recent kubectl create -f replicaset.yaml, după care kubectl a făcut o cerere HTTP POST către (transmițând definiția resursei ReplicaSet).
Ce se întâmplă în cluster?
- După executare,
kubectl create -f replicaset.yamlserverul API stochează definiția resursei dvs. ReplicaSet în stocare:
- Apoi, se activează controlerul ReplicaSet din managerul controlerului, care se ocupă de crearea, modificarea și ștergerea resurselor ReplicaSet:

- Controlerul ReplicaSet creează definiția pod-ului pentru fiecare replică a ReplicaSet (conform șablonului pod-ului din definiția ReplicaSet) și le stochează în stocare:

- Se lansează un programator care urmărește modulele care nu au fost alocate încă niciunei noduri de lucru:

- Programatorul alege un nod de lucru adecvat pentru fiecare modul și adaugă această informație în definiția modulului în stocare:

- Pe nodul de lucru, căruia îi este alocat modulul, se lansează Kubelet, care urmărește modulele alocate acestui nod:

- Kubelet citește definiția modulului din stocare și dă comenzi mediului de execuție a containerelor, cum ar fi Docker, pentru a lansa containere pe nod:

Mai jos este o variantă textuală a acestei descrieri.
O solicitare API către endpoint-ul de creare a ReplicaSet-ului este procesată de serverul API. Serverul API autentifică solicitarea și salvează definiția resursei ReplicaSet în stocare.
Această eveniment activează controlerul ReplicaSet, care este un subprocess al managerului de control. Controlerul ReplicaSet urmărește crearea, actualizarea și ștergerea resurselor ReplicaSet în stocare și primește notificări despre evenimentele când acestea se întâmplă.
Sarcina controlerului ReplicaSet este de a se asigura că există numărul necesar de module ale ReplicaSet-ului. În exemplul nostru, modulele nu există încă, așa că controlerul ReplicaSet creează aceste definiții de module (conform șablonului modulului din definiția ReplicaSet) și le salvează în stocare.
Crearea de module noi activează programatorul care urmărește definițiile modulelor care nu au fost încă programate pentru nodurile de lucru. Programatorul alege un nod de lucru adecvat pentru fiecare modul și actualizează definițiile modulului în stocare.
Rețineți că până în acest moment, codul de lucru nu a fost executat nicăieri în cluster. Tot ce s-a făcut până acum, — este crearea și actualizarea resurselor în stocare pe nodul principal.
Ultimul eveniment activează Kubelet-ul, care urmărește modulele programate pentru nodurile lor de lucru. Kubelet-ul nodului de lucru, pentru care sunt setate modulele ReplicaSet, trebuie să ordoneze mediului de execuție a containerelor, cum ar fi Docker, să descarce imaginile de containere necesare și să le pornească.
În acest moment, în sfârșit, aplicația dvs. ReplicaSet este lansată!
Rolul API-ului Kubernetes
Așa cum ați văzut în exemplul anterior, componentele Kubernetes (cu excepția serverului API și a stocării) urmăresc schimbările resurselor în stocare și modifică informațiile despre resurse în stocare.
Desigur, aceste componente nu interacționează direct cu stocarea, ci doar prin intermediul API-ului Kubernetes.
Să luăm în considerare următoarele exemple:
- Controlerul ReplicaSet folosește un endpoint API cu parametrul
watchpentru a observa modificările resurselor ReplicaSet. - Controlerul ReplicaSet folosește un endpoint API (creați un pod) pentru a crea poduri.
- Planificatorul folosește un endpoint API (modificați un pod) pentru a actualiza podurile cu informații despre nodul de lucru selectat.
Așa cum puteți observa, acesta este același API la care se accesează kubectl. Utilizarea aceluiași API pentru a lucra cu componente interne și utilizatori externi este o concept fundamental în designul Kubernetes.
Acum putem sintetiza modul în care funcționează Kubernetes:
- Stocarea păstrează starea, adică resursele Kubernetes.
- Serverul API oferă un interfață către stocare sub formă de API Kubernetes.
- Toate celelalte componente și utilizatori Kubernetes citesc, observă și manipulează starea (resursele) Kubernetes prin intermediul API-ului.
Cunoașterea acestor concepte va ajuta la înțelegerea mai bună a kubectl și la utilizarea acestuia la maxim.
Acum să analizăm o serie de sfaturi și trucuri specifice care pot îmbunătăți performanța lucrului cu kubectl.
1. Accelerarea introducerii prin completarea comenzilor
Una dintre cele mai utile, dar adesea trecute cu vederea, tehnici pentru îmbunătățirea eficienței lucrului cu kubectl este completarea comenzilor.
Completarea comenzilor permite completarea automată a unor părți ale comenzilor kubectl cu tasta Tab. Aceasta funcționează pentru subcomenzi, opțiuni și argumente, inclusiv cele complexe, cum ar fi numele resurselor.
Uitați-vă cum funcționează completarea comenzilor kubectl:

Completarea comenzilor funcționează pentru shell-urile Bash și Zsh.
conține instrucțiuni detaliate pentru configurarea autocompletării, dar mai jos vă vom oferi un rezumat scurt.
Cum funcționează completarea comenzilor
Completarea comenzilor este o funcție a shell-ului, care funcționează cu ajutorul unui script de completare. Scriptul de completare este un script de shell care definește comportamentul completării pentru o comandă specifică.
Kubectl generează și scoate automat scripturi de completare pentru Bash și Zsh folosind comenzile următoare:
$ kubectl completion bashSau:
$ kubectl completion zshTeoretic, este suficient să conectați ieșirea acestor comenzi în shell-ul corespunzător, pentru ca kubectl să poată completa comenzile.
În practică, modalitatea de conectare variază pentru Bash (inclusiv diferențele dintre Linux și MacOS) și Zsh. Mai jos vom analiza toate aceste opțiuni.
Bash pe Linux
Scriptul de completare pentru Bash depinde de pachetul bash-completion, așa că mai întâi trebuie să-l instalați:
$ sudo apt-get install bash-completionSau:
$ yum install bash-completionPuteți testa dacă pachetul este instalat cu succes folosind următoarea comandă:
$ type _init_completion Dacă acest lucru returnează codul funcției shell, atunci bash-completion este instalat corect. Dacă comanda returnează o eroare „Neidentificat”, trebuie să adăugați următoarea linie în fișierul dumneavoastră ~ / .bashrc:
$ source /usr/share/bash-completion/bash_completion Dacă trebuie să adăugați această linie în fișier ~ / .bashrc sau nu, depinde de managerul de pachete pe care l-ați folosit pentru a instala bash-completion. Pentru APT este necesar, pentru YUM nu.
După instalarea bash-completion, trebuie să configurați totul astfel încât scriptul de completare kubectl să fie inclus în toate sesiunile shell.
Una dintre metodele de a face acest lucru este să adăugați următoarea linie în fișierul ~ / .bashrc:
source <(kubectl completion bash) O altă metodă este să adăugați scriptul de completare kubectl în directorul /etc/bash_completion.d (creați-l dacă nu există):
$ kubectl completion bash > /etc/bash_completion.d/kubectl Toate scripturile de completare din director /etc/bash_completion.d sunt incluse automat în bash-completion.
Ambele opțiuni sunt la fel de aplicabile.
După repornirea shell-ului, auto-completarea comenzilor kubectl va funcționa.
Bash pe MacOS
Pe MacOS, configurația este puțin mai complicată. Motivul este că, în mod implicit, MacOS are Bash versiunea 3.2, iar scriptul de completare automată kubectl necesită o versiune de Bash nu mai veche de 4.1 și nu funcționează în Bash 3.2.
Utilizarea versiunii învechite de Bash pe MacOS este legată de probleme de licențiere. Bash versiunea 4 este distribuit sub licența GPLv3, pe care Apple nu o susține.
Pentru a configura auto-completarea kubectl pe MacOS, trebuie să instalați o versiune mai recentă de Bash. De asemenea, puteți instala Bash actualizat ca shell implicit, ceea ce va preveni multe probleme în viitor. Acest lucru nu este dificil, detalii sunt prezentate în articolul „».
Înainte de a continua, asigurați-vă că utilizați o versiune recentă de Bash (verificați ieșirea bash --version).
Scriptul de completare automată în Bash depinde de proiectul , așa că mai întâi trebuie să-l instalați.
Puteți instala bash-completion cu ajutorul :
$ brew install bash-completion@2 Aici @2 indicative of bash-completion version 2. Autocompletion for kubectl requires bash-completion v2, and bash-completion v2 requires at least Bash version 4.1.
Ieșirea comenzii brew-install contains a Caveats section that specifies adding to the file ~/.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" However, I recommend adding these lines not to ~/.bash_profile, iar în ~/bashrc. In this case, autocompletion will be available not only in the main shell but also in child command shells.
After restarting the shell, you can check the correctness of the installation using the following command:
$ type _init_completionIf you see a shell function in the output, everything is set up correctly.
Now you need to enable kubectl autocompletion in all sessions.
One way is to add the following line to your ~/bashrc:
source <(kubectl completion bash) The second way is to add the autocompletion script to the folder /usr/local/etc/bash_completion.d:
$ kubectl completion bash
>/usr/local/etc/bash_completion.d/kubectlThis method will work only if you installed bash-completion using Homebrew. In this case, bash-completion loads all scripts from this directory.
If you installed , you don't need to perform the previous step, as the autocompletion script will be automatically placed in the folder /usr/local/etc/bash_completion.d during the installation. In this case, kubectl autocompletion will start working as soon as you install bash-completion.
Ultimately, all these options are equivalent.
Zsh
Autocompletion scripts for Zsh require no dependencies. All you need is to enable them when loading the shell.
You can do this by adding a line to your ~/zshrc fișier:
source <(kubectl completion zsh) If you received an error not found: compdef after restarting your shell, you need to enable the built-in function compdef. You can enable it by adding to the beginning of your file ~/zshrc the following:
autoload -Uz compinit
compinit2. Quick Overview of Resource Specifications
When creating YAML resource definitions, you need to know the fields and their values for those resources. One place to find this information is in the API reference, which contains full specifications for all resources.
However, switching to the web browser every time you need to look something up is inconvenient. Therefore, kubectl provides a command kubectl explain, which shows specifications for all resources right in your terminal.
The command format is as follows:
$ kubectl explain resource[.field]...Echipa va afișa specificațiile resursei sau câmpului solicitat. Informațiile afișate sunt identice cu cele conținute în manualul API.
Implicit kubectl explain afișează doar primul nivel de imbricare a câmpurilor.
Vezi cum arată .
Poți afișa întreaga structură dacă adaugi opțiunea --recursive:
$ kubectl explain deployment.spec --recursiveDacă nu știi exact ce resurse sunt necesare, poți să le afișezi pe toate cu comanda următoare:
$ kubectl api-resources Această comandă afișează numele resurselor la plural, de exemplu, deployments în loc de deployment. De asemenea, afișează numele scurt, de exemplu, deploy, pentru acele resurse care au. Nu te îngrijora de aceste diferențe. Toate aceste variante de nume sunt echivalente pentru kubectl. Adică poți folosi oricare dintre ele pentru kubectl explain.
Toate comenzile de mai jos sunt echivalente:
$ kubectl explain deployments.spec
# sau
$ kubectl explain deployment.spec
# sau
$ kubectl explain deploy.spec3. Folosește un format personalizat de afișare a coloanelor
Implicit, formatul de afișare al comenzii 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 78dAcest format este convenabil, dar conține un număr limitat de informații. Comparativ cu formatul complet de definiție a resursei, aici sunt afișate doar câteva câmpuri.
În acest caz, poți utiliza un format personalizat de afișare a coloanelor. Acesta îți permite să definești ce date să fie afișate. Poți afișa orice câmp al resursei într-o coloană separată.
Utilizarea formatului personalizat este definită prin opțiuni:
-o custom-columns=:[,:]... Îți poți defini fiecare coloană de ieșire cu o pereche , unde — denumirea coloanei, iar <jsonpath> — expresia care definește câmpul resursei.
Să vedem un exemplu simplu:
$ kubectl get pods -o custom-columns='NAME:metadata.name'
NAME
engine-544b6b6467-22qr6
engine-544b6b6467-lw5t8
engine-544b6b6467-tvgmg
web-ui-6db964458-8pdw4Ieșirea conține o coloană cu numele podurilor.
Expresia din opțiune selectează numele podurilor din câmpul metadata.name. Acest lucru se datorează faptului că numele podului este definit în câmpul fiu name al câmpului metadata din descrierea resursei podului. Poți găsi mai multe detalii în sau introduci comanda kubectl explain pod.metadata.name.
Acum să presupunem că doriți să adăugați o coloană suplimentară la ieșire, de exemplu, arătând nodul pe care rulează fiecare pod. Pentru aceasta, puteți adăuga pur și simplu specificația corespunzătoare a coloanei în opțiunea coloanelor personalizate:
$ 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 Expresia selectează numele nodului din spec.nodeName — atunci când podul este alocat unui nod, numele său este scris în câmpul spec.nodeName specificației resurselor podului. Informații mai detaliate pot fi văzute în ieșirea kubectl explain pod.spec.nodeName.
Rețineți că câmpurile resurselor Kubernetes sunt sensibil la majuscule.
Puteți vizualiza orice câmp de resursă sub formă de coloană. Pur și simplu revizuiți specificația resursei și încercați-o cu orice câmpuri doriți.
Dar mai întâi, să analizăm mai atent expresiile de selecție a câmpurilor.
Expresiile JSONPath
Expresiile pentru selectarea câmpurilor resurselor se bazează pe .
JSONPath este un limbaj pentru extragerea datelor din documente JSON. Selectarea unui câmp este cel mai simplu caz de utilizare a JSONPath. Acesta are mult mai , inclusiv selecții, filtre și așa mai departe.
Kubectl explain susține un număr limitat de funcționalități JSONPath. Mai jos sunt descrise funcționalitățile și exemplele de utilizare:
# Выбрать все элементы списка
$ 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'Operatorul [] are o semnificație specială. Multe câmpuri de resurse Kubernetes sunt liste, iar acest operator permite selectarea elementelor din aceste liste. Este adesea folosit cu un wildcard ca [*], pentru a selecta toate elementele din listă.
Exemple de aplicare
Posibilitățile de utilizare a formatului personalizat de ieșire a coloanelor sunt nelimitate, deoarece puteți afisa orice câmp sau combinație de câmpuri de resurse în ieșire. Iată câteva exemple de aplicații, dar nu ezitați să le explorați singuri și să găsiți aplicații utile pentru dvs.
- Afișarea imaginilor containerelor pentru poduri:
$ 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 wordpressAceastă comandă afișează numele imaginilor containerelor pentru fiecare pod.
Rețineți că sub poate conține mai multe containere, iar numele imaginilor vor fi listate într-un singur rând, separate prin virgule.
- Afișarea zonelor de disponibilitate ale nodurilor:
$ 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-1bAceastă comandă este convenabilă dacă clusterul dvs. este găzduit într-un nor public. Aceasta afișează zona de disponibilitate pentru fiecare nod.
Zona de disponibilitate este un concept în cloud care restricționează zona de replicare la o regiune geografică.
Zonele de disponibilitate pentru fiecare nod sunt obținute printr-o etichetă specială — . Dacă clusterul este lansat într-un nor public, această etichetă este creată automat și umplută cu numele zonelor de disponibilitate pentru fiecare nod.
Etichetele nu sunt parte a specificației resurselor Kubernetes, astfel încât nu veți găsi informații despre ele în . Cu toate acestea, le puteți vedea (ca și orice alte etichete), dacă solicitați informații despre noduri în format YAML sau JSON:
$ kubectl get nodes -o yaml # sau $ kubectl get nodes -o jsonAcesta este un mod excelent de a învăța mai multe despre resurse, în plus față de studierea specificațiilor resurselor.
4. Comutare ușoară între clustere și spații de nume
Când kubectl trimite o cerere către API-ul Kubernetes, acesta citește fișierul kubeconfig pentru a obține toate parametrii necesari pentru conectare.
În mod implicit, fișierul kubeconfig este ~/.kube/config. De obicei, acest fișier este creat sau actualizat printr-o comandă specială.
Când lucrați cu mai multe clustere, fișierul dvs. kubeconfig conține parametri de conectare pentru toate aceste clustere. Aveți nevoie de un mod de a indica comenzii kubectl cu care cluster lucrați.
În interiorul clusterului, puteți crea mai multe spații de nume — un tip de cluster virtual în interiorul unui cluster fizic. Kubectl determină ce spațiu de nume să utilizeze tot pe baza datelor din fișierul kubeconfig. Asta înseamnă că aveți nevoie, de asemenea, de un mod de a indica comenzii kubectl cu ce spațiu de nume să lucrați.
În acest capitol, vom explica cum funcționează acest lucru și cum să obțineți o operare eficientă.
Rețineți că este posibil să aveți mai multe fișiere kubeconfig listate în variabila de mediu KUBECONFIG. În acest caz, toate aceste fișiere vor fi combinate într-o configurație comună în timpul execuției. De asemenea, puteți schimba fișierul kubeconfig utilizat în mod implicit, rulând kubectl cu parametrul --kubeconfig. Consultați .
Fișierele kubeconfig
Să vedem ce conține fișierul kubeconfig:

După cum puteți vedea, fișierul kubeconfig conține un set de contexte. Un context este format din trei elemente:
- Cluster — URL-ul API-ului serverului cluster-ului.
- User — acreditivele de autentificare ale utilizatorului în cluster.
- Namespace — spațiul de nume utilizat când te conectezi la cluster.
În practică, de obicei se folosește un singur context per cluster în fișierul kubeconfig. Totuși, este posibil să aveți mai multe contexte per cluster, diferite prin utilizator sau spațiu de nume. Totuși, o astfel de configurație cu mai multe contexte este rar întâlnită, deci de obicei există o corespondență reciprocă între clustere și contexte.
În orice moment, unul dintre contexte este cel curent:

Când kubectl citește fișierul de configurare, întotdeauna folosește informațiile din contextul curent. În exemplul de mai sus, kubectl se va conecta la cluster-ul Hare.
Prin urmare, pentru a schimba la un alt cluster, trebuie să schimbi contextul curent în fișierul kubeconfig:

Acum, kubectl se va conecta la cluster-ul Fox.
Pentru a schimba la un alt spațiu de nume în același cluster, trebuie să schimbi valoarea elementului namespace pentru contextul curent:

În exemplul de mai sus, kubectl va utiliza spațiul de nume Prod al cluster-ului Fox (anterior era setat spațiul de nume Test).
Rețineți că kubectl oferă de asemenea parametrii --cluster, --user, --namespace și --context, care permit suprascrierea unor elemente individuale și a contextului curent, indiferent de ceea ce este setat în fișierul kubeconfig. Consultați opțiunile kubectl.
Teoretic, puteți modifica manual parametrii din fișierul kubeconfig. Dar acest lucru nu este convenabil. Pentru a simplifica aceste operațiuni, există o varietate de utilitare care permit modificarea parametrilor în mod automat.
Folosiți kubectx
O utilitară foarte populară pentru comutarea între clustere și spații de nume.
Utilitarul oferă comenzi kubectx și kubens pentru a schimba contextul și spațiul de nume curente în consecință.
După cum am menționat, schimbarea contextului curent înseamnă schimbarea cluster-ului, dacă aveți doar un singur context pe cluster.
Iată un exemplu de execuție a acestor comenzi:

În esență, aceste comenzi editează pur și simplu fișierul kubeconfig, așa cum a fost descris mai sus.
Pentru a instala kubectx, urmați instrucțiunile de pe
Ambele comenzi suportă completarea automată a numelui contextelor și spațiilor de nume, ceea ce permite să nu le introduceți complet. Instrucțiunile pentru configurarea completării automate .
O altă funcție utilă kubectx este . Acesta funcționează împreună cu utilitarul , care trebuie instalat separat. Instalarea fzf face automat disponibil modul interactiv în kubectx. În modul interactiv, puteți alege contextul și spațiul de nume printr-o interfață interactivă de căutare liberă, oferită de fzf.
Utilizarea aliasurilor de shell
Nu aveți nevoie de instrumente separate pentru a schimba contextul și spațiul de nume curente, deoarece kubectl oferă și comenzi pentru asta. Astfel, comanda kubectl config oferă subcomenzi pentru editarea fișierelor kubeconfig.
Iată câteva dintre acestea:
kubectl config get-contexts: afișa toate contexturile;kubectl config current-context: obține contextul curent;kubectl config use-context: schimbă contextul curent;kubectl config set-context: schimbă elementul contextului.
Cu toate acestea, utilizarea acestor comenzi direct nu este foarte convenabilă, deoarece sunt lungi. Puteți crea aliasuri de shell pentru ele, care sunt ușor de executat.
Am creat un set de aliasuri pe baza acestor comenzi, care oferă funcționalitate similară cu kubectx. Aici puteți vedea acțiunea lor:

Rețineți că aliasurile folosesc fzf pentru a oferi o interfață interactivă de căutare liberă (la fel ca în modul interactiv kubectx). Asta înseamnă că trebuie să , pentru a folosi aceste aliasuri.
Iată definițiile aliasurilor:
# Получить текущий контекст
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/^..//")"' Pentru a instala aceste aliasuri, trebuie să adăugați definițiile de mai sus în fișierul dvs. ~/bashrc sau ~/zshrc și să reîncărcați shell-ul.
Utilizarea pluginurilor
Kubectl permite încărcarea pluginurilor, care se execută la fel ca comenzile principale. Puteți, de exemplu, să instalați pluginul kubectl-foo și să îl rulați executând comanda kubectl foo.
Ar fi convenabil să schimbi contextul și spațiul de nume în acest mod, de exemplu, rulând kubectl ctx pentru a schimba contextul și kubectl ns pentru a schimba spațiul de nume.
Am scris două plug-in-uri care fac asta:
Funcționarea plug-in-urilor se bazează pe aliasurile din secțiunea anterioară.
Iată cum funcționează:

Rețineți că plug-in-urile folosesc fzf pentru a oferi o interfață interactivă de căutare liberă (așa cum este în modul interactiv kubectx). Asta înseamnă că trebuie să, pentru a folosi aceste aliasuri.
Pentru a instala plug-in-uri, trebuie să descărcați scripturile shell cu numele și într-un director din variabila PATH și să le faceți executabile, de exemplu, folosind chmod +x. Imediat după asta, veți putea folosi kubectl ctx și kubectl ns.
5. Scurtarea introducerii cu aliasuri automate
Aliasurile shell-ului sunt o oportunitate bună de a accelera introducerea. Proiectul conține aproximativ 800 de scurtături pentru comenzile de bază kubectl.
S-ar putea să te întrebi — cum să reții 800 de aliasuri? Dar nu trebuie să le reții pe toate, deoarece acestea sunt construite după un model simplu, care este prezentat mai jos:

De exemplu:
- kgpooyaml — kubectl get pods oyaml
- ksysgsvcw — kubectl -n kube-system get svc w
- ksysrmcm — kubectl -n kube-system rm cm
- kgdepallsl — kubectl get deployment all sl
După cum vezi, aliasurile constau din componente, fiecare dintre ele reprezentând un element specific al comenzii kubectl. Fiecare alias poate avea o componentă pentru comanda de bază, operație și resursă și mai multe componente pentru parametri. Pur și simplu «umpli» aceste componente din stânga spre dreapta conform modelului de mai sus.
Schema detaliată curentă se află la . Acolo poți găsi și.
De exemplu, aliasul kgpooyamlall este echivalent cu comanda kubectl get pods -o yaml --all-namespaces.
Ordinea relativă a opțiunilor nu contează: comanda kgpooyamlall este echivalentă cu comanda kgpoalloyaml.
Nu trebuie să folosești toate componentele ca aliasuri. De exemplu, k, kg, klo, ksys, kgpo de asemenea, pot fi folosite. Mai mult, în linia de comandă pot fi combinate aliasurile și comenzile sau opțiunile obișnuite:
De exemplu:
- În loc de
kubectl proxypoate fi scrisk proxy. - În loc de
kubectl get rolespoate fi scriskg roles(în prezent nu există un alias pentru resursa Roles). - Pentru a obține date despre un anumit pod, poți folosi comanda
kgpo my-pod — kubectl get pod my-pod.
Rețineți că unele aliasuri necesită un argument în linia de comandă. De exemplu, aliasul kgpol înseamnă kubectl get pods -l. Opțiunea -l necesită un argument - specificația aliasului. Dacă folosiți un alias, acesta va arăta ca kgpol app=ui.
Dacă o parte din aliasuri necesită argumente, aliasurile a, f și l trebuie să fie utilizate la final.
În general, odată ce stăpâniți acest model, veți putea să extrageți intuitiv aliasurile din comenzi pe care doriți să le executați, economisind mult timp la introducerea lor.
Instalare
Pentru a instala kubectl-aliases, trebuie să descărcați fișierul de pe GitHub și să-l includeți în fișierul ~/bashrc sau ~/zshrc:
source ~/.kubectl_aliasesAutocompletare
Așa cum am menționat, adesea adăugați cuvinte suplimentare la alias în linia de comandă. De exemplu:
$ kgpooyaml test-pod-d4b77b989Dacă folosiți autocompletarea comenzii kubectl, probabil ați folosit autocompletarea pentru lucruri precum numele resurselor. Dar se poate face acest lucru atunci când folosiți aliasuri?
Aceasta este o întrebare foarte importantă, deoarece, dacă autocompletarea nu funcționează, veți pierde o parte din avantajele aliasurilor.
Răspunsul depinde de ce shell de comandă folosiți:
- Pentru Zsh, autocompletarea pentru aliasuri funcționează 'din cutie'.
- Din păcate, pentru Bash, sunt necesare unele acțiuni pentru a activa autocompletarea.
Activarea autocompletării pentru aliasuri în Bash
Problema cu Bash este că încearcă să autocompleteze (de fiecare dată când apăsați Tab) aliasul, nu comanda la care face referire aliasul (așa cum face, de exemplu, Zsh). Deoarece nu aveți scripturi de completare pentru toate cele 800 de aliasuri, autocompletarea nu funcționează.
Proiect oferă o soluție generală pentru această problemă. Se leagă de mecanismul de completare pentru aliasuri, completează aliasul până la comandă și returnează opțiunile de completare pentru comanda completată. Aceasta înseamnă că completarea pentru un alias se comportă exact ca pentru o comandă completă.
Mai întâi, voi explica cum să instalați complete-alias și apoi cum să-l configurați pentru a activa completarea pentru toate aliasurile kubectl.
Instalarea complete-alias
În primul rând, complete-alias depinde de . Așadar, înainte de a instala complete-alias, trebuie să vă asigurați că bash-completion este instalat. Instrucțiunile de instalare au fost date anterior pentru Linux și MacOS.
Notă importantă pentru utilizatorii MacOS: la fel ca și scriptul de autocompletare kubectl, complete-alias nu funcționează cu Bash 3.2, care este utilizat implicit în MacOS. În special, complete-alias depinde de bash-completion v2 (brew install bash-completion@2), pentru care este necesară cel puțin versiunea Bash 4.1. Aceasta înseamnă că pentru a utiliza complete-alias pe MacOS, trebuie să instalați o versiune mai nouă de Bash.
Trebuie să descărcați scriptul din și să-l includeți în fișierul dumneavoastră ~/bashrc:
source ~/bash_completion.shDupă repornirea shell-ului, complete-alias va fi complet instalat.
Activarea autocompletării pentru aliasurile kubectl
Din punct de vedere tehnic, complete-alias oferă o funcție de shell _complete_alias. Această funcție verifică aliasurile și returnează sugestii de completare pentru comanda aliasului.
Pentru a asocia funcția cu un anumit alias, trebuie să folosiți mecanismul încorporat Bash , pentru a stabili _complete_alias ca funcție de completare a aliasului.
Ca exemplu, să luăm aliasul k, care reprezintă comanda kubectl. Pentru a stabili _complete_alias ca funcție de completare pentru acest alias, trebuie să executați următoarea comandă:
$ complete -F _complete_alias k Rezultatul este că de fiecare dată când completați aliasul k, se apelează funcția _complete_alias, care verifică aliasul și returnează sugestiile de completare pentru comanda kubectl.
Ca al doilea exemplu, să luăm aliasul kg, care reprezintă kubectl get:
$ complete -F _complete_alias kg La fel ca în exemplul anterior, când completați kg, veți obține aceleași sugestii de completare pe care le-ați obține pentru kubectl get.
Rețineți că se poate folosi complete-alias pentru orice alias în sistemul dumneavoastră.
Prin urmare, pentru a activa autocompletarea pentru toate aliasurile kubectl, trebuie să executați comanda de mai sus pentru fiecare dintre ele. Fragmentul următor face exact acest lucru, presupunând că ați instalat kubectl-aliases în ~/ .kubectl-aliases:
for _a in $(sed '/^alias /!d;s/^alias //;s/=.*$//' ~/ .kubectl_aliases);
do
complete -F _complete_alias "$_a"
done Această bucată de cod trebuie plasată în fișierul dumneavoastră ~/bashrc, reporniți shell-ul și autocompletarea va fi disponibilă pentru toate cele 800 de aliasuri kubectl.
6. Extinderea kubectl prin pluginuri
Începând cu , kubectl suportă , care permit extinderea funcțiilor sale cu comenzi suplimentare.
Dacă sunteți familiarizat cu , pluginurile kubectl sunt construite pe același principiu.
În acest capitol, vă vom arăta cum să instalați pluginuri, unde să le căutați și cum să creați propriile pluginuri.
Instalarea pluginurilor
Plugin-urile kubectl sunt distribuite sub formă de fișiere executabile simple numite kubectl-x. Prefixul kubectl- este obligatorie, urmată de o nouă subcomandă kubectl care permite apelarea pluginului.
De exemplu, pluginul hello va fi distribuit sub forma unui fișier denumit kubectl-hello.
Pentru a instala pluginul, trebuie să copiați fișierul kubectl-x în orice director din variabila dvs. PATH și să-l faceți executabil, de exemplu cu ajutorul chmod +x. Imediat după aceea, puteți apela pluginul folosind kubectl x.
Puteți folosi următoarea comandă pentru a afișa lista tuturor pluginurilor care sunt în prezent instalate în sistemul dumneavoastră:
$ kubectl plugin listAceastă comandă va afișa, de asemenea, avertismente, dacă aveți mai multe pluginuri cu nume identice sau dacă există un fișier de pluginuri care nu este executabil.
Căutarea și instalarea pluginurilor folosind Krew
Pluginurile kubectl sunt disponibile pentru partajare sau reutilizare similar cu pachetele software. Dar unde puteți găsi pluginuri pe care le-au împărtășit alții?
este destinat să ofere o soluție unificată pentru partajarea, căutarea, instalarea și gestionarea pluginurilor kubectl. Proiectul se prezintă ca un "manager de pachete pentru pluginurile kubectl" (Krew este similar cu ).
Krew este o listă de pluginuri kubectl din care puteți alege și instala. De asemenea, Krew este un plugin pentru kubectl.
Asta înseamnă că instalarea Krew funcționează, în esență, ca instalarea oricărui alt plugin kubectl. Puteți găsi instrucțiuni detaliate pe .
Cele mai importante comenzi Krew:
# Поиск в списке плагинов
$ kubectl krew search [<query>]
# Посмотреть информацию о плагине
$ kubectl krew info <plugin>
# Установить плагин
$ kubectl krew install <plugin>
# Обновить все плагины до последней версии
$ kubectl krew upgrade
# Посмотреть все плагины, установленные через Krew
$ kubectl krew list
# Деинсталлировать плагин
$ kubectl krew remove <plugin>Rețineți că instalarea pluginurilor folosind Krew nu împiedică instalarea pluginurilor în mod standard, descris mai sus.
Observați că comanda kubectl krew list arată doar pluginurile care au fost instalate folosind Krew, în timp ce comanda kubectl plugin list enumeră toate pluginurile, adică pe cele instalate folosind Krew și pe cele instalate prin alte metode.
Căutarea pluginurilor în alte locuri
Krew este un proiect tânăr, în prezent în sunt doar aproximativ 30 de pluginuri. Dacă nu puteți găsi ceea ce aveți nevoie, puteți găsi pluginuri în alte locuri, cum ar fi GitHub.
Vă recomand să verificați secțiunea GitHub . Acolo veți găsi câteva zeci de pluginuri disponibile pe care merită să le verificați.
Scrierea propriilor pluginuri
Puteți crea propriile — nu este greu. Trebuie să creați un fișier executabil care să facă ceea ce trebuie, numindu-l sub forma kubectl-x și să-l instalați, așa cum a fost descris mai sus.
Fișierul poate fi un script bash, un script python sau o aplicație compilată go — nu este important. Singura condiție este să poată fi executat direct în sistemul de operare.
Haideți să creăm un exemplu de plugin chiar acum. În secțiunea anterioară, ați folosit comanda kubectl pentru a lista containerele pentru fiecare pod. Este ușor să transformați această comandă într-un plugin pe care îl puteți apela, de exemplu, folosind kubectl img.
Creați un fișier kubectl-img users.module.ts
#!/bin/bash
kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image' Acum faceți fișierul executabil cu ajutorul chmod +x kubectl-img și mutați-l într-un director din PATH-ul dumneavoastră. Imediat după aceasta, puteți folosi pluginul kubectl img.
Așa cum a fost menționat, pluginurile kubectl pot fi scrise în orice limbaj de programare sau scriptare. Dacă folosiți scripturi de shell, avantajul este posibilitatea de a apela cu ușurință kubectl din plugin. Cu toate acestea, puteți scrie pluginuri mai complexe în limbaje de programare reale, folosind . Dacă folosiți Go, puteți folosi de asemenea , care a fost creată special pentru scrierea pluginurilor kubectl.
Cum să împărtășiți pluginurile dumneavoastră
Dacă credeți că pluginurile dumneavoastră ar putea fi utile altora, nu ezitați să le împărtășiți pe GitHub. Asigurați-vă că le adăugați la subiectul .
De asemenea, puteți solicita adăugarea pluginului dumneavoastră în . Instrucțiuni despre cum să faceți acest lucru pot fi găsite în .
Completarea automată a comenzilor
În prezent, pluginurile nu suportă completarea automată. Adică, trebuie să introduceți numele complet al pluginului și numele complet al argumentelor.
În repo-ul GitHub kubectl, pentru această funcție există . Prin urmare, este posibil ca această funcție să fie implementată vreodată în viitor.
Mult noroc!!!
What else to read on the topic:
- .
- .
- .
Sursa: habr.com







