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:
kubectl delete configmap foo
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.
źródło
Odpowiedzi:
Możesz pobrać YAML z
kubectl create configmap
polecenia i przesłać go dokubectl replace
, na przykład:kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -
źródło
error: 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
kubectl apply
zamiastkubectl replace
, będzie działać zarówno dla nowej, jak i istniejącej mapy konfiguracjiNa przyszłość
kubectl replace
jest to teraz bardzo wygodny sposób na osiągnięcie tegokubectl 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
źródło
--from-file
spełniało wymagań. Mapy konfiguracyjne można tworzyć z dowolnego pliku, a nie tylko z pliku yaml.--force
opcji, 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?Przy małych zmianach
configMap
użyjedit
kubectl edit configmap <cfg-name>
To otworzy configMap w
vi
edytorze. Wprowadź zmiany i zapisz go.źródło
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 apply
któ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
źródło
kubectl replace
niepowodzenie, jeśli mapa konfiguracji jeszcze nie istnieje”.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”
źródło