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

时间:2016-07-06 04:20:43

标签: docker kubernetes devops

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

目前,我发现它不是非常有效,我必须始终删除现有的ConfigMap和Secret,并创建新的更新,如下所示:

  1. kubectl delete configmap foo

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

  3. 是否有一种简单明了的方法可以实现上一步并且比删除当前更有效?可能我现在正在做的事情可能会破坏使用这些配置映射的容器,如果它在删除旧的配置图并且尚未创建新的配置图时尝试挂载。

    提前致谢。

5 个答案:

答案 0 :(得分:84)

您可以从<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/nav_home" android:icon="@mipmap/hospital" android:title="Home" /> <item android:id="@+id/nav_reminder" android:icon="@mipmap/alarm" android:title="Reminders" /> </group> <item android:title="Tools"> <menu> <item android:id="@+id/nav_settings" android:icon="@mipmap/settings" android:title="Settings" /> <item android:id="@+id/nav_help" android:icon="@mipmap/information" android:title="Help" /> <item android:id="@+id/nav_about" android:icon="@mipmap/team" android:title="About Us" /> </menu> </item> </menu> 命令获取yaml并将其传递给kubectl create configmap,如下所示:

kubectl replace

答案 1 :(得分:19)

为了将来参考,kubectl replace现在是实现此目的的一种非常方便的方式

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

直接在https://kubernetes.io/docs/user-guide/kubectl/kubectl_replace/

中查看文档和示例

从帮助中复制/粘贴:

# 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 :(得分:5)

kubectl replace如果配置映射已存在则失败:

$ 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

答案 3 :(得分:2)

获取现有configmap的副本:

kubectl get configmap foo -o yaml > foo.yaml

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

kubectl apply -f foo.yaml

注意:如果您发现以下任何问题,请从现有配置映射中添加最新的“ resourceVersion”,然后重试。

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

答案 4 :(得分:1)

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

kubectl edit configmap <cfg-name>

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