【问题标题】:Update k8s ConfigMap or Secret without deleting the existing one更新 k8s ConfigMap 或 Secret 而不删除现有的
【发布时间】:2016-11-08 01:10:26
【问题描述】:

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

有没有一种简单的方法可以使上述步骤比删除当前更有效?如果在删除旧配置图且未创建新配置图的情况下尝试挂载,我现在正在做的事情可能会危及使用这些配置图的容器。

【问题讨论】:

标签: kubernetes configmap


【解决方案1】:

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

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

【讨论】:

  • 管道命令是要走的路,没有想到 --dry-run 这似乎是命令的关键部分!
  • 不管怎样,除了此处显示的 ConfigMaps 示例之外,同样的模式也适用于 Secrets。
  • 用 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
  • 这是 1.10 中的一个错误,已在 1.10.1 中解决 - 请参阅 github.com/kubernetes/kubernetes/issues/61780 和 github.com/kubernetes/kubernetes/pull/61808
  • 很好的答案。使用 kubectl apply 而不是 kubectl replace,将适用于新的和现有的 configmap
【解决方案2】:

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

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

直接查看文档和示例here

从帮助中复制/粘贴:

# 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

【讨论】:

  • 这错过了--from-file 的要求。 Configmaps 可以从任意文件创建,而不仅仅是 yaml。
  • @sébastien-portebois 谢谢!我不知道 --force 选项,即使是第一次,当 ConfigMap 尚不存在时,什么可以让我们使用方法 <dry-run ConfigMap creation> | kubectl replace --force -f - 命令。但我不确定删除 ConfigMap 是否安全,因为 Pod 在缺少它时可能会因找不到它而损坏。也许<dry-run ConfigMap creation> | kubectl apply -f - 的方法更好?这一点是@karthic-c 介绍的,你怎么看?还有@jordan-liggitt 你怎么看?
  • “申请”有什么区别?
【解决方案3】:

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

kubectl edit configmap <cfg-name>

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

【讨论】:

  • 酷。但是,正如 OP 所提到的,这是关于如何通过自动化流程实现目标,例如。在我的场景中使用 ThoughtWorks Go 作为构建服务器。
【解决方案4】:

如果配置映射不存在,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 replace 将失败”。
  • 这个答案需要提高或以某种方式获得可见性,因为许多最终访问此页面的人都期待着一个具有配置创建的幂等解决方案......
  • 考虑将 --save-config 添加到 kubectl create 命令中。
  • 有一个“—force”标志可以避免错误并创建它。我也认为 apply 会覆盖并且可能不会删除您删除的任何键。
【解决方案5】:

复制现有的 configmap:

kubectl get configmap foo -o yaml > foo.yaml

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

kubectl apply -f foo.yaml

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 2018-09-30
    相关资源
    最近更新 更多