Kubernetes ha fatto molta strada dal suo rilascio iniziale nel 2014, iniziando con risorse integrate come Pod, Servizi, Deployments e Replication Controllers. Quando gli sviluppatori hanno iniziato a costruire applicazioni più complesse, hanno avuto bisogno di risorse che andassero oltre quelle inizialmente fornite da Kubernetes. Avevano bisogno di funzionalità come workflow personalizzati, configurazioni avanzate e supporto per componenti infrastrutturali non standard. Le risorse integrate (ad esempio, Pods, Servizi) funzionavano bene per le distribuzioni standard, ma non avevano la flessibilità necessaria per gestire questi requisiti unici. Ciò ha creato la necessità di soluzioni più adattabili
Di conseguenza, le risorse di terze parti (TPR) sono state introdotte nel 2016 con Kubernetes 1.2 come tentativo di offrire flessibilità alle risorse esterne. Tuttavia, le TPR sono risultate insufficienti in termini di convalida dei dati, funzionalità e prestazioni, portando all’introduzione delle Custom Resource Definitions (CRD) nel 2017 con Kubernetes 1.7.
In questo articolo tratteremo i motivi per cui gli sviluppatori ci tengono a migliorare Kubernetes con le Custom Resource Definitions (CRD) e di quali tipi di sfide o workflow le CRD possono affrontare che le risorse integrate non possono.
Alla fine di questo articolo, capirete la funzione critica che le CRD svolgono in Kubernetes e perché sono diventate uno strumento essenziale per gli sviluppatori che vogliono costruire processi complessi e flessibili in Kubernetes.
Cos’è una Custom Resource Definition (CRD)?
Proprio come le modalità di guida programmabili nelle auto moderne consentono agli automobilisti di personalizzare la propria esperienza regolando elementi come la posizione del sedile o la sensibilità dello sterzo, le CRD sono una potente funzionalità che consente agli utenti di Kubernetes di estendere la piattaforma con risorse personalizzate in base alle proprie esigenze specifiche.
A differenza dei TPR, le CRD offrono funzionalità avanzate, tra cui il versioning delle API, la perfetta integrazione con i controller personalizzati e la scalabilità, che li rendono user privilegiati nell’ecosistema Kubernetes. Sebbene le CRD non abbiano trasformato Kubernetes da soli, hanno contribuito in modo significativo alla sua adattabilità, dando agli sviluppatori la possibilità di creare risorse specifiche per le esigenze delle loro applicazioni.
Le CRD consentono agli sviluppatori di modellare risorse non standard in Kubernetes, dando loro la flessibilità di gestire qualsiasi cosa, da database e backup a workflow complessi e componenti infrastrutturali personalizzati. Con l’aiuto delle CRD, Kubernetes si trasforma da semplice strumento per l’orchestrazione dei container in una piattaforma altamente flessibile in grado di gestire quasi tutte le infrastrutture o applicazioni.
Le CRD possono essere abbinati a controller personalizzati, che utilizzano risorse appena definite per automatizzare attività complesse. Questa collaborazione consente agli sviluppatori di gestire applicazioni o infrastrutture in modo dichiarativo, proprio come Kubernetes fa già per le sue risorse principali.
In definitiva, le CRD consentono a Kubernetes di diventare un sistema espandibile che può essere rimodellato per soddisfare requisiti specifici. Gli sviluppatori possono specificare le loro risorse, creare oggetti personalizzati e far sì che Kubernetes li gestisca correttamente, riducendo l’onere di mantenere applicazioni varie e specializzate.
La sicurezza delle CRDs
Pur essendo incredibilmente potenti, le CRD comportano potenziali implicazioni per la sicurezza. Configurazioni improprie, dati non validati o accessi troppo permissivi possono aprire vulnerabilità nel cluster Kubernetes. Alcuni modi per evitare questi rischi sono:
- Applicare le policy RBAC per limitare chi può definire o gestire le CRD.
- Definire schemi di validazione forti per garantire che le risorse personalizzate aderiscano alle strutture previste.
- Proteggere i controllori personalizzati eseguendoli con permessi minimi e aggiornamenti regolari.
Per apprezzare appieno il potenziale delle CRD, è essenziale comprendere la relazione tra le API di Kubernetes e le differenze tra risorse native e personalizzate.
L’API di Kubernetes e risorse native vs risorse custom
L’API di Kubernetes è la sala macchine di Kubernetes. Gestisce il modo in cui le risorse, sia native che personalizzate, vengono create, definite e gestite. Espone le risorse di Kubernetes (come pod, servizi, ecc.) fornendo un’interfaccia RESTful che consente ai client di interagire con il suo server API tramite richieste HTTP.
Quindi, l’esecuzione di comandi come “kubectl get pods -n e-commerce” utilizza fondamentalmente il metodo HTTP “get” per estrarre informazioni da tutti i pod in quel namespace. Questo è utile perché utilizza gli URL basati sulle risorse Kubernetes per rappresentare le risorse Kubernetes.
Le risorse native di Kubernetes (come le distribuzioni e i pod) sono solitamente predefinite nell’API e hanno i loro schemi e controller. Ciò significa che le API hanno un modo per accedere e gestire queste risorse native.
Ogni risorsa nativa in Kubernetes ha una struttura definita che comprende quattro componenti critici utilizzati da Kubernetes per comprenderli, crearli e gestirli. Questi componenti sono:
- Metadata: Contiene informazioni sul nome della risorsa, sullo spazio dei nomi, sulle etichette e sulle annotazioni. I metadati consentono di fare riferimento alla risorsa e di scoprirla.
- ApiVersion: Specifica la versione dell’API Kubernetes da utilizzare per una particolare risorsa, per interpretarne al meglio lo schema e il comportamento.
- Kind: Definisce il tipo di risorsa gestita per aiutare Kubernetes a capire il suo ruolo e come i controller devono gestirla.
- Spec: Le specifiche definiscono aspetti come le configurazioni e i requisiti e forniscono a Kubernetes informazioni sullo stato desiderato della risorsa da gestire. Kubernetes può quindi utilizzare la sua API per monitorare quando la risorsa si discosta da questo stato.
È importante notare che Kubernetes ha una conoscenza incorporata di queste risorse native attraverso i suoi schemi e controller predefiniti per gestirle più facilmente. Lo svantaggio è che questi schemi e controller coprono solo alcune delle potenziali esigenze degli sviluppatori.
Per rispondere alla crescente complessità delle esigenze degli sviluppatori senza espandere l’API di Kubernetes, sono state introdotte le CRD. Le CRD consentono agli sviluppatori di definire i propri tipi di risorse, integrandoli perfettamente nell’ecosistema Kubernetes. Questa flessibilità consente alle risorse personalizzate di comportarsi come componenti nativi di Kubernetes.
Sebbene le risorse personalizzate funzionino in modo simile alle risorse native, presentano importanti distinzioni che influiscono sul modo in cui vengono utilizzate e gestite all’interno di Kubernetes. Esploriamo queste differenze tra risorse native e personalizzate.
Risorse native vs Risorse personalizzate
Sebbene le API di Kubernetes gestiscano entrambe, presentano differenze nella struttura, nel comportamento e nello scopo.