Come utilizzare meglio kubectl: guida dettagliata

Come utilizzare meglio kubectl: guida dettagliata
Se lavori con Kubernetes, probabilmente kubectl è uno degli strumenti che usi di più. Ogni volta che spendi molto tempo su uno strumento, vale la pena studiarlo a fondo e imparare a usarlo in modo efficace.

Team Kubernetes aaS di Mail.ru ho tradotto l'articolo di Daniel Weibel, in cui troverai consigli e trucchi per lavorare in modo efficiente con kubectl. Inoltre, ti aiuterà a comprendere meglio il funzionamento di Kubernetes.

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

Introduzione: cos'è kubectl

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

Dal punto di vista dell'utente, kubectl è un pannello di controllo che permette di eseguire operazioni su Kubernetes.

Dal punto di vista tecnico, kubectl è un client per l'API Kubernetes.

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

Di conseguenza, il compito principale di kubectl è eseguire richieste HTTP all'API Kubernetes:

Come utilizzare meglio kubectl: 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.

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

Ecco un esempio.

Supponiamo che tu voglia creare una risorsa ReplicaSet. Per farlo, descrivi il ReplicaSet in un file di nome replicaset.yaml, quindi esegui il comando:

$ kubectl create -f replicaset.yaml

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

In Kubernetes esiste un'operazione di creazione del ReplicaSet. Come qualsiasi altra operazione, è fornita come un endpoint API. L'endpoint API specifico per questa operazione appare così:

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

Gli endpoint API di tutte le operazioni di Kubernetes possono essere trovati nel manuale API (incluso l'endpoint sopra menzionato). Per effettuare una richiesta effettiva all'endpoint, è necessario prima aggiungere l'URL del server API ai percorsi degli endpoint elencati nella documentazione API.

Pertanto, quando si esegue il comando sopra indicato, kubectl invia una richiesta HTTP POST all'endpoint API sopra menzionato. La definizione del ReplicaSet che hai specificato nel file replicaset.yaml, viene inviata nel corpo della richiesta.

È così che funziona kubectl per tutti i comandi che interagiscono con il cluster Kubernetes. In tutti questi casi, kubectl invia semplicemente richieste HTTP agli endpoint API corrispondenti di Kubernetes.

Nota che è possibile gestire completamente Kubernetes con uno strumento come curl, inviando manualmente richieste HTTP all'API di Kubernetes. Kubectl semplifica solo l'uso dell'API di Kubernetes.

Queste sono le basi di cosa sia kubectl e di come funziona. Ma c'è qualcos'altro riguardo all'API di Kubernetes che ogni utente di kubectl dovrebbe sapere. Esploriamo brevemente il mondo interiore di Kubernetes.

Il mondo interiore 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, e ogni componente ha il proprio compito speciale.

Ecco i componenti più importanti sui nodi principali:

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

Ecco un altro importante componente sui nodi di lavoro:

  1. Kubelet — gestisce l'avvio dei container su un nodo di lavoro.

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

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

Cosa succede nel cluster?

  1. Dopo aver eseguito kubectl create -f replicaset.yaml l'API server memorizza la definizione della tua risorsa ReplicaSet nello storage:

    Come utilizzare meglio kubectl: guida dettagliata

  2. Dopo di che, viene avviato il controller ReplicaSet nel Controller Manager, che si occupa della creazione, modifica e cancellazione delle risorse ReplicaSet:

    Come utilizzare meglio kubectl: guida dettagliata

  3. Il controller ReplicaSet crea una definizione del pod per ciascuna replica del ReplicaSet (secondo il modello del pod nella definizione del ReplicaSet) e le memorizza nello storage:

    Come utilizzare meglio kubectl: 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 meglio kubectl: guida dettagliata

  5. Lo scheduler seleziona un nodo di lavoro adatto per ogni pod e aggiunge queste informazioni nella definizione del pod nel repository:

    Come utilizzare meglio kubectl: guida dettagliata

  6. Sul nodo di lavoro a cui è assegnato il pod viene avviato Kubelet, che tiene traccia dei pod assegnati a quel nodo:

    Come utilizzare meglio kubectl: guida dettagliata

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

    Come utilizzare meglio kubectl: guida dettagliata

Di seguito una versione testuale di questa descrizione.

La richiesta API all'endpoint di creazione del ReplicaSet viene elaborata dal server API. Il server API autentica la richiesta e salva la definizione della risorsa ReplicaSet nel repository.

Questo evento avvia il controller ReplicaSet, che è un sottoprocesso del gestore dei controller. Il controller ReplicaSet monitora la creazione, l'aggiornamento e la rimozione delle risorse ReplicaSet nel repository e riceve notifiche quando ciò accade.

Il compito del controller ReplicaSet è quello di garantire che esista il numero corretto di pod replica 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 nel repository.

La creazione di nuovi pod avvia lo scheduler, che tiene traccia delle definizioni dei pod che non sono ancora pianificate per i nodi di lavoro. Lo scheduler seleziona un nodo di lavoro adatto per ogni pod e aggiorna le definizioni dei pod nel repository.

Si noti che fino a questo momento non è stato eseguito alcun codice di carico di lavoro nel cluster. Tutto ciò che è stato fatto finora è la creazione e l'aggiornamento delle risorse nel repository sul nodo master.

L'ultimo evento avvia Kubelet, che monitora i pod pianificati per i loro nodi di lavoro. Kubelet del nodo di lavoro a cui sono stati assegnati i tuoi pod ReplicaSet deve dare istruzioni all'ambiente di esecuzione dei container, come Docker, per scaricare le immagini dei container richieste e avviarle.

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

Il ruolo dell'API Kubernetes

Come hai visto nel precedente esempio, i componenti di Kubernetes (eccetto il server API e il repository) monitorano i cambiamenti delle risorse nel repository e modificano le informazioni sulle risorse nel repository.

Certo, 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 dell'API list ReplicaSets con il parametro watch per monitorare le modifiche delle risorse del ReplicaSet.
  2. Il controller ReplicaSet utilizza l'endpoint dell'API create Pod (creare pod) per creare pod.
  3. Lo scheduler utilizza l'endpoint dell'API patch Pod (modificare pod) per aggiornare i pod con le informazioni sulla nodola di lavoro selezionata.

Come potete vedere, si tratta dello stesso API a cui si rivolge kubectl. L'utilizzo dello stesso API per il funzionamento dei componenti interni e degli utenti esterni è un concetto fondamentale nel design di Kubernetes.

Ora possiamo riassumere come funziona Kubernetes:

  1. Lo storage mantiene 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 gli utenti di Kubernetes leggono, monitorano e manipolano lo stato (risorse) di Kubernetes tramite l'API.

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

Ora diamo un'occhiata a una serie di consigli e tecniche specifiche che possono migliorare l'efficienza nell'uso di kubectl.

1. Accelerare l'input tramite l'autocompletamento dei comandi

Uno dei trucchi più utili, ma spesso trascurati, per migliorare l'efficienza con kubectl è l'autocompletamento dei comandi.

L'autocompletamento dei comandi consente di completare automaticamente parti delle comandi di kubectl premendo il tasto Tab. Funziona per sottocomandi, opzioni e argomenti, inclusi quelli complessi come i nomi delle risorse.

Guarda come funziona l'autocompletamento dei comandi di kubectl:

Come utilizzare meglio kubectl: guida dettagliata
L'autocompletamento dei comandi funziona per le shell Bash e Zsh.

La guida ufficiale contiene istruzioni dettagliate su come configurare l'autocompletamento, ma di seguito faremo un breve riassunto.

Come funziona l'autocompletamento dei comandi

L'autocompletamento dei comandi è una funzionalità della shell che funziona tramite uno script di completamento. Lo script di completamento è uno script di shell che definisce il comportamento del completamento per un comando specifico.

Kubectl genera automaticamente e produce script di completamento per Bash e Zsh tramite i seguenti comandi:

$ kubectl completion bash

O:

$ kubectl completion zsh

Teoricamente, basta connettere l'output di questi comandi alla shell appropriata affinché kubectl possa completare i comandi.

In pratica, il metodo di connessione differisce 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 se il pacchetto è stato installato correttamente con il seguente comando:

$ type _init_completion

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

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

Se è necessario aggiungere questa riga al file ~ / .bashrc o meno, dipende dal gestore di pacchetti che hai usato per installare bash-completion. Per APT è necessario, per YUM no.

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

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

source <(kubectl completion bash)

Un altro modo è aggiungere lo script di completamento kubectl nella directory /etc/bash_completion.d (crea la directory 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 ugualmente valide.

Dopo aver riavviato la shell, il completamento automatico dei comandi kubectl funzionerà.

Bash su MacOS

Su MacOS, la configurazione è leggermente più complessa. Il motivo è che di default su MacOS è installata la versione 3.2 di Bash, mentre lo script di completamento automatico kubectl richiede una versione di Bash non inferiore alla 4.1 e non funziona in Bash 3.2.

L'uso di una versione obsoleta di Bash su MacOS è legato a questioni di licenza. La versione 4 di Bash è distribuita sotto la licenza GPLv3, che 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, per evitare problemi futuri. 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 all'inizio devi installarlo.

Puoi installare bash-completion tramite Homebrew:

$ brew install bash-completion@2

Qui @2 indica bash-completion versione 2. L'autocompletamento di kubectl richiede bash-completion v2, e bash-completion v2 richiede una versione di Bash almeno 4.1.

Output del comando brew-install contiene una sezione Caveats, nella quale è indicato che va aggiunto al 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 in ~/.bashrc. In questo caso, l'autocompletamento sarà accessibile non solo nel terminale principale, ma anche nelle shell figlie.

Dopo aver riavviato la shell, puoi verificare la correttezza dell'installazione utilizzando il seguente comando:

$ type _init_completion

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

Ora è necessario fare in modo che l'autocompletamento di kubectl sia abilitato in tutte le sessioni.

Un modo è aggiungere la seguente riga al tuo ~/.bashrc:

source <(kubectl completion bash)

Il secondo modo è aggiungere lo script di autocompletamento nella cartella /usr/local/etc/bash_completion.d:

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

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

Se hai installato kubectl tramite Homebrew, non è necessario eseguire il passo precedente, poiché lo script di autocompletamento sarà automaticamente collocato 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.

Alla fine, tutte queste opzioni sono equivalenti.

Zsh

Gli script di autocompletamento per Zsh non richiedono dipendenze. Tutto ciò che serve è abilitarli al caricamento della shell.

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

source <(kubectl completion zsh)

Se hai ricevuto un errore not found: compdef dopo il riavvio della tua shell, è necessario abilitare la funzione incorporata compdef. Può essere abilitata aggiungendo all'inizio del tuo file ~/.zshrc quanto segue:

autoload -Uz compinit
compinit

2. Visualizzazione rapida delle specifiche delle risorse

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

Tuttavia, è scomodo passare al browser web ogni volta che è necessario cercare qualcosa. Pertanto, kubectl fornisce il comando kubectl explain, che mostra le specifiche di tutte le risorse direttamente nel tuo terminale.

Il formato del comando è il seguente:

$ kubectl explain resource[.field]...

Il comando mostrerà la specifica della risorsa o del campo richiesto. Le informazioni visualizzate sono identiche a quelle contenute nella guida API.

Per impostazione predefinita kubectl explain mostra solo il primo livello di annidamento dei campi.

Guarda come si presenta qui.

È possibile visualizzare l'intero albero se si aggiunge l'opzione --recursive:

$ kubectl explain deployment.spec --recursive

Se non sai esattamente quali risorse ti servono, puoi visualizzarle tutte con il seguente comando:

$ kubectl api-resources

Questo comando visualizza i nomi delle risorse al plurale, ad esempio, deployments anziché deployment. Mostra anche un nome abbreviato, ad esempio deploy, per le risorse che lo hanno. Non preoccuparti di queste differenze. Tutte queste varianti di nome sono equivalenti per kubectl. Quindi puoi utilizzare qualsiasi di esse per kubectl explain.

Tutti i seguenti comandi sono equivalenti:

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

3. Usa un formato di output personalizzato per le colonne

Per impostazione predefinita, il formato di output del comando kubectl get:

$ kubectl get pods
NOME                     PRONTO    STATO    RIAVVII  ETÀ
engine-544b6b6467-22qr6   1/1     In esecuzione     0       78d
engine-544b6b6467-lw5t8   1/1     In esecuzione     0       78d
engine-544b6b6467-tvgmg   1/1     In esecuzione     0       78d
web-ui-6db964458-8pdw4    1/1     In esecuzione     0       78d

Questo formato è utile, ma contiene un numero limitato di informazioni. Rispetto al formato completo della risorsa, qui vengono visualizzati solo pochi campi.

In questo caso, puoi utilizzare un formato di output personalizzato per le colonne. Ti consente di definire quali dati visualizzare. Puoi visualizzare qualsiasi campo della risorsa in una colonna separata.

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

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

Puoi definire ogni colonna di output con la coppia

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

Diamo un'occhiata a un semplice esempio:

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

NOME
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 campo metadati nella descrizione della risorsa pod. Puoi trovare maggiori dettagli nella guida API oppure digitare il comando kubectl explain pod.metadata.name.

Ora supponiamo che tu voglia aggiungere una colonna aggiuntiva all'output, mostrando ad esempio il nodo su cui sta girando ogni pod. Per fare questo, puoi semplicemente aggiungere la relativa specifica della colonna nell'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 un pod è assegnato a un nodo, il suo nome viene registrato nel campo spec.nodeName della specifica delle risorse del pod. Maggiori dettagli possono essere trovati nell'output di kubectl explain pod.spec.nodeName.

Tieni presente che i campi delle risorse di Kubernetes sono sensibili al case.

Puoi visualizzare qualsiasi campo di risorsa come colonna. Basta esaminare la specifica della risorsa e provare con qualsiasi campo che ti piace.

Ma prima di tutto, diamo un'occhiata più da vicino alle espressioni di selezione dei campi.

Espressioni JSONPath

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

JSONPath è un linguaggio per estrarre dati da documenti JSON. Selezionare un campo è il caso d'uso più semplice di JSONPath. Ha molte più funzionalità, inclusi selettori, filtri e così via.

Kubectl explain supporta un numero limitato di funzionalità di JSONPath. Di seguito sono riportate le funzionalità e alcuni 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'

L'operatore [] ha un significato speciale. Molti campi delle risorse di Kubernetes sono elenchi, e questo operatore consente di selezionare gli elementi di questi elenchi. Viene spesso utilizzato con il carattere jolly come [*] per selezionare tutti gli elementi dell'elenco.

Esempi di applicazione

Le possibilità di utilizzare un formato di output delle colonne personalizzato sono illimitate, poiché puoi visualizzare qualsiasi campo o combinazione di campi delle risorse nell'output. Ecco alcuni esempi di applicazioni, ma non esitare a esplorarle da solo e trovare applicazioni utili per te.

  1. Visualizzazione delle immagini dei container 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 container per ciascun pod.

    Ricordate che un pod può contenere più contenitori, quindi i nomi delle immagini verranno visualizzati su una sola 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. Mostra la zona di disponibilità per ogni nodo.

    Una zona di disponibilità è un concetto cloud che limita la zona di replica a una regione geografica.

    Le zone di disponibilità per ogni nodo vengono ottenute tramite un'etichetta speciale — topology.kubernetes.io/zone. Se il cluster è in esecuzione in un cloud pubblico, questa etichetta viene creata automaticamente e viene 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 guida API. Tuttavia, possono essere visualizzate (così come tutte le altre etichette) se richiedi informazioni sui nodi in formato YAML o JSON:

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

    Questo è un ottimo modo per saperne di più sulle risorse, oltre a studiare le specifiche delle risorse.

4. Passaggio semplice tra cluster e spazi dei nomi

Quando kubectl esegue una richiesta all'API di 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 i parametri di connessione a tutti questi cluster. Hai bisogno di un modo per indicare al comando kubectl con quale cluster esattamente stai lavorando.

All'interno di un 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 anche bisogno di un modo per indicare al comando kubectl con quale spazio dei nomi lavorare.

In questo capitolo parleremo di come funziona e di come ottenere prestazioni efficienti.

Si prega di notare che è possibile avere più file kubeconfig elencati nella variabile ambiente KUBECONFIG. In questo caso, tutti questi file verranno uniti in un'unica configurazione durante l'esecuzione. È inoltre possibile modificare il file kubeconfig predefinito eseguendo kubectl con l'opzione --kubeconfig. Guarda la documentazione ufficiale.

File kubeconfig

Diamo un'occhiata a cosa contiene il file kubeconfig:

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

  • Cluster — URL dell'API del server del cluster.
  • User — 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, puoi avere più contesti per cluster, diferentesi per utente o spazio dei nomi. Tuttavia, una configurazione con più contesti è abbastanza rara, quindi di solito esiste una corrispondenza biunivoca tra cluster e contesti.

In qualsiasi momento, uno dei contesti è attuale:

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

Di conseguenza, per passare a un altro cluster, è necessario cambiare il contesto attuale nel file kubeconfig:

Come utilizzare meglio kubectl: 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 meglio kubectl: guida dettagliata
Nell'esempio sopra, kubectl utilizzerà lo spazio dei nomi Prod del cluster Fox (precedentemente era stato impostato lo spazio dei nomi Test).

Si prega di notare che kubectl fornisce anche opzioni --cluster, --user, --namespace e --context, che consentono di sovrascrivere singoli elementi e il contesto attuale, indipendentemente da ciò che è impostato nel file kubeconfig. Guarda opzioni kubectl.

Teoricamente, puoi modificare manualmente le opzioni nel file kubeconfig. Ma non è pratico. Per semplificare queste operazioni, esistono diverse utilità che permettono di modificare le opzioni in modo automatico.

Usa kubectx

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

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

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

Ecco un esempio di esecuzione di questi comandi:

Come utilizzare meglio kubectl: 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 il completamento automatico dei nomi dei contesti e degli spazi dei nomi, permettendo di non doverli digitare completamente. Istruzioni per configurare il completamento automatico qui.

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

Utilizzo degli alias della shell

Non hai bisogno di strumenti separati per cambiare il contesto attuale e lo spazio dei nomi, perché kubectl fornisce anche comandi per farlo. Così, il comando kubectl config fornisce sottocomandi per modificare i file kubeconfig.

Ecco alcuni di essi:

  • kubectl config get-contexts: restituisce tutti i contesti;
  • kubectl config current-context: ottiene 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 comodo, perché sono lunghi. Puoi creare alias della shell per eseguirli facilmente.

Ho creato un insieme di alias basati su questi comandi, che forniscono funzionalità simili a kubectx. Qui puoi vedere il loro funzionamento:

Come utilizzare meglio kubectl: guida dettagliata
Nota che gli alias usano fzf per fornire un'interfaccia interattiva di ricerca libera (come nella modalità interattiva di 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 riportate nel tuo file ~/.bashrc o ~/.zshrc e ricaricare il tuo shell.

Utilizzo dei plugin

Kubectl consente di caricare plugin che vengono eseguiti proprio come i comandi principali. È possibile, ad esempio, installare il plugin kubectl-foo e lanciarlo eseguendo il comando kubectl foo.

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

Ho scritto due plugin che fanno questo:

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

Ecco come funzionano:

Come utilizzare meglio kubectl: guida dettagliata
Nota che i plugin utilizzano fzf per fornire un'interfaccia interattiva di ricerca libera (come in modalità interattiva kubectx). Questo significa che devi installare fzf, per utilizzare questi alias.

Per installare i plugin, devi scaricare gli script della shell con i nomi kubectl-ctx e kubectl-ns in una qualsiasi directory nella tua variabile PATH e renderli eseguibili, ad esempio usando chmod +x. Subito dopo, potrai utilizzare kubectl ctx e kubectl ns.

5. Riduzione dell'immissione con alias automatici

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

Potresti chiederti come ricordare 800 alias? Ma non è necessario ricordarli tutti, poiché sono costruiti secondo uno schema semplice che è riportato qui sotto:

Come utilizzare meglio kubectl: 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 designa un elemento specifico del comando kubectl. Ogni alias può avere un componente per il comando di base, l'operazione e la risorsa, e diversi componenti per i parametri. Basta "riempire" questi componenti da sinistra a destra secondo lo schema sopra riportato.

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.

Puoi anche non utilizzare tutti i componenti come alias. Ad esempio k, kg, klo, ksys, kgpo possono essere utilizzati. Inoltre, nella riga di comando puoi combinare alias e comandi o opzioni normali:

Ad esempio:

  1. Invece di kubectl proxy può essere scritto come k proxy.
  2. Invece di kubectl get roles può essere scritto come kg roles (attualmente non esiste un alias per la risorsa Roles).
  3. Per ottenere i dati su un pod specifico, puoi utilizzare 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 usi l'alias, apparirà come kgpol app=ui.

Poiché parte degli alias richiede argomenti, gli alias a, f e l devono essere usati come ultimi.

In generale, una volta che padroneggi questo schema, sarai in grado di ricavare intuitivamente alias dai comandi che desideri eseguire, risparmiando così 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

Completamento automatico

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

$ kgpooyaml test-pod-d4b77b989

Se usi il completamento automatico del comando kubectl, probabilmente hai utilizzato il completamento automatico per cose come i nomi delle risorse. Ma è possibile farlo quando si usano gli alias?

Questo è un punto molto importante, perché se il completamento automatico non funziona, perderai parte dei benefici degli alias.

La risposta dipende dalla shell che usi:

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

Attivazione del completamento automatico per gli alias in Bash

Il problema con Bash è che cerca di completare (ogni volta che premi Tab) l'alias, anziché il comando a cui si riferisce l'alias (come fa 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 collega al meccanismo di completamento per gli alias, completando internamente l'alias nel comando e restituendo le opzioni di completamento per il comando completato. Ciò significa che il completamento per l'alias si comporta esattamente come per il comando completo.

In seguito spiegherò prima 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. Pertanto, prima di installare complete-alias, è necessario assicurarsi che bash-completion sia installato. Le istruzioni per l'installazione sono state fornite in precedenza per Linux e MacOS.

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

Devi scaricare lo script bash_completion.sh da dal repository di GitHub e includerlo nel tuo file ~/.bashrc:

source ~/bash_completion.sh

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

Attivazione del completamento automatico per gli alias di kubectl

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

Per associare la funzione a un determinato alias, devi utilizzare il meccanismo incorporato di Bash complete, per impostare _complete_alias come funzione di completamento dell'alias.

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

$ complete -F _complete_alias k

Il risultato di ciò è che ogni volta che esegui il completamento automatico per 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

Allo stesso modo, come nel precedente esempio, quando esegui il completamento automatico per kg, ottieni gli stessi suggerimenti di completamento che avresti ottenuto per kubectl get.

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

Pertanto, per attivare il completamento automatico per tutti gli alias di kubectl, devi eseguire il comando sopra menzionato per ciascuno 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 e il completamento automatico per tutti gli 800 alias di kubectl sarà disponibile.

6. Estensione di kubectl tramite plugin

versione 12.0 Nella versione 1.12, kubectl supporta un meccanismo di plugin, che consente di estendere le sue funzioni con comandi aggiuntivi.

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

In questo capitolo parleremo di come installare i plugin, dove trovarli e come crearne di propri.

Installazione dei plugin

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

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

Per installare un plugin, devi copiare il file kubectl-x in una qualsiasi directory nella tua variabile PATH e renderlo eseguibile, ad esempio utilizzando chmod +x. Subito dopo puoi richiamare il plugin usando kubectl x.

Puoi utilizzare il seguente comando per visualizzare l'elenco di tutti i plugin attualmente installati nel tuo sistema:

$ kubectl plugin list

Questo comando mostrerà anche avvisi se hai più plugin con lo stesso nome o se c'è un file di plugin che non è eseguibile.

Cerca e installa plugin usando Krew

I plugin kubectl sono adatti per condivisione o riutilizzo proprio come i pacchetti software. Ma dove puoi trovare i plugin condivisi da altri?

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

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

Ciò significa che l'installazione di Krew funziona essenzialmente come l'installazione di qualsiasi altro plugin kubectl. Puoi trovare istruzioni dettagliate sulla 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 di plugin tramite Krew non interferisce con l'installazione di plugin nel modo standard descritto sopra.

Nota che il comando kubectl krew list mostra solo i plugin che sono stati installati tramite Krew, mentre il comando kubectl plugin list elenca tutti i plugin, ovvero quelli installati tramite Krew e quelli installati in altri modi.

Cerca plugin in altri posti

Krew è un progetto giovane, attualmente nella sua lista ci sono circa 30 plugin. Se non riesci a trovare ciò che ti serve, puoi cercare plugin in altri luoghi, ad esempio su GitHub.

Ti consiglio di guardare la sezione GitHub kubectl-plugins. Lì troverai diverse decine di plugin disponibili che vale la pena esplorare.

Scrittura di plugin personalizzati

Puoi creare plugin — non è difficile. Devi creare un file eseguibile che faccia quello che serve, chiamarlo come kubectl-x e installarlo come descritto sopra.

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

Creiamo un esempio di plugin proprio ora. Nella sezione precedente hai usato il comando kubectl per stampare l'elenco dei container per ogni pod. Puoi facilmente trasformare questo comando in un plugin che puoi chiamare, per esempio, usando kubectl img.

Crea un file kubectl-img del 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 qualsiasi directory presente nel tuo PATH. Subito dopo puoi utilizzare il plugin kubectl img.

Come già menzionato, i plugin kubectl possono essere scritti in qualsiasi linguaggio di programmazione o script. Se utilizzi script della shell, hai il vantaggio di poter chiamare facilmente kubectl dal plugin. Tuttavia, puoi scrivere plugin più complessi in linguaggi di programmazione reali, utilizzando la libreria client di Kubernetes. Se utilizzi Go, puoi anche usare 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 per altri, non esitare a condividerli su GitHub. Assicurati di aggiungerli nel tema kubectl-plugins.

Puoi anche richiedere di aggiungere il tuo plugin nella 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. Quindi, è possibile che questa funzione venga implementata in futuro.

Buona fortuna!!!

Cosa leggere ancora sull'argomento:

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

Fonte: habr.com

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