Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes Kubectl更新配置图_Kubernetes - Fatal编程技术网

Kubernetes Kubectl更新配置图

Kubernetes Kubectl更新配置图,kubernetes,Kubernetes,我正在使用以下命令创建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.pr

我正在使用以下命令创建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。还有别的办法吗

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

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

不,你不能

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

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

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

仅供参考,如果您只想更新一个或几个属性,可以使用补丁。然而,它有点难以实现


并且可能有帮助

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

kubectl create configmap some-config --from-file=some-key=some-config.yaml -n some-namespace -o yaml --dry-run | kubectl apply -f - kubectl create configmap some config--from file=some key=some-config.yaml-n some namespace-o yaml--dry run | kubectl apply-f-
请参阅Github问题:

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

将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

现在你可以了。只需在命令行上抛出:
kubectl edit configmap
。然后您可以编辑您的配置。

kubectl edit configmap-n-o yaml


这将打开一个vim编辑器,其中configmap采用yaml格式。现在只需编辑并保存它。

下面是一个完整的shell脚本,用于根据@Bruce S.answer将新文件添加到configmap(或替换现有文件)

#/bin/bash
#需要安装jq
如果[-z“$1”]
然后
echo“用法:update-config-map.sh”
返回
fi
如果[-z“$2”]
然后
echo“用法:update-config-map.sh”
返回
fi
CM_文件=$(mktemp-d)/config-map.json
kubectl获取cm$1-o json>$cm\u文件
数据文件目录=$(mktemp-d)
files=$(cat$CM_FILE | jq'.data'| jq-r'键[])
对于k,在$file中;做
name=“.data[\“$k\”]”
cat$CM_文件| jq-r$name>$DATA_文件_DIR/$k;
完成
echo cunfigmap:$CM\u文件tempdir:$DATA\u文件\u目录
echo将把文件$2添加到配置中
cp$2$数据\u文件\u目录
kubectl创建configmap$1--从文件$DATA_FILES_DIR-o yaml--干运行| kubectl apply-f-
回音完成
回波消除温度指令
rm-rf$CM\u文件
rm-rf$数据\u文件\u目录

这里有一种从脚本执行就地更新的简洁方法

想法是

  • 将configmap导出到YAML(
    kubectl get cm-o YAML
  • 使用
    sed
    命令行将旧值替换为新值(
    sed“s”from | to“
  • 使用
    kubectl apply
  • 在这个示例中,我将日志级别变量从“info”级别日志更新为“warn”级别日志

    因此,步骤1,读取当前配置

    $ 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
    
    您可以看到该值已更改。让我们把它推回集群

    $ 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
    
    步骤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
    

    答案是肯定的,你是对的。。这是我这边的一个打字错误。。打开编辑器的是
    kubectl edit
    ,感谢您指出@3H4x4x它也可能无法打开vim,这取决于环境变量
    editor
    ,您设置了一个完美的单行命令,它可以像一个符咒一样工作!非常感谢。如果您想在影响部署时自动应用新的configmap,可以使用“kubectl卷展栏重新启动部署(部署名称)”进行扩展,例如+1这适用于小型configmap,但不适用于大型configmap。。。失败原因是
    配置映射“xx”无效:元数据。批注:太长:最多只能包含262144个字符
    。你知道解决这个问题的方法吗?@srinivas我最终只是从头开始删除并重新创建configmap。有效:)@More,我尝试了超过262144个字符,它与上面的命令一起工作。使用的命令-kubectl create cm${applicationconfigmap}--namespace{.Release.namespace}--from file=key1.yml=/tmp/key1-backup.yaml-o yaml--dry run | kubectl apply-f-Use apply的服务器端参数
    dry run | kubectl apply..
    line是我所需要的,感谢您的帮助,例如
    kubectl创建机密的通用机密--从env file=secrets.env-o yaml--dry run=client | kubectl apply-f-
    $ kubectl get cm common-config -o yaml
    
    apiVersion: v1
    data:
      CR_COMMON_LOG_LEVEL: info
    kind: ConfigMap
    
    $ 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
    
    $ 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