Come utilizzare più efficacemente kubectl: una guida dettagliata

Come utilizzare più efficacemente kubectl: una guida dettagliata
Se lavori con Kubernetes, è probabile che kubectl sia uno degli strumenti che utilizzi di più. E ogni volta che investimenti tanto tempo con uno strumento specifico, vale la pena studiarlo a fondo e imparare ad utilizzarlo in modo efficace.

Team Kubernetes aaS di Mail.ru ha tradotto l'articolo di Daniel Weibel, dove troverai suggerimenti e trucchi per lavorare in modo efficace con kubectl. Questo aiuterà anche a comprendere meglio come funziona Kubernetes.

Secondo l'autore, l'obiettivo dell'articolo è rendere il tuo lavoro quotidiano con Kubernetes non solo più efficiente, ma anche più piacevole!

Introduzione: che cos'è kubectl

Prima di imparare a utilizzare kubectl in modo più efficace, è necessario avere una comprensione di base di cosa sia e di come funzioni.

Dal punto di vista dell'utente, kubectl è un'interfaccia di gestione che consente di eseguire operazioni su Kubernetes.

Dal punto di vista tecnico, kubectl è il client dell'API Kubernetes.

L'API Kubernetes è un'API REST HTTP. Questa API è la vera interfaccia utente di Kubernetes, attraverso la quale è completamente controllato. Ciò significa che ogni operazione di Kubernetes è rappresentata come un endpoint API e può essere eseguita con una richiesta HTTP a tale endpoint.

Di conseguenza, la principale funzione di kubectl è effettuare richieste HTTP all'API di Kubernetes:

Come utilizzare più efficacemente kubectl: una guida dettagliata
Kubernetes è un sistema completamente orientato alle risorse. Ciò significa che mantiene lo stato interno delle risorse e tutte le operazioni di Kubernetes sono operazioni CRUD.

Hai il completo controllo su Kubernetes gestendo queste risorse, e Kubernetes determina cosa fare in base allo stato attuale delle risorse. Per questo motivo, il riferimento all'API di Kubernetes è organizzato come un elenco di tipi di risorse con le relative operazioni.

Consideriamo un esempio.

Supponiamo che tu voglia creare una risorsa ReplicaSet. Per farlo, descrivi il ReplicaSet in un file chiamato replicaset.yaml, e poi esegui il comando:

$ kubectl create -f replicaset.yaml

Di conseguenza, verrà creata la risorsa ReplicaSet. Ma cosa succede dietro le quinte?

In Kubernetes esiste un'operazione per la creazione del ReplicaSet. Come qualsiasi altra operazione, è fornita come endpoint dell'API. L'endpoint specifico dell'API per questa operazione è il seguente:

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

Tutti gli endpoint API di tutte le operazioni di Kubernetes possono essere trovati nel manuale API (incluso l'endpoint sopra menzionato). Per effettuare una reale richiesta al punto finale, è necessario prima aggiungere l'indirizzo URL del server API ai percorsi del punto finale elencati nella documentazione API.

Pertanto, quando esegui il comando sopra indicato, kubectl invia una richiesta HTTP POST al punto finale API sopra menzionato. La definizione di ReplicaSet che hai specificato nel file replicaset.yaml, viene trasmessa nel corpo della richiesta.

Questo è il modo in cui kubectl opera per tutti i comandi che interagiscono con il cluster Kubernetes. In tutti questi casi, kubectl invia semplicemente richieste HTTP ai punti finali API corrispondenti di Kubernetes.

Si noti che è possibile gestire completamente Kubernetes utilizzando uno strumento come curl, inviando manualmente richieste HTTP all'API di Kubernetes. Kubectl semplifica semplicemente l'utilizzo dell'API di Kubernetes.

Questi sono i fondamenti di cosa sia kubectl e di come funzioni. Ma c'è ancora qualcosa riguardo all'API di Kubernetes che ogni utente di kubectl deve sapere. Immergiamoci brevemente nel mondo interno di Kubernetes.

Mondo interno di Kubernetes

Kubernetes è composto da un insieme di componenti indipendenti che vengono eseguiti come processi separati sui nodi del cluster. Alcuni componenti operano sui nodi principali, altri sui nodi di lavoro, ciascun componente svolge il proprio compito specifico.

Ecco i componenti più importanti sui nodi principali:

  1. Storage — memorizza le definizioni delle risorse (di solito questo è etcd).
  2. server API — fornisce API e gestisce il repository.
  3. Controller manager — garantisce che gli stati delle risorse corrispondano alle specifiche.
  4. Pianificatore — pianifica i pod sui nodi di lavoro.

Ecco un altro componente molto importante sui nodi di lavoro:

  1. Kubelet — gestisce l'esecuzione dei contenitori sul nodo di lavoro.

Per capire come questi componenti lavorano insieme, consideriamo un esempio.

Supponiamo che tu abbia appena eseguito kubectl create -f replicaset.yaml, dopodiché kubectl ha effettuato una richiesta HTTP POST a endpoint API del ReplicaSet (passando la definizione della risorsa ReplicaSet).

Cosa succede nel cluster?

  1. Dopo l'esecuzione kubectl create -f replicaset.yaml il server API memorizza la definizione della tua risorsa ReplicaSet nel repository:

    Come utilizzare più efficacemente kubectl: una guida dettagliata

  2. Successivamente, viene avviato il controller ReplicaSet nel gestore dei controller, che gestisce la creazione, la modifica e la rimozione delle risorse ReplicaSet:

    Come utilizzare più efficacemente kubectl: una guida dettagliata

  3. Il controller ReplicaSet crea una definizione del pod per ogni replica del ReplicaSet (in base al modello del pod nella definizione del ReplicaSet) e la memorizza nello storage:

    Come utilizzare più efficacemente kubectl: una guida dettagliata

  4. Viene avviato lo scheduler, che tiene traccia dei pod che non sono ancora stati assegnati a nessun nodo di lavoro:

    Come utilizzare più efficacemente kubectl: una guida dettagliata

  5. Lo scheduler seleziona un nodo di lavoro appropriato per ogni pod e aggiunge queste informazioni alla definizione del pod nello storage:

    Come utilizzare più efficacemente kubectl: una guida dettagliata

  6. Sulla nodo di lavoro a cui è assegnato il pod, viene avviato Kubelet, il quale tiene traccia dei pod assegnati a questo nodo:

    Come utilizzare più efficacemente kubectl: una guida dettagliata

  7. Kubelet legge la definizione del pod dallo storage e invia comandi all'ambiente di esecuzione dei container, come Docker, per avviare i container sul nodo:

    Come utilizzare più efficacemente kubectl: una guida dettagliata

Di seguito è riportata una versione testuale di questa descrizione.

Una richiesta API all'endpoint per la creazione del ReplicaSet viene elaborata dal server API. Il server API autentica la richiesta e memorizza la definizione della risorsa ReplicaSet nello storage.

Questo evento attiva il controller ReplicaSet, che è un sottoprocesso del gestore dei controller. Il controller ReplicaSet monitora la creazione, l'aggiornamento e la cancellazione delle risorse ReplicaSet nello storage e riceve una notifica riguardo all'evento quando accade.

Il compito del controller ReplicaSet è garantire che esista il numero necessario di pod del ReplicaSet. Nel nostro esempio, i pod non esistono ancora, quindi il controller ReplicaSet crea queste definizioni di pod (in base al modello di pod nella definizione del ReplicaSet) e le salva nello storage.

La creazione di nuovi pod attiva il pianificatore, che tiene traccia delle definizioni di pod che non sono ancora state pianificate per i nodi di lavoro. Il pianificatore seleziona un nodo di lavoro adatto per ogni pod e aggiorna le definizioni di pod nello storage.

Si noti che fino a questo momento in nessun luogo del cluster è stato eseguito codice di workload. Tutto ciò che è stato fatto finora, è la creazione e l'aggiornamento delle risorse nello storage sul nodo master.

L'ultimo evento avvia Kubelet, che monitora i pod programmati per i loro nodi di lavoro. Il Kubelet del nodo di lavoro su cui sono stati installati i tuoi pod ReplicaSet deve indicare all'ambiente di esecuzione dei contenitori, come Docker, di scaricare le immagini dei contenitori richieste e avviarle.

A questo punto, finalmente, la tua applicazione ReplicaSet è attiva!

Ruolo dell'API Kubernetes

Come hai visto nell'esempio precedente, i componenti di Kubernetes (eccetto il server API e lo storage) monitorano le modifiche alle risorse nello storage e aggiornano le informazioni sulle risorse in esso.

Naturalmente, questi componenti non interagiscono direttamente con lo storage, ma solo tramite l'API di Kubernetes.

Consideriamo i seguenti esempi:

  1. Il controller ReplicaSet utilizza l'endpoint API list ReplicaSets con il parametro watch per monitorare le modifiche alle risorse di ReplicaSet.
  2. Il controller ReplicaSet utilizza l'endpoint API create Pod (crea pod) per creare pod.
  3. Lo scheduler utilizza l'endpoint API patch Pod (modifica pod) per aggiornare i pod con informazioni sul nodo di lavoro selezionato.

Come si può vedere, questo è lo stesso API a cui si rivolge kubectl. Utilizzare lo stesso API per gestire i componenti interni e gli utenti esterni è un concetto fondamentale del design di Kubernetes.

Ora possiamo riassumere come funziona Kubernetes:

  1. Lo storage conserva lo stato, ovvero le risorse di Kubernetes.
  2. Il server API fornisce un'interfaccia allo storage sotto forma di API di Kubernetes.
  3. Tutti gli altri componenti e utenti di Kubernetes leggono, osservano e manipolano lo stato (risorse) di Kubernetes tramite l'API.

Conoscere questi concetti aiuterà a capire meglio kubectl e utilizzarlo al massimo.

Adesso vediamo una serie di suggerimenti e trucchi specifici che possono migliorare l'efficienza nell'uso di kubectl.

1. Accelerare l'immissione tramite il completamento dei comandi

Uno dei trucchi più utili, ma spesso trascurati, per aumentare l'efficienza nell'uso di kubectl è il completamento dei comandi.

Il completamento dei comandi consente di riempire automaticamente parti specifiche dei comandi kubectl premendo il tasto Tab. Questo funziona per sotto-comandi, opzioni e argomenti, incluse le parti complesse come i nomi delle risorse.

Guarda come funziona il completamento dei comandi kubectl:

Come utilizzare più efficacemente kubectl: una guida dettagliata
Il completamento dei comandi funziona per le shell Bash e Zsh.

Guida ufficiale contiene istruzioni dettagliate su come configurare il completamento automatico, ma di seguito forniremo un riepilogo.

Come funziona il completamento dei comandi

Il completamento dei comandi è una funzione della shell che funziona attraverso uno script di completamento. Lo script di completamento è uno script della shell che definisce il comportamento del completamento per un comando specifico.

Kubectl genera automaticamente e stampa script di completamento per Bash e Zsh con i seguenti comandi:

$ kubectl completion bash

O:

$ kubectl completion zsh

Teoricamente, è sufficiente collegare l'output di questi comandi alla shell appropriata affinché kubectl possa completare i comandi.

In pratica, il modo di collegare varia per Bash (inclusa la differenza tra Linux e MacOS) e Zsh. Di seguito esamineremo tutte queste opzioni.

Bash su Linux

Lo script di completamento per Bash dipende dal pacchetto bash-completion, quindi prima è necessario installarlo:

$ sudo apt-get install bash-completion

O:

$ yum install bash-completion

Puoi testare che il pacchetto sia stato installato con successo utilizzando il seguente comando:

$ type _init_completion

Se viene visualizzato il codice della funzione della shell, allora bash-completion è correttamente installato. Se il comando restituisce un errore "Non trovato", è necessario aggiungere la seguente riga nel tuo file ~ / .bashrc:

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

È necessario aggiungere questa riga nel file ~ / .bashrc oppure no, dipende dal gestore pacchetti che hai utilizzato per installare bash-completion. Per APT è necessario, per YUM no.

Dopo aver installato bash-completion, è necessario configurare tutto affinché lo script di completamento kubectl sia incluso in tutte le sessioni della shell.

Un modo per farlo è aggiungere la seguente riga nel file ~ / .bashrc:

source <(kubectl completion bash)

Un altro modo è aggiungere lo script di completamento kubectl nella directory /etc/bash_completion.d (creala, se non esiste):

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

Tutti gli script di completamento nella directory /etc/bash_completion.d vengono automaticamente inclusi in bash-completion.

Entrambe le opzioni sono applicabili allo stesso modo.

Dopo il riavvio della shell, l'autocompletamento dei comandi kubectl funzionerà.

Bash su MacOS

Su MacOS la configurazione è un po' più complessa. Infatti, per impostazione predefinita, MacOS utilizza Bash versione 3.2, mentre lo script di autocompletamento kubectl richiede almeno la versione 4.1 e non funziona su Bash 3.2.

L'uso di una versione obsoleta di Bash su MacOS è legato a questioni di licenza. Bash versione 4 è distribuito sotto la licenza GPLv3, non supportata da Apple.

Per configurare il completamento automatico di kubectl su MacOS, è necessario installare una versione più recente di Bash. Puoi anche impostare la nuova versione di Bash come shell predefinita, il che eviterà molti problemi in futuro. Non è difficile, i dettagli sono forniti nell'articolo «Aggiornamento di Bash su MacOS».

Prima di continuare, assicurati di utilizzare una versione recente di Bash (controlla l'output bash --version).

Lo script di completamento automatico in Bash dipende dal progetto bash-completion, quindi prima è necessario installarlo.

Puoi installare bash-completion tramite Homebrew:

$ brew install bash-completion@2

Qui @2 indica bash-completion versione 2. Il completamento automatico di kubectl richiede bash-completion v2, e bash-completion v2 richiede versione di Bash almeno 4.1.

Output del comando brew-install contiene una sezione Caveats, che indica che è necessario aggiungere nel 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"

Tuttavia, consiglio di aggiungere queste righe non in ˜/.bash_profile, e nella ~/.bashrc. In questo caso, il completamento automatico sarà disponibile non solo nella shell principale, ma anche nelle shell secondarie.

Dopo il riavvio della shell, puoi verificare la corretta installazione utilizzando il seguente comando:

$ type _init_completion

Se nell'output vedi una funzione shell, allora tutto è configurato correttamente.

Ora devi fare in modo che l'autocompletamento di kubectl sia attivato in tutte le sessioni.

Uno dei modi è aggiungere la seguente riga nel tuo ~/.bashrc:

source <(kubectl completion bash)

Secondo modo: aggiungi lo script di autocompletamento nella cartella /usr/local/etc/bash_completion.d:

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

Questo modo funzionerà solo se hai installato bash-completion tramite Homebrew. In tal caso, bash-completion carica tutti gli script da questa directory.

Se hai installato kubectl tramite Homebrew, non è necessario eseguire il passaggio precedente, poiché lo script di autocompletamento verrà automaticamente posizionato nella cartella /usr/local/etc/bash_completion.d durante l'installazione. In questo caso, l'autocompletamento di kubectl inizierà a funzionare non appena installerai bash-completion.

In definitiva, tutte queste opzioni sono equivalenti.

Zsh

Gli script di autocompletamento per Zsh non richiedono dipendenze. Tutto ciò che devi fare è attivarli all'avvio della shell.

Puoi farlo aggiungendo la riga nel tuo ~/.zshrc file:

source <(kubectl completion zsh)

Se hai ricevuto un errore not found: compdef dopo aver riavviato il tuo shell, è necessario attivare la funzione incorporata compdef. Può essere attivata aggiungendo all'inizio del tuo file ~/.zshrc il seguente:

autoload -Uz compinit
compinit

2. Anteprima rapida delle specifiche delle risorse

Quando crei definizioni delle risorse YAML, è importante conoscere i campi e i loro valori per queste risorse. Uno dei posti dove cercare queste informazioni è nel manuale API, che contiene le specifiche complete di tutte le risorse.

Tuttavia, passare a un browser web ogni volta che è necessario cercare qualcosa non è conveniente. Per questo motivo, kubectl fornisce il comando kubectl spiega, che mostra le specifiche di tutte le risorse direttamente nel tuo terminale.

Il formato del comando è il seguente:

$ kubectl explain resource[.field]...

Il comando restituirà la specifica della risorsa o del campo richiesto. Le informazioni restituite sono identiche a quelle contenute nel manuale API.

Di default kubectl spiega mostra solo il primo livello di nidificazione dei campi.

Guarda come appare puoi farlo qui.

Puoi visualizzare l'intero albero aggiungendo l'opzione --recursive:

$ kubectl explain deployment.spec --recursive

Se non sei sicuro di quali risorse siano necessarie, puoi visualizzarle tutte con il seguente comando:

$ kubectl api-resources

Questo comando visualizza i nomi delle risorse al plurale, ad esempio, deployments invece di deployment. Mostra anche un nome breve, ad esempio deploy, per quelle risorse che ne possiedono uno. Non preoccuparti di queste differenze. Tutte queste varianti di nomi sono equivalenti per kubectl. Quindi puoi utilizzare ciascuna di esse per kubectl spiega.

Tutti i seguenti comandi sono equivalenti:

$ kubectl explain deployments.spec
# oppure
$ kubectl explain deployment.spec
# oppure
$ kubectl explain deploy.spec

3. Utilizza un formato di output colonnare personalizzato

Per impostazione predefinita, il formato di output del comando 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

Questo formato è comodo, ma contiene un numero limitato di informazioni. Rispetto al formato completo della definizione delle risorse, qui vengono visualizzati solo alcuni campi.

In questo caso, puoi utilizzare un formato di output colonnare personalizzato. Questo ti consente di specificare quali dati visualizzare. Puoi visualizzare qualsiasi campo della risorsa in colonne separate.

L'uso di un formato personalizzato è determinato tramite opzioni:

-o custom-columns=
:[,
:]...

Puoi definire ogni colonna di output come coppia

:, dove
— il nome della colonna, e <jsonpath> — l'espressione che definisce il campo della risorsa.

Vediamo un semplice esempio:

$ 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 contiene una colonna con i nomi dei pod.

L'espressione nell'opzione seleziona i nomi dei pod dal campo metadata.name. Questo perché il nome del pod è definito nel campo figlio name del metadata nella descrizione della risorsa del pod. Puoi trovare maggiori dettagli nel manuale API o digitando il comando kubectl explain pod.metadata.name.

Ora supponiamo che tu voglia aggiungere una colonna aggiuntiva all'output, ad esempio, mostrando il nodo su cui è in esecuzione ogni pod. Per fare ciò, puoi semplicemente aggiungere la specifica della colonna corrispondente all'opzione delle colonne personalizzate:

$ 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 seleziona il nome del nodo da spec.nodeName — quando viene assegnato a un nodo, il suo nome viene registrato nel campo spec.nodeName della specifica delle risorse del pod. Maggiori informazioni possono essere trovate nell'output kubectl explain pod.spec.nodeName.

Si tenga presente che i campi delle risorse Kubernetes fanno distinzione tra maiuscole e minuscole.

È possibile visualizzare qualsiasi campo della risorsa come colonna. Basta esaminare la specifica della risorsa e provare con qualsiasi campo desiderato.

Ma prima di tutto, esaminiamo più da vicino le espressioni per la selezione dei campi.

Espressioni JSONPath

Le espressioni per selezionare campi delle risorse si basano su JSONPath.

JSONPath è un linguaggio per interrogare dati da documenti JSON. La selezione di un singolo campo è il caso d'uso più semplice di JSONPath. Ha molte più possibilità, compresi selettori, filtri e così via.

Kubectl explain supporta un numero limitato di funzionalità di JSONPath. Di seguito sono descritte le funzionalità e esempi del loro utilizzo:

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

Un operatore di particolare importanza è []. Molti campi delle risorse Kubernetes sono elenchi, e questo operatore consente di selezionare elementi di tali elenchi. Viene spesso utilizzato con un carattere jolly come [*], per selezionare tutti gli elementi dell'elenco.

Esempi di applicazione

Le possibilità di utilizzare il formato di output personalizzato delle colonne sono illimitate, poiché puoi mostrare qualsiasi campo o combinazione di campi delle risorse nell'output. Ecco alcuni esempi di applicazione, ma sentiti libero di esplorare autonomamente e trovare usi utili per te.

  1. Visualizzazione delle immagini dei contenitori per i pod:
    $ 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

    Questo comando visualizza i nomi delle immagini dei contenitori per ciascun pod.

    Ricorda che un pod può contenere più contenitori, quindi i nomi delle immagini saranno elencati su una singola riga separati da virgole.

  2. Visualizzazione delle zone di disponibilità dei 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

    Questo comando è utile se il tuo cluster è ospitato in un cloud pubblico. Visualizza la zona di disponibilità per ciascun nodo.

    La zona di disponibilità è un concetto cloud che limita l'ambito di replicazione a una regione geografica.

    Le zone di disponibilità per ogni nodo vengono ottenute tramite un'etichetta speciale — failure-domain.beta.kubernetes.io/zone. Se il cluster è avviato in un cloud pubblico, questa etichetta viene creata automaticamente e popolata con i nomi delle zone di disponibilità per ogni nodo.

    Le etichette non fanno parte della specifica delle risorse Kubernetes, quindi non troverai informazioni su di esse in manuale API. Tuttavia, possono essere visualizzate (insieme a qualsiasi altra etichetta) richiedendo informazioni sui nodi in formato YAML o JSON:

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

    Questo è un ottimo modo per conoscere meglio le risorse, oltre a esaminare le specifiche delle risorse.

4. Facile passaggio tra cluster e spazi dei nomi

Quando kubectl effettua una richiesta all'API Kubernetes, prima legge il file kubeconfig per ottenere tutti i parametri necessari per la connessione.

Per impostazione predefinita, il file kubeconfig è ~/.kube/config. Di solito, questo file viene creato o aggiornato tramite un comando specifico.

Quando lavori con più cluster, il tuo file kubeconfig contiene le impostazioni di connessione per tutti questi cluster. Hai bisogno di un modo per indicare al comando kubectl con quale cluster stai lavorando.

All'interno del cluster puoi creare più spazi dei nomi, una sorta di cluster virtuale all'interno di un cluster fisico. Kubectl determina quale spazio dei nomi utilizzare anche in base ai dati del file kubeconfig. Quindi, hai bisogno anche di un modo per indicare al comando kubectl con quale spazio dei nomi lavorare.

In questo capitolo ti spiegheremo come funziona e come ottenere prestazioni efficaci.

Tieni presente che puoi avere più file kubeconfig elencati nella variabile d'ambiente KUBECONFIG. In questo caso, tutti questi file verranno uniti in una configurazione comune durante l'esecuzione. Puoi anche cambiare il file kubeconfig predefinito eseguendo kubectl con l'opzione --kubeconfig. Vedi la documentazione ufficiale.

File kubeconfig

Diamo un'occhiata a cosa contiene effettivamente il file kubeconfig:

Come utilizzare più efficacemente kubectl: una guida dettagliata
Come puoi vedere, il file kubeconfig contiene un insieme di contesti. Un contesto è composto da tre elementi:

  • Cluster — URL del server API del cluster.
  • Utente — credenziali di autenticazione dell'utente nel cluster.
  • Namespace — spazio dei nomi utilizzato per connettersi al cluster.

Nella pratica, si utilizza spesso un contesto per cluster nel proprio file kubeconfig. Tuttavia, è possibile avere più contesti per cluster, che differiscono in base all'utente o allo spazio dei nomi. Tuttavia, tale configurazione con più contesti è abbastanza rara, quindi di solito esiste una corrispondenza univoca tra cluster e contesti.

In ogni momento, uno dei contesti è attuale:

Come utilizzare più efficacemente kubectl: una guida dettagliata
Quando kubectl legge il file di configurazione, prende sempre le informazioni dal contesto attuale. Nell'esempio precedente, kubectl si connetterà al cluster Hare.

Pertanto, per passare a un altro cluster, è necessario modificare il contesto attuale nel file kubeconfig:

Come utilizzare più efficacemente kubectl: una guida dettagliata
Ora kubectl si connetterà al cluster Fox.

Per passare a un altro spazio dei nomi nello stesso cluster, è necessario modificare il valore dell'elemento namespace per il contesto attuale:

Come utilizzare più efficacemente kubectl: una guida dettagliata
Nell'esempio sopra, kubectl utilizzerà lo spazio dei nomi Prod del cluster Fox (precedentemente era stato impostato lo spazio dei nomi Test).

Nota che kubectl fornisce anche i seguenti parametri --cluster, --user, --namespace e --context, che permettono di sovrascrivere singoli elementi e l'attuale contesto, indipendentemente da ciò che è impostato nel file kubeconfig. Vedi opzioni di kubectl.

Teoricamente, puoi modificare manualmente i parametri nel file kubeconfig. Ma è scomodo. Per semplificare queste operazioni, ci sono varie utilità che permettono di cambiare i parametri in modo automatico.

Usa kubectx

Un'utilità molto popolare per passare tra cluster e spazi dei nomi.

L'utilità fornisce i comandi kubectx e kubens per cambiare rispettivamente il contesto attuale e lo spazio dei nomi.

Come già accennato, cambiare il contesto attuale significa cambiare cluster, se hai solo un contesto per ogni cluster.

Ecco un esempio di esecuzione di questi comandi:

Come utilizzare più efficacemente kubectl: una guida dettagliata
In sostanza, questi comandi modificano semplicemente il file kubeconfig, come descritto sopra.

Per installare kubectx, segui le istruzioni su Github.

Entrambi i comandi supportano la completazione automatica dei nomi dei contesti e degli spazi dei nomi, permettendo di non doverli digitare per intero. Istruzioni per configurare la completazione automatica qui.

Un'altra funzione utile kubectx è modalità interattiva. Funziona in collaborazione con l'utilità fzf, che deve essere installata separatamente. L'installazione di fzf rende automaticamente disponibile la modalità interattiva in kubectx. In modalità interattiva, puoi selezionare un contesto e uno spazio dei nomi tramite un'interfaccia interattiva di ricerca libera fornita da fzf.

Utilizzo degli alias della shell

Non hai bisogno di strumenti separati per cambiare il contesto e lo spazio dei nomi attuali, poiché kubectl fornisce anche comandi per questo. Ad esempio, il comando kubectl config fornisce sotto-comandi per modificare i file kubeconfig.

Ecco alcuni di essi:

  • kubectl config get-contexts: mostra tutti i contesti;
  • kubectl config current-context: ottieni il contesto attuale;
  • kubectl config use-context: cambia il contesto attuale;
  • kubectl config set-context: modifica l'elemento del contesto.

Tuttavia, utilizzare questi comandi direttamente non è molto pratico, poiché sono lunghi. È possibile creare degli alias della shell che sono facili da eseguire.

Ho creato un insieme di alias basati su questi comandi che forniscono funzionalità simili a kubectx. Qui puoi vedere come funzionano:

Come utilizzare più efficacemente kubectl: una guida dettagliata
Nota che gli alias utilizzano fzf per fornire un'interfaccia interattiva di ricerca libera (come in modalità interattiva con kubectx). Questo significa che devi installare fzf, per utilizzare questi alias.

Ecco le definizioni degli alias:

# Получить текущий контекст
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 installare questi alias, devi aggiungere le definizioni sopra al tuo file ~/.bashrc o ~/.zshrc e ricaricare la tua shell.

Uso di plugin

Kubectl consente di caricare plugin che vengono eseguiti proprio come i comandi principali. Puoi, ad esempio, installare il plugin kubectl-foo e eseguirlo tramite il comando kubectl foo.

Sarebbe comodo cambiare contesto e namespace in questo modo, ad esempio eseguendo kubectl ctx per cambiare contesto e kubectl ns per cambiare namespace.

Ho scritto due plugin che fanno questo:

Il funzionamento dei plugin si basa sugli alias della sezione precedente.

Ecco come funzionano:

Come utilizzare più efficacemente kubectl: una guida dettagliata
Si noti che i plugin utilizzano fzf per fornire un'interfaccia interattiva di ricerca libera (come nella modalità interattiva di kubectx). Ciò significa che è necessario installare fzf, per utilizzare questi alias.

Per installare i plugin, è necessario scaricare gli script di shell con i nomi kubectl-ctx e kubectl-ns in una qualsiasi directory nella vostra variabile PATH e renderli eseguibili, ad esempio, utilizzando chmod +x. Dopo di che, sarete in grado di utilizzare kubectl ctx e kubectl ns.

5. Riduzione dell'input con alias automatici

Gli alias della shell sono un'ottima opportunità per accelerare l'input. Il progetto kubectl-aliases contiene circa 800 alias per i comandi principali di kubectl.

Potreste chiedervi: come memorizzare 800 alias? Ma non è necessario ricordarli tutti, poiché vengono costruiti secondo uno schema semplice, che è riportato di seguito:

Come utilizzare più efficacemente kubectl: una guida dettagliata
Ad esempio:

  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 get deployment all sl

Come puoi vedere, gli alias sono composti da componenti, ognuno dei quali rappresenta un elemento specifico del comando kubectl. Ogni alias può avere un componente per il comando base, l'operazione e la risorsa, e diversi componenti per i parametri. Devi semplicemente "riempire" questi componenti da sinistra a destra secondo lo schema fornito sopra.

Lo schema dettagliato attuale si trova su GitHub. Lì puoi anche trovare l'elenco completo degli alias.

Ad esempio, l'alias kgpooyamlall è equivalente al comando kubectl get pods -o yaml --all-namespaces.

L'ordine relativo delle opzioni non è importante: il comando kgpooyamlall è equivalente al comando kgpoalloyaml.

Non è necessario utilizzare tutti i componenti come alias. Ad esempio, k, kg, klo, ksys, kgpo possono essere usati anche. Inoltre, nella riga di comando puoi combinare alias e comandi o opzioni standard:

Ad esempio:

  1. Invece di kubectl proxy può essere scritto k proxy.
  2. Invece di kubectl get roles può essere scritto kg roles (attualmente non esiste un alias per la risorsa Roles).
  3. Per ottenere dati su un pod specifico, puoi usare il comando kgpo my-pod — kubectl get pod my-pod.

Tieni presente che alcuni alias richiedono un argomento nella riga di comando. Ad esempio, l'alias kgpol significa kubectl get pods -l. L'opzione -l richiede un argomento — la specifica dell'etichetta. Se utilizzi un alias, apparirà come kgpol app=ui.

Poiché alcuni alias richiedono argomenti, gli alias a, f e l devono essere utilizzati per ultimi.

In generale, una volta che padroneggi questo schema, potrai intuire gli alias dalle comandi che desideri eseguire, risparmiando molto tempo nella digitazione.

Installazione

Per installare kubectl-aliases, devi scaricare il file .kubectl_aliases da GitHub e includerlo nel file ~/.bashrc o ~/.zshrc:

source ~/ .kubectl_aliases

Auto-completamento

Come già detto, spesso aggiungi parole extra all'alias nella riga di comando. Ad esempio:

$ kgpooyaml test-pod-d4b77b989

Se utilizzi l'auto-completamento dei comandi kubectl, probabilmente hai utilizzato l'auto-completamento per cose come i nomi delle risorse. Ma è possibile farlo quando si usano alias?

Questa è una domanda molto importante, perché se l'auto-completamento non funziona, perderai alcuni dei vantaggi degli alias.

La risposta dipende dal tipo di shell che utilizzi:

  1. Per Zsh, l'auto-completamento per gli alias funziona «out of the box».
  2. Per Bash, sfortunatamente, sono necessarie alcune azioni per far funzionare l'auto-completamento.

Attivazione del completamento automatico per alias in Bash

Il problema con Bash è che tenta di completare (ogni volta che premi Tab) l'alias, invece del comando a cui fa riferimento l'alias (come fa, ad esempio, Zsh). Poiché non hai script di completamento per tutti e 800 gli alias, il completamento automatico non funziona.

Progetto complete-alias fornisce una soluzione generale a questo problema. Si integra con il meccanismo di completamento per gli alias, completando l'alias in un comando e restituendo le opzioni di completamento per il comando completato. Ciò significa che il completamento per un alias si comporta esattamente come per un comando completo.

Prima spiegherò come installare complete-alias e poi come configurarlo per abilitare il completamento per tutti gli alias kubectl.

Installazione di complete-alias

Prima di tutto, complete-alias dipende da bash-completion. Quindi, prima di installare complete-alias, assicurati che bash-completion sia installato. Le istruzioni per l'installazione sono state fornite in precedenza per Linux e MacOS.

Nota importante per gli utenti MacOS: così come lo script di completamento automatico kubectl, complete-alias non funziona con Bash 3.2, che è utilizzato per impostazione predefinita in MacOS. In particolare, complete-alias dipende da bash-completion v2 (brew install bash-completion@2), che richiede almeno Bash 4.1. Ciò significa che per utilizzare complete-alias su MacOS è necessario installare una versione più recente di Bash.

È necessario scaricare lo script bash_completion.sh di dal repository GitHub e includerlo nel proprio file ~/.bashrc:

source ~/bash_completion.sh

Dopo aver riavviato la shell, complete-alias sarà completamente installato.

Abilitare il completamento automatico per gli alias kubectl

Tecnicamente complete-alias fornisce una funzione della shell _complete_alias. Questa funzione verifica l'alias e restituisce suggerimenti di completamento per il comando alias.

Per legare la funzione a un alias specifico, è necessario utilizzare il meccanismo interno di Bash complete, per impostare _complete_alias come funzione di completamento dell'alias.

Come esempio, prendiamo l'alias k, che rappresenta il comando kubectl. Per impostare _complete_alias come funzione di completamento per questo alias, è necessario eseguire il seguente comando:

$ complete -F _complete_alias k

Il risultato è che ogni volta che si completa automaticamente l'alias k, viene chiamata la funzione _complete_alias, che verifica l'alias e restituisce suggerimenti di completamento per il comando kubectl.

Come secondo esempio, prendiamo l'alias kg, che rappresenta kubectl get:

$ complete -F _complete_alias kg

Proprio come nel esempio precedente, quando completi automaticamente kg, ricevi gli stessi suggerimenti che otterresti per kubectl get.

Nota che puoi usare complete-alias per qualsiasi alias nel tuo sistema.

Pertanto, per abilitare il completamento automatico per tutti gli alias kubectl, devi eseguire il comando sopra per ognuno di essi. Il seguente frammento fa proprio questo, a condizione che tu abbia installato kubectl-aliases in ~/.kubectl-aliases:

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

Questo pezzo di codice deve essere inserito nel tuo ~/.bashrc, riavviare la shell della command line e il completamento automatico sarà disponibile per tutti gli 800 alias kubectl.

6. Espandere kubectl tramite plugin

A partire da versione 1.12, kubectl supporta meccanismi di plugin, che consentono di estendere le sue funzionalità con comandi aggiuntivi.

Se sei familiare con meccanismi di plugin di Git, i plugin kubectl sono costruiti secondo lo stesso principio.

In questo capitolo parleremo di come installare i plugin, dove trovarli e come creare i tuoi plugin.

Installazione dei plugin

I plugin kubectl sono distribuiti come semplici file eseguibili con nomi del tipo kubectl-x. Il prefisso kubectl- è obbligatorio, seguito da un nuovo sottocomando kubectl, che consente di invocare il plugin.

Ad esempio, il plugin hello sarà distribuito come un file con il nome kubectl-hello.

Per installare il plugin, è necessario copiare il file kubectl-x in una qualsiasi directory della vostra variabile PATH e renderlo eseguibile, ad esempio con chmod +x. Subito dopo, potete richiamare il plugin con kubectl x.

Potete utilizzare il seguente comando per elencare tutti i plugin attualmente installati nel sistema:

$ kubectl plugin list

Questo comando mostra anche avvisi se avete più plugin con nomi identici o se c'è un file di plugin che non è eseguibile.

Ricerca e installazione di plugin tramite Krew

I plugin kubectl sono adatti per l'uso condiviso o ripetuto come pacchetti software. Ma dove si possono trovare i plugin condivisi da altri?

Il progetto Krew è progettato per fornire una soluzione unificata per la condivisione, la ricerca, l'installazione e la gestione dei plugin kubectl. Il progetto si definisce un «gestore di pacchetti per i plugin kubectl» (Krew è simile a Brew).

Krew è un elenco di plugin kubectl che puoi scegliere e installare. Inoltre, Krew è anche un plugin per kubectl.

Ciò significa che l'installazione di Krew funziona fondamentalmente come l'installazione di qualsiasi altro plugin kubectl. Puoi trovare istruzioni dettagliate su pagina GitHub.

I comandi più importanti di Krew:

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

Tieni presente che l'installazione dei plugin tramite Krew non interferisce con l'installazione dei plugin nel modo standard descritto sopra.

Si prega di notare che il comando kubectl krew list visualizza solo i plugin installati tramite Krew, mentre il comando kubectl plugin list elenca tutti i plugin, ovvero quelli installati tramite Krew e quelli installati in altri modi.

Ricerca di plugin altrove

Krew è un progetto giovane, attualmente nel suo elenco ci sono circa 30 plugin. Se non riesci a trovare ciò di cui hai bisogno, puoi cercare plugin in altre posizioni, ad esempio su GitHub.

Ti consiglio di dare un'occhiata alla sezione GitHub kubectl-plugins. Qui puoi trovare una serie di plugin disponibili che vale la pena esaminare.

Scrivere i propri plugin

Puoi creare plugin — è semplice. Devi creare un file eseguibile che faccia ciò che serve, chiamarlo con kubectl-x e installarlo come descritto sopra.

Il file può essere uno script bash, uno script python o un'applicazione compilata in go — non è importante. L'unico requisito è che possa essere eseguito direttamente nel sistema operativo.

Vediamo di creare un esempio di plugin proprio ora. Nel paragrafo precedente hai usato il comando kubectl per ottenere l'elenco dei container per ciascun pod. Puoi facilmente trasformare questo comando in un plugin che puoi chiamare, ad esempio, con kubectl img.

Crea un file kubectl-img con il seguente contenuto:

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

Ora rendi il file eseguibile con chmod +x kubectl-img e spostalo in una qualsiasi directory nel tuo PATH. Subito dopo, puoi utilizzare il plugin. kubectl img.

Come già accennato, i plugin kubectl possono essere scritti in qualsiasi linguaggio di programmazione o script. Se utilizzi script della shell, il vantaggio è la possibilità di invocare facilmente kubectl dal plugin. Tuttavia, puoi scrivere plugin più complessi in linguaggi di programmazione reali, utilizzando la libreria client di Kubernetes. Se usi Go, puoi anche utilizzare la libreria cli-runtime, che esiste specificamente per scrivere plugin kubectl.

Come condividere i tuoi plugin

Se pensi che i tuoi plugin possano essere utili ad altri, non esitare a condividerli su GitHub. Assicurati di aggiungerli al tema kubectl-plugins.

Puoi anche richiedere che il tuo plugin venga aggiunto al lista Krew. Le istruzioni su come farlo sono disponibili in repository GitHub.

Autocompletamento dei comandi

Attualmente, i plugin non supportano l'autocompletamento. Ciò significa che devi digitare il nome completo del plugin e i nomi completi degli argomenti.

Nel repository GitHub di kubectl c'è una richiesta aperta. Pertanto, è possibile che questa funzionalità venga implementata in futuro.

Buona fortuna!!!

Ulteriori letture sull'argomento:

  1. Tre livelli di autoscaling in Kubernetes e come utilizzarli in modo efficace.
  2. Kubernetes nello spirito della pirateria con un modello di implementazione.
  3. Il nostro canale Attorno a Kubernetes su Telegram.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster