Оновіть k8s ConfigMap або Secret, не видаляючи наявний


100

Я використовую K8S ConfigMap і Secret для управління нашими властивостями. Мій дизайн досить простий, що зберігає файли властивостей у репозиторії git і використовує сервер збірки, такий як Thoughtworks GO, для автоматичного їх розгортання як ConfigMaps або Secrets (за умови вибору) до мого кластера k8s.

В даний час я виявив, що насправді не ефективно, що мені доводиться завжди видаляти наявні ConfigMap і Secret і створювати новий для оновлення, як показано нижче:

  1. kubectl delete configmap foo

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

Чи є хороший і простий спосіб зробити вище одного кроку та ефективнішим, ніж видалення поточного? потенційно те, що я роблю зараз, може скомпрометувати контейнер, який використовує ці конфігураційні карти, якщо він намагається змонтувати, коли стара конфігураційна карта видаляється, а нова не створюється.

Заздалегідь спасибі.


Я щойно створив проект для автоматичного відображення configmap до значень середовища, це може бути корисно для когось. github.com/Acanguven/kubernetes-configmap-update
Ахмет Кан Гювен

Відповіді:


160

Ви можете отримати YAML з kubectl create configmapкоманди та направити його kubectl replace, наприклад:

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

3
Виконайте команду pipe, не думаючи про --dry-run, який видається ключовою частиною команди!
Джеймс Цзян,

5
Наскільки це варте, цей самий шаблон може працювати для Secrets на додаток до прикладу ConfigMaps, показаного тут.
rwehner

2
пробую це за допомогою kubernetes 1.10, але я постійно отримую помилку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
yee379


2
Чудова відповідь. використовуючи kubectl applyзамість kubectl replace, буде працювати як для нової, так і для існуючої конфігурації
nahsh

33

Для подальшого використання kubectl replaceзараз це дуже зручний спосіб досягти цього

kubectl replace -f some_spec.yaml Дозволяє вам оновити повну конфігурацію (або інші об'єкти)

Дивіться документ та приклади безпосередньо тут

Скопіюйте / вставте з довідки:

# 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
Це пропустило --from-fileвимогу. Карти конфігурації можна створювати з довільного файлу, а не лише з yaml.
Dave Hillier

@ sébastien-portebois дякую! Я не знав --forceваріанту, що дозволило б нам використовувати команду approach <dry-run ConfigMap creation> | kubectl replace --force -f -навіть 1-й раз, коли ConfigMap ще не існує. Але я не впевнений, чи безпечно видалити ConfigMap, оскільки підсистеми можуть зламатися під час його відсутності через його відсутність. Може, це кращий підхід <dry-run ConfigMap creation> | kubectl apply -f -? Цю точку якось представив @ karthic-c, що ви думаєте? Також @ jordan-liggitt, що ти думаєш?
Олексій ММ

18

Для невеликих змін configMap, використовуйтеedit

kubectl edit configmap <cfg-name>

Це відкриє configMap у viредакторі. Внесіть зміни та збережіть їх.


1
Класно. Однак, як згадано OP, мова йде про те, як досягти мети за допомогою автоматизованих процесів, наприклад. з ThoughtWorks Go як сервер побудови в моєму сценарії.
Джеймс Цзян,

5

kubectl replace не вдається, якщо конфігураційна карта вже існує:

$ 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

Найкращим рішенням буде використання, kubectl applyяке створило б конфігмап, якщо його немає, ще оновити конфігмап, якщо він присутній:

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

configmap/falco-config configured


6
Я думаю, ви маєте на увазі " kubectl replaceне вдається, якщо конфігураційна карта ще не існує".
Девід Дулінг,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.