我有以下配置图
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
值类似的方式将 value
和 configmapName
值作为命令行参数传递。
您可以查看上述脚本如何工作的示例:
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 -
最好的解决方案是使用 Linux 变量,并且您的配置映射需要允许使用它。您的启动 initContainer 或entrypoint.sh 应该计算这些变量,因此当您的应用程序执行时始终具有最新值。