Kubectl更新configMap

时间:2018-04-23 21:05:52

标签: 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.properties,因此只想看到mongo.properties。还有其他办法吗?

  

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

由于

8 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:9)

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

答案 2 :(得分:3)

不,你不能。

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

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

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

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

链接可能有所帮助:How can I edit a Deployment without modify the file manually?https://github.com/kubernetes-client/java/blob/master/kubernetes/docs/CoreV1Api.md#patchNamespacedConfigMap

答案 3 :(得分:3)

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

想法是;

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

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

因此,在第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

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

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

答案 4 :(得分:1)

以下是在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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

这是一个完整的Shell脚本,用于基于@Bruce S将新文件添加到configmap(或替换现有文件)。answer 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

答案 7 :(得分:0)

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

  1. 在 nginx 入口控制器 pod 描述中找到 configmap 名称
-Xcc
-fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/RNCryptor/RNCryptor.modulemap"

注意:就我而言,命名空间是“test-namespace”,配置映射名称是“test-nginx-ingress-controller”

  1. 创建一个configmap yaml
kubectl -n utility describe pods/test-nginx-ingress-controller-584dd58494-d8fqr |grep configmap
      --configmap=test-namespace/test-nginx-ingress-controller

注意:请按照步骤 1

namespace 和 configmap name >
  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

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

kubectl apply -f test-nginx-ingress-controller-configmap.yaml

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

的分享