我使用以下命令创建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。
由于
答案 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)
这是从脚本进行就地更新的一种好方法。
想法是;
kubectl get cm -o yaml
)sed
在命令行中用新值(sed "s|from|to"
)替换旧值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”)。这是我遵循的步骤..
-Xcc
-fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/RNCryptor/RNCryptor.modulemap"
注意:就我而言,命名空间是“test-namespace”,配置映射名称是“test-nginx-ingress-controller”
kubectl -n utility describe pods/test-nginx-ingress-controller-584dd58494-d8fqr |grep configmap
--configmap=test-namespace/test-nginx-ingress-controller
注意:请按照步骤 1
namespace 和 configmap name >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
感谢 NeverEndingQueue 在 How to use ConfigMap configuration with Helm NginX Ingress controller - Kubernetes
的分享