Come utilizzare ConfigMaps per la configurazione di Kubernetes

0
417

Una ConfigMap è una risorsa Kubernetes per inserire la configurazione nei contenitori. Ti permettono di mantenere le impostazioni del tuo stack separatamente dal suo codice. Ecco come lavorare con ConfigMaps e fornirli ai tuoi Pod.

A cosa servono le ConfigMaps?

Le ConfigMaps sono progettate specificamente per incapsulare piccole quantità di dati di configurazione non sensibili. Sono un meccanismo per ottenere coppie chiave-valore arbitrarie nei tuoi pod. Sono comunemente usati per memorizzare l'indirizzo IP del server del database, l'indirizzo e-mail in uscita per la tua applicazione e altre impostazioni specifiche dell'applicazione che devi configurare all'esterno dei tuoi Pod.

La ConfigMap ti consente di gestire questi dati in una risorsa Kubernetes dedicata. I pod ricevono le coppie chiave-valore come variabili di ambiente o file in un volume montato.

Per cosa non usarli?

Ci sono alcune situazioni in cui una ConfigMap non dovrebbe essere usata.

Le ConfigMaps non sono archiviate in modo sicuro e i loro valori non hanno crittografia. Non devono contenere dati sensibili o riservati che potrebbero costituire un rischio per la sicurezza o la privacy se trapelati.

Pubblicità

Non inserire password, chiavi API o chiavi di crittografia in un ConfigMap – utilizzare invece un segreto Kubernetes, poiché funzionano in modo simile a ConfigMaps ma con protezioni aggiuntive. I sistemi che necessitano di una connessione al database dovrebbero inserire il nome host in una ConfigMap e le credenziali in un segreto separato.

Le singole ConfigMaps non possono superare 1 MB di dimensione. I sistemi che richiedono più chiavi di configurazione possono essere meglio serviti da un approccio alternativo come l'iniezione di file di configurazione generati manualmente tramite un volume.

Se si desidera attenersi a ConfigMap, considerare di suddividere la configurazione su più risorse ConfigMap. Questo approccio dovrebbe evitare il limite di 1 MB consentendoti di fornire a ciascuno dei tuoi Pod il set minimo di chiavi di configurazione di cui ha bisogno.

I valori di ConfigMap possono essere stringhe UTF-8 o dati binari codificati come stringa base64. I nomi delle chiavi possono contenere caratteri alfanumerici, . (punto), – (trattino) e _ (trattino basso). Alcuni linguaggi e framework di programmazione potrebbero avere una convenzione diversa per le variabili di configurazione, quindi assicurati di utilizzare un formato supportato sia da Kubernetes che dalla tua app.

Creazione una ConfigMap

Le ConfigMap hanno semplici manifest YAML. Ogni ConfigMap necessita di un nome nel formato standard Kubernetes e di un campo dati contenente le coppie chiave-valore:

apiVersion: v1 tipo: metadati ConfigMap: nome: esempio-configmap dati: database_host: "192.168.0.10" system_email: "k8s@example.com"

Il campo dati serve a specificare chiavi con valori stringa. È possibile utilizzare binaryData al posto o insieme ai dati per aggiungere valori binari con codifica base64. Le chiavi devono essere univoche sia per i dati che per i binaryData.

Annuncio

Applica il manifest al tuo cluster utilizzando kubectl o il tuo strumento preferito.

Collegamento di ConfigMaps e Pod

Una ConfigMap non fa nulla da sola. Hai aggiunto alcuni dati al tuo cluster; ora colleghiamolo a un Pod:

apiVersion: v1 kind: Pod metadata: name: example-pod spec: container: – name: example-container image: example-image:latest envFrom: – configMapRef : nome: esempio-configmap

Il campo envFrom richiama le variabili di ambiente definite da un'altra risorsa di riferimento. In questo caso, un configMapRef identifica la ConfigMap creata in precedenza. I contenitori del Pod verranno avviati con le variabili di ambiente database_host e system_email definite.

Aggiunta selettiva di variabili d'ambiente

envFrom è utile quando vuoi utilizzare ogni chiave in ConfigMap e sei certo che non ci saranno conflitti con le altre variabili di ambiente del tuo Pod. In situazioni più controllate, usa una normale sezione env, definisci singole chiavi e estrai il valore di ciascuna chiave dalla ConfigMap:

env: – nome: DATABASE_HOST_IP valoreDa: configMapKeyRef: nome: esempio-configmap chiave: database_host

Questo esempio mostra come un Pod può essere avviato con solo la chiave database_host da ConfigMap. La chiave viene anche rinominata prima dell'iniezione in modo che il Pod la riceva come DATABASE_HOST_IP.

Utilizzo di ConfigMaps con volumi

ConfigMaps può essere montato come file all'interno di Pods. Kubernetes crea un volume, inserisce il contenuto di ConfigMap come un insieme di file e monta il volume sul tuo Pod.

apiVersion: v1 kind: Pod metadata: name: example-pod spec: container: – name: example-container image: example-image:latest volumeMounts: – name: app-config mountPath: "/etc/config-data" readOnly: true volumes: – name: app-config configMap: name: example-configmap Advertisement

Questo manifest Pod crea un volume chiamato app-config. Il campo configMap prepopolerà il volume utilizzando i dati nella ConfigMap specificata.

Il Pod monta il volume su /etc/config-data. I tuoi contenitori possono leggere i file all'interno della directory per accedere ai tuoi valori di configurazione. Ogni chiave ConfigMap avrà il proprio file all'interno del punto di montaggio.

Aggiornamento dei valori di ConfigMap

Poiché ConfigMap è una risorsa API Kubernetes standard, può aggiornare i valori in qualsiasi momento modificando il manifest e riapplicandolo al cluster. Il modo in cui i nuovi valori raggiungono i tuoi Pod dipende dal meccanismo di iniezione che stai utilizzando.

Volumi montati

Le ConfigMaps montate nei pod tramite un volume verranno aggiornate da Kubernetes. Le modifiche a ConfigMaps vengono controllate periodicamente; quando viene rilevata una differenza, i file nel tuo volume verranno aggiornati, quindi il tuo Pod riceverà i nuovi dati. Il ritardo dipende dall'intervallo di sincronizzazione configurato per le istanze Kubelet sui tuoi nodi di lavoro.

Variabili d'ambiente

Non è possibile modificare le variabili di ambiente di un pod, quindi le modifiche a ConfigMap non raggiungeranno i pod esistenti che fanno riferimento a chiavi tramite questo meccanismo. Devi sostituire i tuoi pod per utilizzare i nuovi dati.

I pod appena creati riceveranno sempre i dati ConfigMap correnti, indipendentemente dal fatto che tu stia utilizzando i volumi o le variabili di ambiente. Se devi forzare un aggiornamento della configurazione, modifica un'annotazione sul tuo Pod in modo che Kubernetes lo ricrei.

Mappe di configurazione immutabili

Le ConfigMaps hanno un campo immutabile facoltativo che ne impedisce l'aggiornamento. Quando questo campo è impostato, non è possibile aggiornare i dati di ConfigMap o rimuovere lo stato immutabile.

apiVersion: v1 kind: ConfigMap metadata: name: immutable-configmap data: foo: bar immutable: true Advertisement

Questo può essere utile quando si è certi che i valori di configurazione non cambieranno mai. Migliora la sicurezza eliminando la possibilità di modifiche accidentali. Le prestazioni possono anche essere migliorate poiché Kubernetes non ha più bisogno di monitorare ConfigMap per propagare eventuali modifiche ai valori nei tuoi Pod.

Riepilogo

ConfigMaps dovrebbe essere il tuo punto di riferimento per fornire chiavi di configurazione non sensibili ai tuoi pod Kubernetes. Sono una risorsa API di prima classe che puoi utilizzare come variabili di ambiente o file montati nei volumi.

Password e altre credenziali appartengono a Secrets. Questi funzionano in modo molto simile a ConfigMaps e sono referenziati dai Pod allo stesso modo. Sostituisci configMapRef con secretRef per estrarre una chiave da un Secret denominato invece che da ConfigMap.