120

我一直在使用 K8S ConfigMap 和 Secret 来管理我们的属性。我的设计非常简单,将属性文件保存在 git repo 中,并使用诸如 Thoughtworks GO 之类的构建服务器将它们自动部署为 ConfigMaps 或 Secrets(在选择条件下)到我的 k8s 集群。

目前,我发现我必须总是删除现有的 ConfigMap 和 Secret 并创建新的进行更新,如下所示:

  1. kubectl delete configmap foo

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

有没有一种简单的方法可以使上述步骤比删除当前更有效?如果在删除旧配置图且未创建新配置图的情况下尝试挂载,我现在正在做的事情可能会损害使用这些配置图的容器。

4

5 回答 5

191

您可以从kubectl create configmap命令中获取 YAML 并将其通过管道传输到kubectl apply,如下所示:

kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl apply -f -
于 2016-07-06T04:46:09.773 回答
39

以供将来参考,kubectl replace现在是实现此目的的一种非常方便的方法

kubectl replace -f some_spec.yaml让您更新完整的 configMap(或其他对象)

直接在此处查看文档和示例

从帮助中复制/粘贴:

# 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
于 2017-02-09T14:08:03.250 回答
31

对于 的微小变化configMap,请使用edit

kubectl edit configmap <cfg-name>

vi这将在编辑器中打开 configMap 。进行更改并保存。

于 2019-01-09T00:59:22.173 回答
27

kubectl replace如果 configmap 尚不存在,则失败:

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

Error from server (NotFound): error when replacing "STDIN": configmaps "falco-config" not found

最好的解决方案是使用kubectl applywhich 将创建 configmap 如果不存在则更新 configmap 如果存在:

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

configmap/falco-config configured

于 2020-02-26T21:48:38.863 回答
7

获取现有 configmap 的副本:

kubectl get configmap foo -o yaml > foo.yaml

然后进行修改并使用 apply 命令,这应该可以工作。

kubectl apply -f foo.yaml

注意:如果您看到以下任何问题,请从现有配置映射中包含最新的“resourceVersion”并重试。

" 无法在 configmaps "foo" 上完成操作:对象已被修改;请将您的更改应用到最新版本,然后重试"

于 2020-11-12T15:30:34.483 回答