更新 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 来更新,效率不高:
kubectl delete configmap foo
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 文件,然后自动应用更改。
我一直在使用 K8S ConfigMap 和 Secret 来管理我们的财产。我的设计非常简单,将属性文件保存在 git 存储库中,并使用诸如 Thoughtworks GO 之类的构建服务器自动将它们部署为 ConfigMaps 或 Secrets(在选择条件下)到我的 k8s 集群。
目前,我发现我必须始终删除现有的 ConfigMap 和 Secret 并创建新的 ConfigMap 和 Secret 来更新,效率不高:
kubectl delete configmap foo
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。进行更改并保存。
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 文件,然后自动应用更改。