Introduzione
Kubernetes offre in modo nativo gli strumenti di base necessari per gestire la distribuzione delle applicazioni. Tuttavia, sebbene l'applicazione di manifesti YAML grezzi sia un processo semplice, lo sviluppo in un ambiente di microservizi va rapidamente fuori controllo con il numero di implementazioni necessarie per supportare un intero sistema.
Questo articolo mette a confronto due strumenti popolari che mirano a semplificare la gestione della distribuzione delle applicazioni:Helm e Kustomize.

Elmo:caratteristiche principali
Helm è un gestore di pacchetti per Kubernetes. Assiste nell'installazione e nella gestione delle applicazioni Kubernetes utilizzando grafici timone, pacchetti contenenti file YAML modificati utilizzando il linguaggio modello Go e funzioni modello dalla libreria Sprig.
Utilizzando i modelli e i valori dinamici, Helm offre la possibilità di mettere a punto una configurazione durante tutto il ciclo di vita dello sviluppo del software.
Con l'introduzione di Helm 3, Helm ha smesso di dipendere da Tiller per la generazione di file di configurazione dinamica. Ciò elimina uno dei principali problemi di sicurezza di Helm 2:le ampie autorizzazioni concesse per impostazione predefinita a tutti coloro che hanno accesso a Tiller. Helm ora include componenti di gestione degli accessi privilegiati con controllo degli accessi in base al ruolo (RBAC) e definizioni delle risorse personalizzate (CRD).
Un'altra proprietà utile dei modelli di Helm è l'incapsulamento. Le definizioni YAML degli oggetti Kubernetes, come Deployment, Service, ConfigMap o Kubernetes Secret, possono essere incapsulate in un unico modello. Questa proprietà è utile per la configurazione in fase di distribuzione.
Una semplice carta del timone è composta da:
- Un Chart.yaml file che dichiara il grafico.
- Un values.yaml file che contiene i parametri del grafico da utilizzare con i modelli.
- Una directory modello contenente file modello per la creazione del contenuto del grafico.

Un file modello ha la struttura di un file YAML, ma contiene anche variabili modello che vengono sostituite durante la distribuzione con i valori forniti in values.yaml file.
Questo è il contenuto di un tipico deployment.yaml assomiglia a:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.test }}
labels:
app: {{ .Values.test }}
spec:
selector:
matchLabels:
app: {{ .Values.test }}
template:
metadata:
labels:
app: {{ .Values.test }}
tier: web
spec:
containers:
- name: {{ .Values.test }}
image: {{ .Values.test }}
ports:
- containerPort: 8080
Nell'esempio sopra, Helm esamina values.yaml file per il valore del test
variabile. Il relativo values.yaml contiene la definizione della variabile:
test: default
Basato su values.yaml definizione, Helm compila il seguente deployment.yaml file:
apiVersion: apps/v1
kind: Deployment
metadata:
name: default
labels:
app: default
spec:
selector:
matchLabels:
app: default
template:
metadata:
labels:
app: default
tier: web
spec:
containers:
- name: default
image: default
ports:
- containerPort: 8080
Helm offre la possibilità di sovrascrivere i valori in values.yaml utilizzando il --set
flag quando si emettono comandi di compilazione nella CLI.
Include anche il helm lint
comando che esamina un grafico per problemi, verificando che sia stato progettato secondo gli standard.
Personalizza:caratteristiche principali
Kustomize è uno strumento che utilizza livelli e patch invece di modelli per personalizzare gli oggetti Kubernetes. Introduce il kustomization.yaml manifest, in cui gli utenti archiviano le configurazioni specifiche della distribuzione.
Lo strumento è integrato in kubectl a partire dalla versione 1.14, il che significa che ora è nativo in Kubernetes. Tuttavia, puoi anche installarlo in modo indipendente.
Con Kustomize gli utenti possono gestire un numero qualsiasi di configurazioni Kubernetes, ognuna con la propria personalizzazione distinta, utilizzando l'approccio dichiarativo. Consente agli sviluppatori di definire più versioni di un'applicazione e gestirle in sottodirectory. La directory di base contiene le configurazioni comuni, mentre le sottodirectory contengono le patch specifiche della versione.

Ogni directory contiene il suo kustomization.yaml file che specifica quali modifiche devono essere apportate alla configurazione e quali risorse devono essere utilizzate. Ad esempio, il seguente kustomization.yaml il file aggiunge un'etichetta comune app:test
a entrambi deployment.yaml e service.yaml nella directory di base:
commonLabels:
app: my-wordpress
resources:
- deployment.yaml
- service.yaml
Le modifiche vengono quindi applicate digitando il seguente comando nella riga di comando:
kubectl apply -k base
Il comando è diverso se Kustomize viene utilizzato come strumento autonomo:
kustomize build base | kubectl apply -f -
Elmo e Kubernetes:pro e contro
Pro
- Helm offre molte funzionalità che vanno oltre la semplice gestione della configurazione della distribuzione delle app, come pacchetti, hook e rollback.
- Semplifica l'installazione dell'app consentendo agli utenti di impostare valori predefiniti che possono ulteriormente configurare con i valori, se necessario.
- Helm è ben noto agli sviluppatori, ha molti utenti e un ottimo supporto online.
- Le funzioni del modello Helm consentono di introdurre condizionali e loop, definire helper e accedere alla libreria delle funzioni Sprig.
- Le applicazioni più comunemente utilizzate hanno i grafici Helm disponibili online, il che consente di risparmiare tempo e aumentare la produttività.
Contro
- Helm aggiunge più livelli di astrazione e ha una curva di apprendimento ripida.
- Limita la personalizzazione delle applicazioni alle opzioni di configurazione preesistenti.
- I modelli sono soggetti a errori, soprattutto in termini di corretto allineamento di YAML.
- Helm non è supportato in modo nativo in Kubernetes, il che crea una dipendenza esterna.
- Spesso è imperativo. Helm inserisce valori nei modelli in fase di esecuzione, quindi se il modello cambia, il sistema potrebbe divergere da ciò che l'utente si aspetta.
- I grafici richiedono ancora personalizzazioni di runtime, il che li rende difficili da gestire durante l'implementazione della pipeline CI/CD.
- I modelli meno leggibili portano inevitabilmente a una minore personalizzazione nel tempo.
- Soffre di problemi di sicurezza derivanti dalla mancanza di visibilità e trasparenza durante l'installazione delle app.
Personalizza e Kubernetes:pro e contro
Pro
- Kustomize è semplice da usare.
- È dichiarativo, in linea con la filosofia Kubernetes.
- Kustomize supporta un modello a base ereditaria, che lo rende scalabile meglio di Helm.
- L'utilizzo della versione nativa integrata in kubectl elimina le dipendenze esterne.
- Semplifica l'utilizzo di app standard.
- Utilizza solo semplici file YAML.
Contro
- Kustomize non offre molte funzionalità.
- Non è progettato per seguire il principio DRY (Don't Repeat Yourself).
- Gli utenti devono dichiarare manualmente risorse e patch in kustomization.yaml e il file deve essere aggiornato manualmente ogni volta che viene aggiunto un nuovo file.
- La versione nativa incorporata in kubectl è molto più vecchia dell'attuale versione standalone.
- È difficile trovare supporto online per Kustomize.
Kustomize vs Helm:tabella di confronto
Funzione | Timone | Personalizza |
---|---|---|
Modellazione | Sì | No |
Sovrapposizioni | No | Sì |
Imballaggio | Sì | No |
Ganci di convalida | Sì | No |
Rollback | Sì | No |
Integrazione nativa di K8 | No | Sì |
Natura dichiarativa | Per lo più imperativo | Sì |
Visibilità e trasparenza | Debole | Forte |
Come scegliere?
Per decidere se optare per Helm o Kustomize, considera quanto segue:
- Scegli Kustomize se hai intenzione di scrivere tutte le configurazioni da solo e possiedi una buona comprensione di come funziona YAML. Sebbene Kustomize ti consenta di eseguire rapidamente personalizzazioni complicate, richiede che tu sia in grado di visualizzare come le patch e i livelli si adattano.
- D'altra parte, se vuoi che i tuoi sviluppatori siano in grado di aggiungere nuove app e servizi in modo semplice e sicuro, la creazione di grafici Helm è una soluzione migliore.
- Un altro motivo per scegliere Helm è la necessità di ridurre la quantità di tempo che dedichi ai file YAML. I modelli Helm hanno argomenti che semplificano la comprensione del funzionamento dei servizi senza approfondire YAML.
Dato che sia Helm che Kustomize offrono vantaggi specifici per gli strumenti e si completano a vicenda, la migliore linea d'azione sarebbe quella di utilizzare i due strumenti fianco a fianco. Helm è particolarmente utile per creare pacchetti, condividere e installare app ben definite, mentre Kustomize funziona meglio per le modifiche dell'ultimo minuto delle app Kubernetes esistenti.