Kubectl更新configMap

use*_*872 13 kubernetes

我使用以下命令创建configMap.

kubectl create configmap test --from-file=./application.properties --from-file=./mongo.properties --from-file=./logback.xml 
Run Code Online (Sandbox Code Playgroud)

现在,我已经修改了mongo.properties中的密钥值,我需要在kubernetes中更新.

选项1 :-

kubectl edit test
Run Code Online (Sandbox Code Playgroud)

在这里,它打开整个文件.但是,我想只更新mongo.properties,因此只想看到mongo.properties.还有其他方法吗?

注意: - 我不想在单独的configMap中使用mongo.properties.

谢谢

irv*_*ifa 16

另一种选择实际上是你可以使用这个命令:

kubectl create configmap some-config --from-file=some-key=some-config.yaml -n some-namespace -o yaml --dry-run | kubectl apply -f - 

请参阅Github问题:支持使用--from-file更新配置映射和机密

  • +1这适用于小型配置映射,但不适用于大型配置映射...它失败并显示“ConfigMap“xx”无效:metadata.annotations:太长:最多必须有 262144 个字符”。你知道解决这个问题的方法吗? (2认同)

Sat*_*ish 11

kubectl edit configmap -n <namespace> <configMapName> -o yaml

这将打开一个带有 yaml 格式的 configmap 的 vim 编辑器。现在只需对其进行编辑并保存即可。

  • 也可能打不开vim,这取决于你设置的环境变量“editor” (3认同)
  • 我不明白为什么这不是公认的答案?您可以编辑配置图,它对我有用。对答案@Sathish 的唯一编辑是,在编辑后,您需要重新缩放 Pod 才能部署编辑。 (3认同)

Ste*_*per 11

这是从脚本进行就地更新的一种巧妙方法。

这个想法是;

  1. 将配置映射导出到 YAML ( kubectl get cm -o yaml)
  2. 用于sed在命令行中用新值 ( sed "s|from|to")替换旧值
  3. 使用 kubectl apply

在这个工作示例中,我将日志级别变量从“信息”级别日志记录更新为“警告”级别日志记录。

所以,第一步,读取当前配置;

$ kubectl get cm common-config -o yaml

apiVersion: v1
data:
  CR_COMMON_LOG_LEVEL: info
kind: ConfigMap
Run Code Online (Sandbox Code Playgroud)

第 2 步,使用正则表达式搜索和替换在本地修改它,使用sed

$ kubectl get cm common-config -o yaml | \
  sed -e 's|CR_COMMON_LOG_LEVEL: info|CR_COMMON_LOG_LEVEL: warn|'

apiVersion: v1
data:
  CR_COMMON_LOG_LEVEL: warn
kind: ConfigMap
Run Code Online (Sandbox Code Playgroud)

您可以看到值已更改。让我们把它推回集群;

第 3 步;use kubectl apply -f -,它告诉 kubectl 从 stdin 读取并将其应用到集群;

$ kubectl get cm common-config -o yaml | \
  sed -e 's|CR_COMMON_LOG_LEVEL: info|CR_COMMON_LOG_LEVEL: warn|' | \
  kubectl apply -f -

configmap/common-config configured
Run Code Online (Sandbox Code Playgroud)


小智 9

现在你可以。只需kubectl edit configmap <name of the configmap>在命令行上抛出:然后,您可以编辑您的配置。

  • 您好,编辑并保存 Configmap 后是否会自动应用更改? (5认同)
  • @jialeee17如果定义了“reload”,那么应该自动应用。关于文档: &gt; 重新加载:允许自动重新加载更改的核心文件。编辑 ConfigMap 配置后,请等待两分钟以使更改生效。 (2认同)

小智 8

不,你不能。

在kubernetes中替换将仅替换该configmap中的所有内容。您不能只更新一个文件或其中的一个属性。

但是,如果与客户端Api进行检查,则会发现是否创建了包含大量文件的configmap。然后,这些文件将存储为HashMap,其中key是默认文件名,value是编码为字符串的文件内容。因此,您可以基于HashMap中的现有键值对编写自己的函数。

这是我到目前为止所发现的,如果您发现已有解决此问题的方法,请告诉我:)

仅供参考,如果您只想更新一个或几个属性,则可以使用补丁。但是,实现起来有点困难。

这个这个月的帮助


Rtm*_*tmY 7

建议

我会高度考虑使用像k9s这样的 CLI 编辑器(它更像是 K8S CLI 管理工具)。

如下所示(忽略所有白色占位符),当在终端上设置集群的上下文时,您只需键入k9s即可到达一个不错的终端,您可以在其中检查所有集群资源。

只需输入“:”并输入资源名称(在我们的例子中为 configmaps),它将出现在屏幕中间(绿色矩形)。
然后,您可以使用向上和向下箭头选择相关的配置映射并键入e进行编辑(请参见绿色箭头)。

对于您选择的所有命名空间中的所有 Configmap 0,对于特定命名空间,您可以从左上角菜单中选择数字 - 例如1对于 kube-system:

在此输入图像描述


小智 6

以下是在 jq 的帮助下如何在 configmap 中添加/修改/删除文件的方法:

将配置映射导出到 JSON 文件:

CM_FILE=$(mktemp -d)/config-map.json
oc get cm <configmap name> -o json > $CM_FILE

DATA_FILES_DIR=$(mktemp -d)
files=$(cat $CM_FILE | jq '.data' | jq -r 'keys[]')
for k in $files; do
    name=".data[\"$k\"]"
    cat $CM_FILE | jq -r $name > $DATA_FILES_DIR/$k;
done
Run Code Online (Sandbox Code Playgroud)

添加/修改文件:

echo '<paste file contents here>' > $DATA_FILES_DIR/<file name>.conf
Run Code Online (Sandbox Code Playgroud)

删除文件:

rm <file name>.conf
Run Code Online (Sandbox Code Playgroud)

完成后,更新配置映射:

kubectl create configmap <configmap name> --from-file $DATA_FILES_DIR -o yaml --dry-run | kubectl apply -f -
Run Code Online (Sandbox Code Playgroud)

删除临时文件和文件夹:

rm -rf CM_FILE
rm -rf DATA_FILES_DIR
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

21975 次

最近记录:

6 年,5 月 前