Обновите 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
Ахмет Джан Гювен,

Ответы:

161

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

kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -
Джордан Лиггитт
источник
3
Пропустить команду - это путь, не думая о --dry-run, который, по-видимому, является ключевой частью команды!
Джеймс Цзян,
5
Как бы то ни было, этот же шаблон может работать для Secrets в дополнение к примеру ConfigMaps, показанному здесь.
rwehner 06
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
это ошибка в 1.10, исправленная в 1.10.1 - см. github.com/kubernetes/kubernetes/issues/61780 и github.com/kubernetes/kubernetes/pull/61808
Джордан Лиггитт,
2
Отличный ответ. использование kubectl applyвместо kubectl replace, будет работать как для новой, так и для существующей карты конфигурации
nahsh
34

Для справки в будущем, 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варианта, который позволил бы нам использовать команду подхода <dry-run ConfigMap creation> | kubectl replace --force -f -даже в первый раз, когда ConfigMap еще не существует. Но я не уверен, безопасно ли удалить ConfigMap, поскольку модули могут сломаться из-за того, что они не найдены. Может лучше подход <dry-run ConfigMap creation> | kubectl apply -f -? Этот момент был как бы введен @ karthic-c, как вы думаете? Также @ jordan-liggitt, что ты думаешь?
Alex MM
19

Для небольших изменений 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сбой, если карта конфигурации еще не существует».
Дэвид Дулинг,
0

Сделайте копию существующей карты конфигурации:

kubectl get configmap foo -o yaml > foo.yaml

А затем внесите изменения и используйте команду apply, это должно сработать.

kubectl apply -f foo.yaml

Примечание. Если вы видите любую из следующих проблем, включите последнюю версию resourceVersion из существующей карты конфигурации и повторите попытку.

"Операция не может быть выполнена на configmaps" foo ": объект был изменен; пожалуйста, примените ваши изменения к последней версии и попробуйте еще раз"

Валлабха Вамаравелли
источник