如何使用 kubectl patch 命令更新此 configmap,而不使用 kubectl edit 命令
How to update this configmap with kubectl patch command, without kubectl edit command
下面是一个k8s
configmap
的配置,需要用kubectl patch
命令更新,不知道怎么办
# kubectl get configmap myconfig -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: debug-config
data:
config.json: |-
{
"portServiceDMS": 500,
"Buggdse": {
"Enable": false
},
"GHInterval": {
"Start": 5062,
"End": 6000
},
"LOPFdFhd": false,
"CHF": {
"DriverName": "mysql"
},
"Paralbac": {
"LoginURL": "https://127.0.0.1:7788",
"Sources": [
{
"ServiceName": "Hopyyu",
"Status": false,
"ServiceURL": "https://127.0.0.1:9090/ft/test"
},
{
"SourceName": "Bgudreg",
"Status": false, # need to patch here to true
"ServiceURL": "https://127.0.0.1:9090" # need to patch here to "https://192.168.123.177:45663"
}
]
}
}
我在 google
网站上搜索了类似的方法来处理 ,但它不起作用
这个命令我试过了,还是不行:
kubectl get cm myconfig -o json | jq -r '.data."config.json".Paralbac.Sources[1]={"SourceName": "Bgudreg", "Status": true, "ServiceURL": "https://192.168.123.177:45663"}' | kubectl apply -f -
我把命令缩减到这里:
kubectl get cm myconfig -o json | jq -r '.data."config.json" # it works (The double quotes are for escaping the dot)
kubectl get cm myconfig -o json | jq -r '.data."config.json".Paralbac # it can't work: jq: error (at <stdin>:18): Cannot index string with string "Paralbac"
所以,我认为我当前的问题是如何在 jq
中的 escaped
个符号之后继续工作
以下是更新问题中的 ConfigMap 的方法:
myconfig=$(mktemp) \
&& kubectl get configmap debug-config -o jsonpath='{.data.config\.json}' \
| jq '.Paralbac.Sources[1].Status = true' \
| jq '.Paralbac.Sources[1].ServiceURL = "https://192.168.123.177:45663"' > myconfig \
&& kubectl create configmap debug-config --from-file=config.json=myconfig --dry-run=client -o yaml | kubectl replace -f - \
&& rm myconfig
现在 kubectl get configmap debug-config -o jsonpath='{.data.config\.json}' | jq
会在 ConfigMap 中显示更新后的 config.json。
下面是一个k8s
configmap
的配置,需要用kubectl patch
命令更新,不知道怎么办
# kubectl get configmap myconfig -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: debug-config
data:
config.json: |-
{
"portServiceDMS": 500,
"Buggdse": {
"Enable": false
},
"GHInterval": {
"Start": 5062,
"End": 6000
},
"LOPFdFhd": false,
"CHF": {
"DriverName": "mysql"
},
"Paralbac": {
"LoginURL": "https://127.0.0.1:7788",
"Sources": [
{
"ServiceName": "Hopyyu",
"Status": false,
"ServiceURL": "https://127.0.0.1:9090/ft/test"
},
{
"SourceName": "Bgudreg",
"Status": false, # need to patch here to true
"ServiceURL": "https://127.0.0.1:9090" # need to patch here to "https://192.168.123.177:45663"
}
]
}
}
我在 google
网站上搜索了类似的方法来处理
这个命令我试过了,还是不行:
kubectl get cm myconfig -o json | jq -r '.data."config.json".Paralbac.Sources[1]={"SourceName": "Bgudreg", "Status": true, "ServiceURL": "https://192.168.123.177:45663"}' | kubectl apply -f -
我把命令缩减到这里:
kubectl get cm myconfig -o json | jq -r '.data."config.json" # it works (The double quotes are for escaping the dot)
kubectl get cm myconfig -o json | jq -r '.data."config.json".Paralbac # it can't work: jq: error (at <stdin>:18): Cannot index string with string "Paralbac"
所以,我认为我当前的问题是如何在 jq
escaped
个符号之后继续工作
以下是更新问题中的 ConfigMap 的方法:
myconfig=$(mktemp) \
&& kubectl get configmap debug-config -o jsonpath='{.data.config\.json}' \
| jq '.Paralbac.Sources[1].Status = true' \
| jq '.Paralbac.Sources[1].ServiceURL = "https://192.168.123.177:45663"' > myconfig \
&& kubectl create configmap debug-config --from-file=config.json=myconfig --dry-run=client -o yaml | kubectl replace -f - \
&& rm myconfig
现在 kubectl get configmap debug-config -o jsonpath='{.data.config\.json}' | jq
会在 ConfigMap 中显示更新后的 config.json。