【问题标题】:Kubectl update configMapKubectl 更新 configMap
【发布时间】:2018-10-04 00:31:57
【问题描述】:

我正在使用以下命令来创建一个 configMap。

kubectl create configmap test --from-file=./application.properties --from-file=./mongo.properties --from-file=./logback.xml 

现在,我已经修改了来自 mongo.properties 的键的值,我需要在 kubernetes 中更新它。

选项1:-

kubectl edit test

在这里,它会打开整个文件。但是,我只想更新 mongo.properties,因此只想查看 mongo.properties。有没有其他办法?

注意:- 我不想将 mongo.properties 放在单独的 configMap 中。

谢谢

【问题讨论】:

标签: kubernetes


【解决方案1】:

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

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

参考 Github 问题:Support updating config map and secret with --from-file

【讨论】:

  • +1 这适用于小型配置映射,但不适用于大型配置映射...它以The ConfigMap "xx" is invalid: metadata.annotations: Too long: must have at most 262144 characters 失败。你知道解决这个问题的方法吗?
  • @srinivas 我最终只是从头开始删除并重新创建配置映射。那行得通:)
  • @More,我尝试了超过 262144 个字符,它适用于上述命令。使用的命令 - kubectl create cm ${applicationconfigmap} --namespace {{ .Release.Namespace }} --from-file=key1.yml=/tmp/key1-backup.yaml -o yaml --dry-run | kubectl apply -f -
  • 使用服务器端参数进行应用
【解决方案2】:

我设法通过 configmap 更新了 nginx pod 的 /etc/nginx/nginx.conf 中的设置 ("large-client-header-buffers")。这是我遵循的步骤..

  1. 在 nginx 入口控制器 pod 描述中找到 configmap 名称
kubectl -n utility describe pods/test-nginx-ingress-controller-584dd58494-d8fqr |grep configmap
      --configmap=test-namespace/test-nginx-ingress-controller

注意:在我的例子中,命名空间是“test-namespace”,配置映射名称是“test-nginx-ingress-controller”

  1. 创建一个 configmap yaml
cat  << EOF > test-nginx-ingress-controller-configmap.yaml

kind: ConfigMap
apiVersion: v1
metadata:
  name: test-nginx-ingress-controller
  namespace: test-namespace
data:
  large-client-header-buffers: "4 16k"
EOF

注意:请根据步骤 1

中的发现替换 namespaceconfigmap name >
  1. 部署 configmap yaml
kubectl apply -f test-nginx-ingress-controller-configmap.yaml

然后你会看到更改在几分钟后更新到 nginx 控制器 pod

i.g.
kubectl -n test-namespace exec -it test-nginx-ingress-controller-584dd58494-d8fqr -- cat /etc/nginx/nginx.conf|grep large
    large_client_header_buffers     4 16k;

感谢NeverEndingQueueHow to use ConfigMap configuration with Helm NginX Ingress controller - Kubernetes的分享

【讨论】:

    【解决方案3】:

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

    想法是;

    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
    

    第 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
    

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

    第 3 步;使用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
    

    【讨论】:

    • 一个完美的单行命令,就像一个魅力!谢谢。如果您想在影响部署时自动应用新的 configmap,可以使用“kubectl rollout restart deployment(部署名称)”进行扩展
    • 应该是第一个答案!
    【解决方案4】:

    kubectl edit configmap -n &lt;namespace&gt; &lt;configMapName&gt; -o yaml

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

    【讨论】:

    • 是的,你是对的..这是我的错字..打开编辑器的是kubectl edit,感谢您指出@3h4x
    • vim也可能打不开,取决于你设置的环境变量editor
    • 我不明白为什么这不是公认的答案?您可以编辑配置映射,它对我有用。对@Sathish 的答案只有一个编辑是,在编辑之后,您需要重新缩放 pod 以便部署编辑。
    • @AnandSonawane,我们使用注解 github.com/stakater/Reloader 自动为我们完成这项工作
    • @Sathish 明白了,谢谢。
    【解决方案5】:

    这是一个完整的 shell 脚本,用于根据@Bruce S. 向 configmap 添加新文件(或替换现有文件)。回答https://stackoverflow.com/a/54876249/2862663

    #!/bin/bash
    # Requires jq to be installed
    if [ -z "$1" ]
      then
        echo "usage: update-config-map.sh <config map name> <config file to add>"
        return
    fi 
    if [ -z "$2" ]
      then
        echo "usage: update-config-map.sh <config map name> <config file to add>"
        return
    fi 
    
    CM_FILE=$(mktemp -d)/config-map.json
    kubectl get cm $1 -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
    
    echo cunfigmap: $CM_FILE tempdir: $DATA_FILES_DIR
    
    echo will add file $2 to config
    
    cp $2 $DATA_FILES_DIR
    
    kubectl create configmap $1 --from-file $DATA_FILES_DIR -o yaml --dry-run |  kubectl apply -f -
    echo Done
    echo removing temp dirs
    rm -rf $CM_FILE
    rm -rf $DATA_FILES_DIR
    

    【讨论】:

    • dry-run | kubectl apply.. 行是我所需要的,谢谢,例如kubectl create secret generic secrets --from-env-file=secrets.env -o yaml --dry-run=client | kubectl apply -f -
    【解决方案6】:

    现在你可以了。只需在命令行上抛出:kubectl edit configmap &lt;name of the configmap&gt;。然后你就可以编辑你的配置了。

    【讨论】:

    • 您好,修改并保存 Configmap 后会自动应用更改吗?
    【解决方案7】:

    不,你不能。

    kubernetes 中的替换将简单地替换该配置映射中的所有内容。您不能只更新一个文件或其中的一个属性。

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

    这是我目前发现的,如果你发现已经有解决这个问题的方法,请告诉我:)

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

    thisthis 可能会有所帮助

    【讨论】:

      【解决方案8】:

      在 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
      

      添加/修改文件:

      echo '<paste file contents here>' > $DATA_FILES_DIR/<file name>.conf
      

      删除文件:

      rm <file name>.conf
      

      完成后,更新 configmap:

      kubectl create configmap <configmap name> --from-file $DATA_FILES_DIR -o yaml --dry-run | kubectl apply -f -
      

      删除临时文件和文件夹:

      rm -rf CM_FILE
      rm -rf DATA_FILES_DIR
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-25
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        • 1970-01-01
        • 2021-10-29
        相关资源
        最近更新 更多