Aktualisieren Sie k8s ConfigMap oder Secret, ohne die vorhandene zu löschen

92

Ich habe K8S ConfigMap und Secret verwendet, um unsere Eigenschaften zu verwalten. Mein Design ist ziemlich einfach: Es speichert Eigenschaftendateien in einem Git-Repo und verwendet Build-Server wie Thoughtworks GO, um sie automatisch als ConfigMaps oder Secrets (unter Auswahlbedingungen) für meinen k8s-Cluster bereitzustellen.

Derzeit habe ich festgestellt, dass es nicht wirklich effizient ist, immer die vorhandene ConfigMap und Secret zu löschen und die neue zu erstellen, um sie wie folgt zu aktualisieren:

  1. kubectl delete configmap foo

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

Gibt es eine schöne und einfache Möglichkeit, über einen Schritt hinaus effizienter zu arbeiten als das Löschen von Strom? Möglicherweise kann das, was ich jetzt mache, den Container gefährden, der diese Konfigurationszuordnungen verwendet, wenn versucht wird, ihn bereitzustellen, während die alte Konfigurationszuordnung gelöscht und die neue nicht erstellt wurde.

Danke im Voraus.

James Jiang
quelle
Ich habe gerade ein Projekt erstellt, um configmap automatisch Umgebungswerten zuzuordnen. Es kann für jemanden nützlich sein. github.com/Acanguven/kubernetes-configmap-update
Ahmet Can Güven

Antworten:

152

Sie können yaml vom kubectl create configmapBefehl abrufen und kubectl replacewie folgt weiterleiten :

kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -
Jordan Liggitt
quelle
3
Pipe der Befehl ist der richtige Weg, ich habe nicht an den --dry-run gedacht, der der Schlüsselteil des Befehls zu sein scheint!
James Jiang
5
Für das, was es wert ist, kann dasselbe Muster zusätzlich zum hier gezeigten ConfigMaps-Beispiel für Secrets funktionieren.
Rwehner
2
versuche dies mit kubernetes 1.10, aber ich bekomme immer wieder den Fehlererror: 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
Das ist ein Fehler in 1.10, der in 1.10.1 behoben wurde - siehe github.com/kubernetes/kubernetes/issues/61780 und github.com/kubernetes/kubernetes/pull/61808
Jordan Liggitt
2
Gute Antwort. Verwenden von kubectl applystatt kubectl replacefunktioniert sowohl für neue als auch für vorhandene Konfigurationskarten
nahsh
28

Zum späteren Nachschlagen kubectl replaceist dies nun ein sehr praktischer Weg, um dies zu erreichen

kubectl replace -f some_spec.yaml Sie können eine vollständige configMap (oder andere Objekte) aktualisieren.

Siehe Dokument und Beispiele direkt hier

Aus der Hilfe kopieren / einfügen:

# 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
Sébastien Portebois
quelle
1
Dies verfehlte die --from-fileAnforderung. Configmaps können aus einer beliebigen Datei erstellt werden, nicht nur aus dem Yaml.
Dave Hillier
@ sébastien-portebois danke! Ich wusste nicht --force, welche Option es uns ermöglichen würde, den Annäherungsbefehl <dry-run ConfigMap creation> | kubectl replace --force -f -auch beim ersten Mal zu verwenden, wenn die ConfigMap noch nicht vorhanden ist. Ich bin mir jedoch nicht sicher, ob das Löschen der ConfigMap sicher ist, da Pods während des Fehlens möglicherweise beschädigt werden, weil sie nicht gefunden werden. Vielleicht ist es besser der Ansatz <dry-run ConfigMap creation> | kubectl apply -f -? Dieser Punkt wurde von @ karthic-c eingeführt. Was denkst du? Also @ jordan-liggitt was denkst du?
Alex MM
18

configMapVerwenden Sie für kleine Änderungen inedit

kubectl edit configmap <cfg-name>

Dadurch wird configMap im viEditor geöffnet . Nehmen Sie die Änderungen vor und speichern Sie sie.

Tieftauchgang
quelle
1
Cool. Wie bereits erwähnt, geht es hier jedoch darum, wie das Ziel mit automatisierten Prozessen erreicht werden kann, z. mit dem ThoughtWorks Go als Build-Server in meinem Szenario.
James Jiang
1

kubectl replace schlägt fehl, wenn bereits eine Konfigurationskarte vorhanden ist:

$ 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

Die beste Lösung ist die Verwendung einer kubectl applyKonfigurationskarte, wenn diese nicht vorhanden ist. Andernfalls wird die Konfigurationskarte aktualisiert, wenn sie vorhanden ist:

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

configmap/falco-config configured

Karthik C.
quelle
5
Ich denke du meinst " kubectl replaceschlägt fehl, wenn eine Konfigurationskarte noch nicht existiert".
David Dooling