Update k8s ConfigMap or Secret without deleting the existing one

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

目前,我发现我必须总是删除现有的 ConfigMap 和 Secret 并创建一个新的来更新,这并不是很有效,如下所示:

  1. kubectl delete configmap foo

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

有没有一个好的和简单的方法,使上述一个步骤,更有效地比删除当前?如果在旧的配置图被删除而新的配置图尚未创建时,试图挂载使用这些配置图的容器,那么我现在所做的可能会损害它。

104407 次浏览

您可以从 kubectl create configmap命令获取 YAML,并将其传送到 kubectl apply,如下所示:

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

作为将来的参考,kubectl replace现在是实现这一点的一种非常方便的方法

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

See doc and examples directly 给你

从帮助中复制/粘贴:

# 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

For small changes in configMap, use edit

kubectl edit configmap <cfg-name>

这将在 vi编辑器中打开 configMap。

如果配置图不存在,则 kubectl replace失败:

$ 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 apply,如果没有别的更新配置图,它会创建配置图,如果存在的话:

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


configmap/falco-config configured


获取现有配置图的一个副本:

kubectl get configmap foo -o yaml > foo.yaml

And then do the modifications and use apply command, this should work.

kubectl apply -f foo.yaml

注意: 如果您看到以下任何一个问题,那么从现有的配置映射中包含最新的“ Resource Version”,然后再试一次。

” 操作无法在配置图“ foo”上完成: 对象已被修改; please apply your changes to the latest version and try again"

您可以考虑使用 GitOps 来实现它。在我的例子中,我使用 ArgoCD 作为 gitops 工具,它检测 Github 中的 K8S yaml 文件,然后自动应用更改。