Я использую K8S ConfigMap и Secret для управления нашими свойствами. Мой дизайн довольно прост, он хранит файлы свойств в репозитории git и использую сервер сборки, такой как Thoughtworks GO, для автоматического развертывания их в качестве ConfigMaps или Secrets (при условии выбора) в моем кластере k8s.
В настоящее время я обнаружил, что мне не очень эффективно всегда удалять существующие ConfigMap и Secret и создавать новые для обновления, как показано ниже:
kubectl delete configmap foo
kubectl create configmap foo --from-file foo.properties
Есть ли хороший и простой способ сделать более одного шага более эффективным, чем удаление текущего? потенциально то, что я делаю сейчас, может поставить под угрозу контейнер, который использует эти карты конфигурации, если он попытается смонтировать, в то время как старая карта конфигурации удалена, а новая не создана.
источник
Ответы:
Вы можете получить YAML из
kubectl create configmap
команды и передать его по конвейеруkubectl replace
, например:kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -
источник
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
вместоkubectl replace
, будет работать как для новой, так и для существующей карты конфигурацииДля справки в будущем,
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
источник
--from-file
требованию. Конфигмапы могут быть созданы из произвольного файла, а не только из yaml.--force
варианта, который позволил бы нам использовать команду подхода<dry-run ConfigMap creation> | kubectl replace --force -f -
даже в первый раз, когда ConfigMap еще не существует. Но я не уверен, безопасно ли удалить ConfigMap, поскольку модули могут сломаться из-за того, что они не найдены. Может лучше подход<dry-run ConfigMap creation> | kubectl apply -f -
? Этот момент был как бы введен @ karthic-c, как вы думаете? Также @ jordan-liggitt, что ты думаешь?Для небольших изменений
configMap
используйтеedit
kubectl edit configmap <cfg-name>
Это откроет configMap в
vi
редакторе. Внесите изменения и сохраните.источник
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
источник
kubectl replace
сбой, если карта конфигурации еще не существует».Сделайте копию существующей карты конфигурации:
kubectl get configmap foo -o yaml > foo.yaml
А затем внесите изменения и используйте команду apply, это должно сработать.
kubectl apply -f foo.yaml
Примечание. Если вы видите любую из следующих проблем, включите последнюю версию resourceVersion из существующей карты конфигурации и повторите попытку.
"Операция не может быть выполнена на configmaps" foo ": объект был изменен; пожалуйста, примените ваши изменения к последней версии и попробуйте еще раз"
источник