动态更新 configmap 值

问题描述

我有以下配置图

apiVersion: v1
kind: ConfigMap
Metadata:
  name: test
data:
  application.properties: |+
  key1: value1
  key2: value2
  keyN: valueN

Configmaps 挂载到 pod 并且工作正常。

我的要求是以编程方式替换某些键的值。 我可以运行 shell/python 脚本,我可以运行任何 kubectl 命令。

解决方法

您可以使用 kubectl patch 命令更新 K8s 资源。

kubectl patch configmap/test \
  --type=json \
  '-p=[{"op": "replace","path": "/data/key1","value": "test1"}]'

Henry 提到的一个需要注意的重要一点是,应用程序还必须在属性更改后重新读取它们。

,

您可以使用 Bash 脚本动态替换 ConfigMaps 中的某些键和值。

我创建了简单的 bash 脚本来说明它如何在我的 kubeadm 集群 v1.20 上工作:

#!/bin/bash

keyName="key1"
value="value100"

read -p 'Enter ConfigMap name: ' configmapName

if kubectl get cm ${configmapName} 1> /dev/null 2>&1; then
        echo "ConfigMap name to modify: ${configmapName}"
else
        echo "ERROR: bad ConfigMap name"
        exit 1
fi

kubectl patch cm ${configmapName} -p "{\"data\":{\"${keyName}\":\"${value}\"}}"

在上面的例子中,您需要传递ConfigMap名称并设置您要修改的内容。
此外,您可能希望以类似于 keyName 值的方式将 valueconfigmapName 值作为命令行参数传递。

您可以看到上述脚本如何工作的示例:

root@kmaster:~# ./replaceValue.sh 
Enter ConfigMap name: test
ConfigMap name to modify: test
configmap/test patched
root@kmaster:~# kubectl describe cm test
Name:         test
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
application.properties:
----

key1:
----
value100
key2:
----
value2
keyN:
----
valueN
Events:  <none>
root@kmaster:~# 

注意:如果您想使用 kubectl replace 而不是 kubectl patch,您可以使用以下命令(例如 sourceValue="key1: value1"destinationValue="key1: value100"

kubectl get cm ${configmapName} -o yaml | sed "s/${sourceValue}/${destinationValue}/" | kubectl replace -f -