I 10 migliori trucchi e suggerimenti di Kubernetes

I 10 migliori trucchi e suggerimenti di Kubernetes

Su Internet è disponibile molta letteratura di riferimento, ma a volte il consiglio più semplice è quello più prezioso. Squadra Kubernetes aaS da Mail.ru tradotto una selezione di dieci trucchi e suggerimenti, che l'autore dell'articolo ha raccolto dopo un anno di lavoro con Kubernetes. I suggerimenti non sono ordinati per importanza, ma pensiamo che ognuno troverà qualcosa di utile per se stesso.

Il comando più semplice per lavorare con Kubernetes

Per cominciare, forse l'azione più semplice e utile nel lavorare con Kubernetes. Il seguente comando abilita il completamento del comando kubectl nella shell bash:

echo "source <(kubectl completion bash)" >> ~/.bashrc

Completamento automatico kubectl verrà scritto nel file .bashrc e verrà attivato automaticamente ogni volta che viene avviata la shell. Ciò accelera la digitazione di comandi e parametri lunghi come all-namespaces. Maggiori dettagli in Aiuto per Kubernetes Bash.

Limiti predefiniti di memoria e CPU in uno spazio dei nomi

Se l'applicazione è scritta in modo errato, ad esempio apre una nuova connessione al database ogni secondo ma non la chiude mai, significa che il cluster ha una perdita di memoria. E se per l'applicazione non è stato impostato un limite di memoria durante la distribuzione, ciò può causare un errore del nodo.

Per evitare ciò, Kubernetes ti consente di impostare restrizioni predefinite in base allo spazio dei nomi. Sono scritti nel file yaml per uno spazio dei nomi specifico. Ecco un esempio di tale file:

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

Crea tale yaml e applicalo a qualsiasi spazio dei nomi. Ad esempio, allo spazio dei nomi limit-example. Ora qualsiasi contenitore distribuito in questo spazio dei nomi avrà un limite di 512Mi, a meno che non venga impostato un altro limite individuale aggiuntivo per questo contenitore.

Garbage Collection nelle versioni precedenti di Kubernetes

Kubelet per impostazione predefinita avvia la garbage collection quando var/lib/docker occupa il 90% dello spazio disponibile su disco. Questo è fantastico, tuttavia, fino a Kubernetes 1.7 non esisteva alcun limite predefinito al numero di inode utilizzati, che corrispondono al numero di file nel file system.

Potenzialmente il tuo contenitore var/lib/docker potrebbe utilizzare solo il 50% dello spazio su disco, ma potrebbe esaurire gli inode, il che causerà problemi ai lavoratori.

Nelle versioni precedenti di kubelet dalla 1.4 alla 1.6 dovrai aggiungere questo flag:

--eviction-hard
=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%

Nelle versioni 1.7 e successive questo flag è impostato per impostazione predefinita. Tuttavia, le versioni precedenti non monitorano il limite di inode.

Minikube... piccolo ma potente Kubernetes locale

Minikube è il modo più semplice per eseguire un cluster Kubernetes locale. Si avvia con un semplice comando:

minikube start

L'esecuzione di questo comando risulta in un vero cluster Kubernetes in esecuzione sulla tua macchina.

I 10 migliori trucchi e suggerimenti di Kubernetes
Fonte dell'illustrazione

Il trucco sta nel creare l'applicazione ed eseguirla localmente su quel cluster. Se non diversamente indicato, l'immagine Docker verrà creata sul tuo computer e non sul cluster.

Per forzare Docker a inviare l'immagine al cluster Kubernetes locale, alla macchina docker viene fornito il seguente comando:

eval $(minikube docker-env)

Ora possiamo creare applicazioni su un cluster Kubernetes locale.

Non consentire l'accesso a kubectl a tutti

Questo sembra ovvio, ma se più team utilizzano lo stesso cluster per le loro applicazioni (che è lo scopo per cui Kubernetes è stato creato), non dovresti semplicemente dare a tutti kubectl. È meglio separare i comandi, assegnando a ciascuno di essi il proprio namespace e limitando l'accesso tramite policy RBAC.

Puoi confonderti assegnando diritti di accesso, lettura, creazione, eliminazione e altre operazioni per ciascun pod. Ma la cosa principale è limitare l'accesso ai segreti, consentendolo solo agli amministratori. In questo modo distingueremo tra coloro che possono amministrare il cluster e coloro che possono semplicemente distribuirlo.

Gestisci i budget dei pod

Come garantire l'assenza di tempi di inattività per un'applicazione in un cluster Kubernetes? PodDisruptionBudget e ancora PodDisruptionBudget.

I cluster vengono periodicamente aggiornati e i nodi vengono svuotati. Niente resta fermo, questa è la realtà. Ogni distribuzione con più di un'istanza deve includere un PDB (PodDisruptionBudget). Viene creato in un semplice file yaml applicato al cluster. L'area di copertura di un particolare PDB è determinata dai selettori di etichette.

Nota: Il bilancio del PPB viene preso in considerazione solo quando la violazione del bilancio è reversibile (interruzione volontaria). In situazioni come guasti hardware, PDB non funzionerà.

PDB di esempio:

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: app-a-pdb
spec:
  minAvailable: 2
  selector:
      matchLabels:
        app: app-a

I due parametri principali sono matchLabels и minAvailable. Il primo parametro specifica a quali applicazioni si applica il budget. Ad esempio, se ho distribuzioni con label app: app-a и app: app-b, il presente PDB si applicherà solo al primo.

Parametro minAvailable preso in considerazione durante lo svuotamento (pulizia) del nodo. Nel nostro esempio, durante lo svuotamento, tutte le istanze vengono eliminate app: app-a, tranne due.

Ciò consente di controllare quante istanze dell'applicazione devono essere in esecuzione in un dato momento.

Monitoraggio dello stato dell'applicazione

Tale monitoraggio è possibile in due modi: utilizzando i test di prontezza o di attività.

La prima sonda (readiness) determina la disponibilità del contenitore a ricevere traffico.

Il secondo (vivacità) mostra se il contenitore è integro o deve essere riavviato.

Le configurazioni rilevanti vengono semplicemente aggiunte allo yaml per la distribuzione. Qui puoi specificare i timeout, i tempi di ritardo e il numero di nuovi tentativi. Vedi maggiori dettagli su di loro Documentazione Kubernetes.

I tag sono ovunque

Le etichette sono uno dei concetti fondamentali in Kubernetes. Consentono agli oggetti di comunicare liberamente tra loro, nonché di creare query basate su etichette. In Kubernetes puoi persino andare al client e guardare gli eventi per tag specifici.

Puoi fare quasi tutto con i tag, ma un buon esempio potrebbe essere la creazione di più ambienti per eseguire programmi sullo stesso cluster.

Supponiamo che tu utilizzi lo stesso cluster per dev и qa. Ciò significa che puoi avere un'applicazione app-a, lavorando contemporaneamente in entrambi gli ambienti qa и dev. In questo caso possiamo accedere separatamente all'istanza dell'applicazione in un ambiente specifico specificando il parametro appropriato environment. Ad esempio, app: app-a и environment: dev per un ambiente e app: app-a и environment: qa per il secondo.

Ciò consente di accedere a entrambe le istanze dell'applicazione, ad esempio, per condurre test contemporaneamente.

Metti le cose in ordine

Kubernetes è un sistema molto potente, ma qualsiasi sistema alla fine può impantanarsi con troppi processi. Kubelet esegue tutti i processi e i controlli specificati, oltre ai propri.

Naturalmente, un servizio orfano non rallenterà il sistema e Kubernetes è progettato per scalare da zero. Ma se invece di un servizio ne compaiono un milione, il kubelet comincia a soffocare.

Se per qualche motivo elimini una distribuzione (contenitore, immagine, qualunque cosa), assicurati di eseguire una pulizia completa.

Incontra Go

Abbiamo tenuto i consigli principali per ultimi. Impara il linguaggio di programmazione Go.

Kubernetes è sviluppato in Go, tutte le estensioni sono scritte in Go e anche la libreria client client-go è ufficialmente supportata.

Può essere utilizzato per cose diverse e interessanti. Ad esempio, per espandere il sistema Kubernetes secondo i tuoi gusti. Pertanto, puoi utilizzare i tuoi programmi per raccogliere dati, distribuire applicazioni o semplicemente ripulire i contenitori.

Imparare il linguaggio di programmazione Go e padroneggiare client-go è forse il consiglio più importante che puoi dare ai nuovi utenti Kubernetes.

Tradotto con il supporto di Mail.ru Cloud Solutions

Cos'altro leggere:

  1. Tre livelli di scalabilità automatica in Kubernetes e come utilizzarli in modo efficace.
  2. Nodi di lavoro Kubernetes: molti piccoli o pochi grandi?
  3. 25 Strumenti utili per la distribuzione e la gestione di Kubernetes.

Fonte: habr.com

Aggiungi un commento