ConfigMaps
La ConfigMap è un oggetto API usato per memorizzare dati non riservati in coppie chiave-valore. I Pods possono utilizzare le ConfigMaps come variabili d'ambiente, argomenti da riga di comando, o come files di configurazione all'interno di un Volume.
La ConfigMap ti permette di disaccoppiare le configurazioni specifiche per ambiente dalle immagini del container, cosicchè le tue applicazioni siano facilmente portabili.
Utilizzo
Usa una ConfigMap per tenere separati i dati di configurazione dal codice applicativo.
Per esempio, immagina che stai sviluppando un'applicazione che puoi eseguire sul tuo computer (per lo sviluppo) e sul cloud (per gestire il traffico reale). Puoi scrivere il codice puntando a una variabile d'ambiente chiamata DATABASE_HOST
. Localmente, puoi settare quella variabile a localhost
. Nel cloud, la puoi settare referenziando il Service di Kubernetes che espone la componente del database sul tuo cluster. Ciò ti permette di andare a recuperare l'immagine del container eseguita nel cloud e fare il debug dello stesso codice localmente se necessario.
La ConfigMap non è pensata per sostenere una gran mole di dati. I dati memorizzati su una ConfigMap non possono superare 1 MiB. Se hai bisogno di memorizzare delle configurazioni che superano questo limite, puoi considerare di montare un volume oppure usare un database o un file service separato.
Oggetto ConfigMap
La ConfigMap è un oggetto API che ti permette di salvare configurazioni per poi poter essere riutilizzate da altri oggetti. A differenza di molti oggetti di Kubernetes che hanno una spec
, la ConfigMap ha i campi data
e binaryData
. Questi campi accettano le coppie chiave-valore come valori. Entrambi i campi data
e binaryData
sono opzionali. Il campo data
è pensato per contenere le stringhe UTF-8 mentre il campo binaryData
è pensato per contenere dati binari come le stringhe codificate in base64.
Il nome di una ConfigMap deve essere un nome valido per un sottodominio DNS.
Ogni chiave sotto il campo data
o binaryData
deve consistere di caratteri alfanumerici, -
, _
o .
. Le chiavi salvate sotto data
non devono coincidere con le chiavi nel campo binaryData
.
Partendo dalla versione 1.19, puoi aggiungere il campo immutable
alla definizione di ConfigMap per creare una ConfigMap immutabile.
ConfigMaps e Pods
Puoi scrivere una spec
del Pod che si riferisce a una ConfigMap e configurare il o i containers
in quel Pod sulla base dei dati presenti nella ConfigMap. Il Pod e la ConfigMap devono essere nello
stesso Namespace.
spec
di un Pod statico non può riferirsi a una ConfigMap
o ad altri oggetti API.
Questo è un esempio di una ConfigMap che ha alcune chiavi con valori semplici, e altre chiavi dove il valore ha il formato di un frammento di configurazione.
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
# chiavi simili a proprietà; ogni chiave mappa un valore semplice
player_initial_lives: "3"
ui_properties_file_name: "user-interface.properties"
# chiavi simili a files
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
Ci sono quattro modi differenti con cui puoi usare una ConfigMap per configurare un container all'interno di un Pod:
- Argomento da riga di comando come entrypoint di un container
- Variabile d'ambiente di un container
- Aggiungere un file in un volume di sola lettura, per fare in modo che l'applicazione lo legga
- Scrivere il codice da eseguire all'interno del Pod che utilizza l'API di Kubernetes per leggere la ConfigMap
Questi metodologie differenti permettono di utilizzare diversi metodi per modellare i dati che saranno consumati. Per i primi tre metodi, il kubelet utilizza i dati della ConfigMap quando lancia il container (o più) in un Pod.
Per il quarto metodo dovrai scrivere il codice per leggere la ConfigMap e i suoi dati. Comunque, poiché stai utilizzando l'API di Kubernetes direttamente, la tua applicazione può sottoscriversi per ottenere aggiornamenti ogniqualvolta la ConfigMap cambia, e reagire quando ciò accade. Accedendo direttamente all'API di Kubernetes, questa tecnica ti permette anche di accedere a una ConfigMap in namespace differenti.
Ecco un esempio di Pod che usa i valori da game-demo
per configurare il container:
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
command: ["sleep", "3600"]
env:
# Definire la variabile d'ambiente
- name: PLAYER_INITIAL_LIVES # Notare che il case qui è differente
# dal nome della key nella ConfigMap.
valueFrom:
configMapKeyRef:
name: game-demo # La ConfigMap da cui proviene il valore.
key: player_initial_lives # La chiave da recuperare.
- name: UI_PROPERTIES_FILE_NAME
valueFrom:
configMapKeyRef:
name: game-demo
key: ui_properties_file_name
volumeMounts:
- name: config
mountPath: "/config"
readOnly: true
volumes:
# Settare i volumi al livello del Pod, in seguito montarli nei containers all'interno del Pod
- name: config
configMap:
# Fornire il nome della ConfigMap che vuoi montare.
name: game-demo
# Una lista di chiavi dalla ConfigMap per essere creata come file
items:
- key: "game.properties"
path: "game.properties"
- key: "user-interface.properties"
path: "user-interface.properties"
Una ConfigMap non differenzia tra le proprietà di una singola linea e un file con più linee e valori. L'importante è il modo in cui i Pods e gli altri oggetti consumano questi valori.
Per questo esempio, definire un volume e montarlo all'interno del container demo
come /config
crea
due files,
/config/game.properties
e /config/user-interface.properties
,
sebbene ci siano quattro chiavi nella ConfigMap. Ciò avviene perché la definizione del Pod
specifica una lista di items
nella sezione dei volumes
.
Se ometti del tutto la lista degli items
, ogni chiave nella ConfigMap diventerà
un file con lo stesso nome della chiave, e otterrai 4 files.
Usare le ConfigMaps
Le ConfigMaps possono essere montate come volumi. Le ConfigMaps possono anche essere utilizzate da altre parti del sistema, senza essere direttamente esposte al Pod. Per esempio, le ConfigMaps possono contenere l'informazione che altre parti del sistema utilizzeranno per la loro configurazione.
La maniera più comune per usare le ConfigMaps è di configurare i containers che sono in esecuzione in un Pod nello stesso namespace. Puoi anche utilizzare una ConfigMap separatamente.
Per esempio, potresti incontrare addons o operators che adattano il loro comportamento in base a una ConfigMap.
Usare le ConfigMaps come files in un Pod
Per utilizzare una ConfigMap in un volume all'interno di un Pod:
- Creare una ConfigMap o usarne una che già esiste. Più Pods possono utilizzare la stessa ConfigMap.
- Modificare la definizione del Pod per aggiungere un volume sotto
.spec.volumes[]
. Nominare il volume in qualsiasi modo, e avere un campo.spec.volumes[].configMap.name
configurato per referenziare il tuo oggetto ConfigMap. - Aggiungere un
.spec.containers[].volumeMounts[]
a ogni container che necessiti di una ConfigMap. Nello specifico.spec.containers[].volumeMounts[].readOnly = true
e.spec.containers[].volumeMounts[].mountPath
in una cartella inutilizzata dove vorresti che apparisse la ConfigMap. - Modificare l'immagine o il comando utilizzato così che il programma cerchi i files in
quella cartella. Ogni chiave nella sezione
data
della ConfigMap si converte in un file sottomountPath
.
Questo è un esempio di un Pod che monta una ConfigMap in un volume:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
configMap:
name: myconfigmap
Ogni ConfigMap che desideri utilizzare deve essere referenziata in .spec.volumes
.
Se c'è più di un container nel Pod, allora ogni container necessita del suo
blocco volumeMounts
, ma solamente un .spec.volumes
è necessario ConfigMap.
Le ConfigMaps montate sono aggiornate automaticamente
Quando una ConfigMap è utilizzata in un volume ed è aggiornata, anche le chiavi vengono aggiornate.
Il kubelet controlla se la ConfigMap montata è aggiornata ad ogni periodo di sincronizzazione.
Ad ogni modo, il kubelet usa la sua cache locale per ottenere il valore attuale della ConfigMap.
Il tipo di cache è configurabile usando il campo ConfigMapAndSecretChangeDetectionStrategy
nel KubeletConfiguration struct.
Una ConfigMap può essere propagata per vista (default), ttl-based, o redirigendo
tutte le richieste direttamente all'API server.
Come risultato, il ritardo totale dal momento in cui la ConfigMap è aggiornata al momento in cui nuove chiavi sono propagate al Pod può essere tanto lungo quanto il periodo della sincronizzazione del kubelet + il ritardo della propagazione della cache, dove il ritardo della propagazione della cache dipende dal tipo di cache scelta
(è uguale rispettivamente al ritardo della propagazione, ttl della cache, o zero).
Le ConfigMaps consumate come variabili d'ambiente non sono aggiornate automaticamente e necessitano di un riavvio del pod.
ConfigMaps Immutabili
Kubernetes v1.21 [stable]
La funzionalità di Kubernetes Immutable Secrets and ConfigMaps fornisce un'opzione per configurare Secrets individuali e ConfigMaps come immutabili. Per clusters che usano le ConfigMaps come estensione (almeno decine o centinaia di ConfigMap uniche montate nel Pod), prevenire i cambiamenti nei loro dati ha i seguenti vantaggi:
- protezione da aggiornamenti accidentali (o non voluti) che potrebbero causare l'interruzione di applicazioni
- miglioramento della performance del tuo cluster riducendo significativamente il carico sul kube-apiserver, chiudendo l'ascolto sulle ConfigMaps che sono segnate come immutabili.
Questa funzionalità è controllata dal ImmutableEphemeralVolumes
feature gate.
Puoi creare una ConfigMap immutabile settando il campo immutable
a true
.
Per esempio:
apiVersion: v1
kind: ConfigMap
metadata:
...
data:
...
immutable: true
Una volta che una ConfigMap è segnata come immutabile, non è possibile invertire questo cambiamento né cambiare il contenuto del campo data
o binaryData
field. Puoi solamente cancellare e ricreare la ConfigMap. Poiché i Pods hanno un puntamento verso la ConfigMap eliminata, è raccomandato di ricreare quei Pods.
Voci correlate
- Leggi in merito Secrets.
- Leggi Configura un Pod per utilizzare una ConfigMap.
- Leggi in merito Modificare una ConfigMap (o qualsiasi altro oggetto di Kubernetes)
- Leggi The Twelve-Factor App per comprendere il motivo di separare il codice dalla configurazione.