Aggiorna k8s ConfigMap o Secret senza eliminare quello esistente


100

Sto usando K8S ConfigMap e Secret per gestire le nostre proprietà. Il mio design è piuttosto semplice, mantiene i file delle proprietà in un repository git e utilizza un server di compilazione come Thoughtworks GO per distribuirli automaticamente per essere ConfigMaps o Secrets (a condizione di scelta) nel mio cluster k8s.

Al momento, ho scoperto che non è molto efficiente dover sempre eliminare ConfigMap e Secret esistenti e creare quello nuovo per aggiornare come di seguito:

  1. kubectl delete configmap foo

  2. kubectl create configmap foo --from-file foo.properties

C'è un modo carino e semplice per rendere più efficiente di un passaggio superiore rispetto all'eliminazione della corrente? potenzialmente quello che sto facendo ora potrebbe compromettere il contenitore che utilizza queste mappe di configurazione se tenta di eseguire il montaggio mentre la vecchia mappa di configurazione è stata cancellata e quella nuova non è stata creata.

Grazie in anticipo.


Ho appena creato un progetto per mappare automaticamente la mappa di configurazione ai valori dell'ambiente, può essere utile per qualcuno. github.com/Acanguven/kubernetes-configmap-update
Ahmet Can Güven

Risposte:


160

Puoi ottenere YAML dal kubectl create configmapcomando e indirizzarlo a kubectl replace, in questo modo:

kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -

3
Il comando Pipe è la strada da percorrere, non pensavo a --dry-run che sembra essere la parte fondamentale del comando!
James Jiang

5
Per quel che vale, questo stesso modello può funzionare per Secrets oltre all'esempio di ConfigMaps mostrato qui.
rwehner

2
provando con kubernetes 1.10 ma continuo a ricevere l'erroreerror: error validating "STDIN": error validating data: [apiVersion not set, kind not set]; if you choose to ignore these errors, turn validation off with --validate=false
yee379


2
Bella risposta. l'utilizzo al kubectl applyposto di kubectl replace, funzionerà sia per la mappa di
configurazione

33

Per riferimento futuro, kubectl replaceora è un modo molto pratico per raggiungere questo obiettivo

kubectl replace -f some_spec.yaml Consentono di aggiornare una configMap completa (o altri oggetti)

Vedi doc ed esempi direttamente qui

Copia / incolla dalla guida:

# Replace a pod using the data in pod.json.
kubectl replace -f ./pod.json

# Replace a pod based on the JSON passed into stdin.
cat pod.json | kubectl replace -f -

# Update a single-container pod's image version (tag) to v4
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -

# Force replace, delete and then re-create the resource
kubectl replace --force -f ./pod.json

2
Questo ha mancato il --from-filerequisito. Le mappe di configurazione possono essere create da un file arbitrario, non solo da yaml.
Dave Hillier

@ sébastien-portebois grazie! Non conoscevo l' --forceopzione, cosa ci avrebbe permesso di utilizzare il <dry-run ConfigMap creation> | kubectl replace --force -f -comando di avvicinamento anche la prima volta, quando la ConfigMap non esiste ancora. Ma non sono sicuro che sia sicuro eliminare ConfigMap poiché i pod potrebbero rompersi durante la sua mancanza a causa del mancato rilevamento. Forse è meglio l'approccio <dry-run ConfigMap creation> | kubectl apply -f -? Questo punto è stato introdotto da @ karthic-c, cosa ne pensi? Anche @ jordan-liggitt cosa ne pensi?
Alex MM

18

Per piccole modifiche configMap, utilizzareedit

kubectl edit configmap <cfg-name>

Questo aprirà configMap vinell'editor. Apporta le modifiche e salvalo.


1
Freddo. Tuttavia, come menzionato da OP, si tratta di come raggiungere l'obiettivo con processi automatizzati, ad es. con ThoughtWorks Go come server di costruzione nel mio scenario.
James Jiang

5

kubectl replace fallisce se esiste già una mappa di configurazione:

$ kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -

Error from server (NotFound): error when replacing "STDIN": configmaps "falco-config" not found

La soluzione migliore è usare kubectl applyche creerebbe la mappa di configurazione se non presente altrimenti aggiorna la mappa di configurazione se è presente:

$ kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl apply -f -

configmap/falco-config configured


6
Penso che tu kubectl replacevoglia dire " fallisce se una mappa di configurazione non esiste già".
David Dooling,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.