Zaktualizuj k8s ConfigMap lub Secret bez usuwania istniejącej

102

Używam K8S ConfigMap i Secret do zarządzania naszymi nieruchomościami. Mój projekt jest dość prosty, utrzymuje pliki właściwości w repozytorium git i używa serwera kompilacji, takiego jak Thoughtworks GO, do automatycznego wdrażania ich jako ConfigMaps lub Secrets (pod warunkiem wyboru) w moim klastrze k8s.

Obecnie stwierdziłem, że nie jest zbyt wydajne, że muszę zawsze usuwać istniejące ConfigMap i Secret i tworzyć nowe do aktualizacji, jak poniżej:

  1. kubectl delete configmap foo

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

Czy istnieje przyjemny i prosty sposób na wykonanie powyżej jednego kroku i wydajniejszy niż usuwanie bieżącego? potencjalnie to, co teraz robię, może zagrozić kontenerowi, który używa tych map konfiguracji, jeśli spróbuje zamontować, podczas gdy stara mapa konfiguracji jest usuwana, a nowa nie została utworzona.

James Jiang
źródło
Właśnie stworzyłem projekt, aby automatycznie mapować configmap na wartości środowiska, może to być przydatne dla kogoś. github.com/Acanguven/kubernetes-configmap-update
Ahmet Can Güven

Odpowiedzi:

163

Możesz pobrać YAML z kubectl create configmappolecenia i przesłać go do kubectl replace, na przykład:

kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -
Jordan Liggitt
źródło
3
Potokuj polecenie jest drogą do zrobienia, nie myślałem o --dry-run, który wydaje się być kluczową częścią polecenia!
James Jiang,
5
Bez względu na to, ile jest wart, ten sam wzorzec może działać dla obiektów Secrets oprócz pokazanego tutaj przykładu ConfigMaps.
rwehner
2
próbuję tego z kubernetesem 1.10, ale ciągle otrzymuję błąderror: 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
to błąd w 1.10 rozwiązany w 1.10.1 - patrz github.com/kubernetes/kubernetes/issues/61780 i github.com/kubernetes/kubernetes/pull/61808
Jordan Liggitt
4
Świetna odpowiedź. używanie kubectl applyzamiast kubectl replace, będzie działać zarówno dla nowej, jak i istniejącej mapy konfiguracji
nahsh
37

Na przyszłość kubectl replacejest to teraz bardzo wygodny sposób na osiągnięcie tego

kubectl replace -f some_spec.yaml Pozwól zaktualizować pełną configMap (lub inne obiekty)

Zobacz dokument i przykłady bezpośrednio tutaj

Skopiuj / wklej z pomocy:

# 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
źródło
2
To nie --from-filespełniało wymagań. Mapy konfiguracyjne można tworzyć z dowolnego pliku, a nie tylko z pliku yaml.
Dave Hillier,
@ sébastien-portebois thanks! Nie znałem --forceopcji, która pozwoliłaby nam użyć <dry-run ConfigMap creation> | kubectl replace --force -f -polecenia podejścia nawet za pierwszym razem, gdy ConfigMap jeszcze nie istnieje. Ale nie jestem pewien, czy usunięcie ConfigMap jest bezpieczne, ponieważ Pods mogą zepsuć się podczas jego braku z powodu nie znalezienia go. Może to lepsze podejście <dry-run ConfigMap creation> | kubectl apply -f -? Ten punkt został wprowadzony przez @ karthic-c, co o tym myślisz? Również @ jordan-liggitt, co o tym myślisz?
Alex MM
21

Przy małych zmianach configMapużyjedit

kubectl edit configmap <cfg-name>

To otworzy configMap w viedytorze. Wprowadź zmiany i zapisz go.

głębokie nurkowanie
źródło
2
Fajne. Jednak, jak wspomniał OP, chodzi o to, jak osiągnąć cel za pomocą zautomatyzowanych procesów, np. z ThoughtWorks Go jako serwer do budowy w moim scenariuszu.
James Jiang,
6

kubectl replace kończy się niepowodzeniem, jeśli mapa konfiguracji już istnieje:

$ 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

Najlepszym rozwiązaniem jest użycie tego, kubectl applyktóry utworzyłby configmap, jeśli nie jest obecny, w przeciwnym razie zaktualizuje configmap, jeśli jest obecny:

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

configmap/falco-config configured

Karthik C
źródło
7
Myślę, że masz na myśli „ kubectl replaceniepowodzenie, jeśli mapa konfiguracji jeszcze nie istnieje”.
David Dooling
2

Zrób kopię istniejącej mapy konfiguracji:

kubectl get configmap foo -o yaml > foo.yaml

Następnie dokonaj modyfikacji i użyj polecenia Apply, to powinno działać.

kubectl apply -f foo.yaml

Uwaga: jeśli zobaczysz którykolwiek z poniższych problemów, dołącz najnowszą wersję „resourceVersion” z istniejącej mapy konfiguracji i spróbuj ponownie.

„Nie można wykonać operacji na mapach konfiguracyjnych„ foo ”: obiekt został zmodyfikowany; zastosuj zmiany do najnowszej wersji i spróbuj ponownie”

Vallabha Vamaravelli
źródło