我有以下configmaps
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
name并设置要修改的内容。
此外,您可能希望以类似于configmapName
值的方式将keyName
和value
值作为命令行参数传递。
你可以看到上面的脚本是如何工作的一个例子:
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 -