更新 k8s ConfigMap 或 Secret 而不删除现有的

Update k8s ConfigMap or Secret without deleting the existing one

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

目前,我发现我必须始终删除现有的 ConfigMap 和 Secret 并创建新的 ConfigMap 和 Secret 来更新,效率不高:

  1. kubectl delete configmap foo

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

有没有一种比删除当前步骤更有效的简单好方法?可能我现在正在做的事情可能会危及使用这些配置映射的容器,如果它试图在旧的配置映射被删除并且新的配置映射尚未创建时进行挂载。

您可以从 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(或其他对象)

直接查看文档和示例here

Copy/pasted 来自帮助:

# 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\):.*$/:v4/' | kubectl replace -f -

# Force replace, delete and then re-create the resource
kubectl replace --force -f ./pod.json

对于 configMap 中的小改动,请使用 edit

kubectl edit configmap <cfg-name>

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

如果 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 如果不存在则创建 configmap,如果存在则更新 configmap:

$ 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

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

kubectl apply -f foo.yaml

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

” 无法在配置映射“foo”上完成操作:对象已被修改; 请将您的更改应用到最新版本并重试

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