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


99

我一直在使用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

有没有一种简单好用的方法可以比删除当前文件更有效地完成上述步骤?如果现在尝试删除旧的configmap而未创建新的configmap时尝试装载,则我现在正在做的事情可能会损害使用这些configmap的容器。

提前致谢。


我刚刚创建了一个项目,以将configmap自动映射到环境值,这对某人可能有用。github.com/Acanguven/kubernetes-configmap-update
Ahmet CanGüven18年

Answers:


160

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

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

3
管道命令是要走的路,没想到--dry-run似乎是命令的关键部分!
詹姆斯·姜

5
出于其价值,除了此处显示的ConfigMaps示例之外,此相同模式还可用于Secrets。
rwehner '16

2
尝试使用kubernetes 1.10,但我一直收到错误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
yee379 '18


2
好答案。使用kubectl apply代替kubectl replace,将同时适用于新的和现有的configmap
nahsh

32

供将来参考,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

2
这错过了--from-file要求。Configmap可以从任意文件创建,而不仅仅是Yaml。
戴夫·希利尔

@sébastien-portebois谢谢!我不知道该--force选项,是什么允许我们<dry-run ConfigMap creation> | kubectl replace --force -f -在ConfigMap不存在的情况下甚至在第一次使用进场命令。但是我不确定删除ConfigMap是否安全,因为Pod在缺少它的过程中可能会由于找不到而中断。也许是更好的方法<dry-run ConfigMap creation> | kubectl apply -f -?这一点是@ karthic-c介绍的,您怎么看?还有@ jordan-liggitt你怎么看?
Alex MM

18

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

kubectl edit configmap <cfg-name>

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


1
凉。但是,正如OP所提到的,这是关于如何通过自动化流程实现目标的。在我的方案中使用ThoughtWorks Go作为构建服务器。
詹姆斯·姜

5

kubectl replace 如果configmap已经存在,将失败:

$ 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它将创建configmap(如果不存在)的地方,否则将更新configmap(如果存在的话):

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

configmap/falco-config configured


6
我认为您的意思是“kubectl replace如果configmap存在则失败”。
David Dooling
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.