I 10 migliori trucchi e consigli su Kubernetes

I 10 migliori trucchi e consigli su Kubernetes

In rete ci sono molte risorse informative, ma a volte i consigli più semplici si rivelano i più preziosi. Il team Kubernetes aaS di Mail.ru ha tradotto una raccolta di dieci trucchi e suggerimenti, raccolti dall'autore dell'articolo dopo un anno di lavoro con Kubernetes. I consigli non sono ordinati per importanza, ma pensiamo che ognuno possa trovare qualcosa di utile per sé.

Il comando più semplice per lavorare con Kubernetes

Per cominciare, probabilmente l'azione più semplice e utile nel lavoro con Kubernetes è che il seguente comando abilita il completamento automatico dei comandi kubectl nella shell bash:

echo "source > ~/.ashrc

Il completamento automatico kubectl sarà registrato nel file .bashrc e si attiverà automaticamente ogni volta che si avvia la shell. Questo accelera la digitazione di comandi e parametri lunghi, come all-namespaces. Maggiori dettagli nel la documentazione di Kubernetes per bash.

I limiti predefiniti di memoria e CPU nello spazio dei nomi

Se un'applicazione è scritta in modo errato, ad esempio, apre una nuova connessione al database ogni secondo senza mai chiuderla, si verifica una perdita di memoria nel cluster. E se per l'applicazione non sono impostati limiti di memoria al momento del deploy, ciò potrebbe portare a un guasto del nodo.

Per prevenire ciò, Kubernetes consente di impostare limiti predefiniti per ogni spazio dei nomi. Questi vengono definiti in un file yaml per un determinato spazio dei nomi. 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 un file yaml di questo tipo e applicalo a qualsiasi spazio dei nomi. Ad esempio, allo spazio dei nomi limit-example. Ora, per qualsiasi contenitore distribuito in questo spazio dei nomi, si applicherà un limite di 512Mi, a meno che non venga impostato un altro limite individuale per quel contenitore.

Pulizia della spazzatura nelle vecchie versioni di Kubernetes

Kubelet inizia automaticamente la pulizia quando var/lib/docker occupa il 90% dello spazio disco disponibile. Questo è positivo, tuttavia, fino alla versione 1.7 di Kubernetes non c'era un limite predefinito sul numero di descrittori di indice inode (inodes) utilizzati, che corrispondono al numero di file nel file system.

Potenzialmente, il tuo contenitore var/lib/docker può utilizzare solo il 50% dello spazio disco, ma gli inode possono finire, causando problemi nel funzionamento dei worker.

Nelle vecchie versioni di kubelet dalla 1.4 alla 1.6 è necessario aggiungere il seguente flag:

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

Nella versione 1.7 e nelle versioni successive, questo flag è impostato di default. Tuttavia, le versioni precedenti non controllano il limite degli inode.

Minikube… piccolo ma potente Kubernetes locale

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

minikube start

Di conseguenza, eseguendo questo comando, avrai un vero cluster Kubernetes sul tuo computer.

I 10 migliori trucchi e consigli su Kubernetes
Fonte dell'illustrazione

Il trucco è come costruire un'applicazione e avviarla localmente in questo cluster. Se non vengono fornite indicazioni specifiche, l'immagine Docker verrà costruita sul tuo computer, e non nel cluster.

Per costringere Docker a inviare l'immagine al cluster Kubernetes locale, si usa il seguente comando:

eval $(minikube docker-env)

Ora possiamo costruire applicazioni sul cluster Kubernetes locale.

Non concedere l'accesso a kubectl a chiunque

Sembra ovvio, ma se più team utilizzano un unico cluster per le loro applicazioni (ed è questo il motivo per cui è stato creato Kubernetes), non è opportuno concedere l'accesso a tutti indiscriminatamente. kubectl. È meglio separare i team, assegnando a ciascuno il proprio spazio dei nomi e limitando l'accesso mediante politiche RBAC.

Si può complicare la situazione specificando per ogni pod i permessi di accesso, lettura, creazione, eliminazione e altre operazioni. Ma la cosa più importante è limitare l'accesso ai segreti, consentendolo solo agli amministratori. In questo modo distinguiamo tra chi può amministrare il cluster e chi può semplicemente essere distribuito al suo interno.

Gestisci i budget dei pod

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

I cluster vengono aggiornati periodicamente e i nodi vengono svuotati. Nulla rimane fermo, questa è la realtà. In ogni deployment con più di un'istanza è fondamentale includere il PDB (PodDisruptionBudget). Viene creato in un semplice file yaml, applicato al cluster. L'ambito di applicazione di un PDB specifico è determinato dai selettori di etichette.

Nota: Il budget del PDB viene considerato solo in caso di violazione del budget reversibile (voluntary disruption). In situazioni come guasti hardware, il PDB non entrerà in azione.

Esempio di PDB:

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

I due parametri principali sono matchLabels e minAvailable. Nel primo parametro si specifica per quali applicazioni si applica il budget. Ad esempio, se ho dei deploy con etichette app: app-a e app: app-b, questo PDB verrà applicato solo al primo.

Caratteristica minAvailable considerato durante lo svuotamento (pulizia) del nodo. Ad esempio, nel nostro caso, durante lo svuotamento vengono espulsi tutti gli istanze app: app-a, tranne due.

Questo consente di controllare quanti esemplari dell'applicazione devono essere in esecuzione in ogni momento.

Monitoraggio della salute dell'applicazione

Questo monitoraggio può essere effettuato in due modi: tramite probe Readiness o Liveness.

La prima probe (readiness) determina se il container è pronto a ricevere traffico.

La seconda (liveness) indica se il container è operativo o se deve essere riavviato.

Le relative configurazioni vengono semplicemente aggiunte nel file yaml per il deployment. Lì è possibile specificare timeout, tempi di attesa e numero di ripetizioni delle probe. Maggiori dettagli si trovano nella documentazione di Kubernetes.

Etichette ovunque

Le etichette sono uno dei concetti fondamentali in Kubernetes. Permettono agli oggetti di collegarsi liberamente tra loro e di effettuare richieste basate sulle etichette. In Kubernetes, è persino possibile accedere al client e monitorare gli eventi in base a etichette specifiche.

Con le etichette si può fare praticamente tutto, ma un buon esempio è la creazione di più ambienti per eseguire programmi in un unico cluster.

Supponiamo che tu stia utilizzando lo stesso cluster per dev e qa. Ciò significa che potresti avere un'applicazione app-a, che funziona simultaneamente in entrambi gli ambienti qa e dev. In questo caso, possiamo accedere separatamente all'istanza dell'applicazione in un ambiente specifico, specificando il parametro corrispondente environment. Ad esempio, app: app-a e environment: dev per un ambiente e app: app-a e environment: qa per l'altro.

Questo consente di accedere a entrambe le istanze dell'applicazione, ad esempio, per effettuare test in contemporanea.

Metti in ordine

Kubernetes è un sistema molto potente, ma qualsiasi sistema può finire per impantanarsi in un gran numero di processi. Kubelet avvia tutti i processi e i controlli che hai specificato, oltre ai propri.

Certo, un singolo servizio non rallenterà il sistema, e Kubernetes è progettato fin dall'inizio per la scalabilità. Ma se invece di un servizio ne appaiono un milione, kubelet inizia a faticare.

Se per qualche motivo elimini un deployment (container, immagine, qualsiasi cosa), assicurati solo di fare una pulizia completa.

Incontra Go

Il consiglio principale lo abbiamo riservato per ultimo. Studia il linguaggio di programmazione Go.

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

Può essere utilizzata per cose diverse e interessanti. Ad esempio, per estendere il sistema Kubernetes a proprio piacimento. Quindi, puoi usare programmi personalizzati per raccogliere dati, distribuire applicazioni o semplicemente pulire i container.

Studiare il linguaggio di programmazione Go e padroneggiare client-go è senza dubbio il consiglio più importante per i nuovi utenti di Kubernetes.

Tradotto con il supporto di Mail.ru Cloud Solutions

Cosa leggere ancora:

  1. Tre livelli di autoscaling in Kubernetes e come utilizzarli in modo efficace.
  2. Nodi di lavoro Kubernetes: tanti piccoli o pochi grandi?
  3. 25 strumenti utili per distribuire e gestire Kubernetes.

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