Una ConfigMap è una risorsa Kubernetes per inserire la configurazione nei tuoi container. Ti consentono di mantenere le impostazioni del tuo stack separatamente dal suo codice. Ecco come lavorare con ConfigMaps e fornirle 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 al di fuori dei tuoi Pod.
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 dovrebbe non essere utilizzato.
Le ConfigMaps non vengono archiviate in modo sicuro e i loro valori non sono crittografati. Non devono contenere dati sensibili o riservati che, se divulgati, potrebbero costituire un rischio per la sicurezza o la privacy.
Non inserire password, chiavi API o chiavi di crittografia in una ConfigMap:utilizza invece un segreto Kubernetes, poiché funzionano in modo simile a ConfigMaps ma con protezioni aggiuntive. I sistemi che necessitano di una connessione al database devono inserire il nome host in una ConfigMap e le credenziali in un segreto separato.
Le singole ConfigMap 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 vuoi rimanere con ConfigMaps, considera la possibilità di dividere la tua 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 _
caratteri (sottolineatura). Alcuni linguaggi di programmazione e framework 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 di una ConfigMap
ConfigMaps hanno manifesti YAML semplici. Ogni ConfigMap necessita di un name
nel formato Kubernetes standard e un data
campo contenente le tue coppie chiave-valore:
apiVersion: v1 kind: ConfigMap metadata: name: example-configmap data: database_host: "192.168.0.10" system_email: "[email protected]"
I data
il campo serve per specificare le chiavi con valori di stringa. Puoi usare binaryData
invece o anche data
per aggiungere valori binari con codifica base64. Le chiavi devono essere univoche in entrambi i data
e binaryData
.
Applica il manifest al tuo cluster utilizzando kubectl
o il tuo strumento preferito.
Collegamento di ConfigMaps e Pod
Un ConfigMap non fa nulla da solo. Hai aggiunto alcuni dati al tuo cluster; ora colleghiamolo a un Pod:
apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image: example-image:latest envFrom: - configMapRef: name: example-configmap
Il envFrom
campo richiama le variabili di ambiente definite da un'altra risorsa referenziata. In questo caso, un configMapRef
identifica la ConfigMap creata in precedenza. I contenitori del Pod verranno avviati con database_host
e system_email
variabili di ambiente definite.
Aggiunta selettivamente di variabili d'ambiente
envFrom
è utile quando vuoi consumare tutte le chiavi in ConfigMap e sei certo che non ci saranno conflitti con le altre variabili di ambiente del tuo Pod. In situazioni più controllate, usa un normale env
sezione, definire le singole chiavi ed estrarre il valore di ciascuna chiave da ConfigMap:
env: - name: DATABASE_HOST_IP valueFrom: configMapKeyRef: name: example-configmap key: database_host
Questo esempio mostra come avviare un Pod solo con il database_host
chiave da ConfigMap. La chiave viene anche rinominata prima dell'iniezione, quindi il Pod la riceverà come DATABASE_HOST_IP
.
Utilizzo di ConfigMaps con i volumi
ConfigMaps può essere montato come file all'interno dei Pod. 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: containers: - 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
Questo manifest Pod crea un volume chiamato app-config
. La configMap
campo precompilerà 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, puoi aggiornare i valori in qualsiasi momento modificando il tuo manifest e riapplicandolo al tuo 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 verificate 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 volumi o variabili di ambiente. Se devi forzare un aggiornamento della configurazione, modifica un'annotazione sul tuo Pod in modo che Kubernetes la ricrei.
Mappe di configurazione immutabili
ConfigMaps ha un immutable
opzionale campo che ne impedisce l'aggiornamento. Quando questo campo è impostato, non puoi aggiornare i dati di ConfigMap o rimuovere lo stato immutabile.
apiVersion: v1 kind: ConfigMap metadata: name: immutable-configmap data: foo: bar immutable: true
Questo può essere utile quando sei certo 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 in volumi.
Le password e le 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 di una ConfigMap.