如何正确修补配置映射?
How to properly patch a configmap?
我有一个如下所示的配置图:
apiVersion: v1
data:
nginx.conf: "events {worker_connections 1024;
.
.
.
}"
kind: ConfigMap
metadata:
name: nginx-cfg
namespace: nginx
我想在 nginx.conf 的开头添加一行新文本:
apiVersion: v1
data:
nginx.conf: " <some line of new text here>
events {worker_connections 1024;
.
.
.
}"
kind: ConfigMap
metadata:
name: nginx-cfg
namespace: nginx
我使用这个补丁命令进行修改:
kubectl patch configmap/nginx-cfg \
-n nginx \
--type merge \
-p '{"data":{"nginx.conf":{"load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so"}}}'
但出现错误:服务器错误:无效 JSON 补丁。我应该怎么做才能修复错误?
感谢您的帮助!
错误是因为您试图进入文件块。如果去掉大括号:
-p '{"data":{"nginx.conf":{"load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so"}}}'
至:
-p '{"data":{"nginx.conf":"load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so"}}'
然后补丁会成功,但会覆盖配置文件内容:
$ kubectl patch configmap/nginx-cfg --type merge -p '{"data":{"nginx.conf":"load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so"}}' -o yaml
apiVersion: v1
data:
nginx.conf: load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so
kind: ConfigMap
metadata:
name: nginx-cfg
如果你想修补那个字段的内容,那么你有几个选择:
a) 转储 configmap,使用 sed
或类似工具在本地修改 confimap,然后 kubectl replace
返回。请注意 "\ \ \ \ "
是有意填充 yaml
中的行
kubectl get configmap nginx-cfg -o yaml >nginx-cfg.yaml
sed -i '/nginx\.conf.*/a \ \ \ \ load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so nginx-cfg.yaml #Or whatever edits you need to make
kubectl replace -f nginx-cfg.yaml
b) 使用 kubectl get configmap nginx-cfg -o jsonpath="{.data.nginx\.conf}"
提取配置块本身,将其转储到磁盘,修改块,然后 kubectl create configmap
使用它并替换
kubectl get configmap nginx-cfg -o jsonpath="{.data.nginx\.conf}" >nginx.conf
sed -i '1 i\load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so' nginx.conf #Or whatever edits you need to make
kubectl create configmap --dry-run=client --from-file=nginx.conf nginx-cfg -o yaml | kubectl replace -f -
c) 使用一些管道进行编辑 in-line(仅在单行更改时有用。否则,值得执行上述操作之一)。这将获取 yaml,对其进行编辑 in-line,然后将其反馈给 kubectl 以替换现有的 configmap
kubectl get configmap nginx-cfg -o yaml | \
sed '/nginx\.conf.*/a \ \ \ \ load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so' | \
kubectl replace -f -
我有一个如下所示的配置图:
apiVersion: v1
data:
nginx.conf: "events {worker_connections 1024;
.
.
.
}"
kind: ConfigMap
metadata:
name: nginx-cfg
namespace: nginx
我想在 nginx.conf 的开头添加一行新文本:
apiVersion: v1
data:
nginx.conf: " <some line of new text here>
events {worker_connections 1024;
.
.
.
}"
kind: ConfigMap
metadata:
name: nginx-cfg
namespace: nginx
我使用这个补丁命令进行修改:
kubectl patch configmap/nginx-cfg \
-n nginx \
--type merge \
-p '{"data":{"nginx.conf":{"load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so"}}}'
但出现错误:服务器错误:无效 JSON 补丁。我应该怎么做才能修复错误?
感谢您的帮助!
错误是因为您试图进入文件块。如果去掉大括号:
-p '{"data":{"nginx.conf":{"load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so"}}}'
至:
-p '{"data":{"nginx.conf":"load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so"}}'
然后补丁会成功,但会覆盖配置文件内容:
$ kubectl patch configmap/nginx-cfg --type merge -p '{"data":{"nginx.conf":"load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so"}}' -o yaml
apiVersion: v1
data:
nginx.conf: load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so
kind: ConfigMap
metadata:
name: nginx-cfg
如果你想修补那个字段的内容,那么你有几个选择:
a) 转储 configmap,使用 sed
或类似工具在本地修改 confimap,然后 kubectl replace
返回。请注意 "\ \ \ \ "
是有意填充 yaml
kubectl get configmap nginx-cfg -o yaml >nginx-cfg.yaml
sed -i '/nginx\.conf.*/a \ \ \ \ load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so nginx-cfg.yaml #Or whatever edits you need to make
kubectl replace -f nginx-cfg.yaml
b) 使用 kubectl get configmap nginx-cfg -o jsonpath="{.data.nginx\.conf}"
提取配置块本身,将其转储到磁盘,修改块,然后 kubectl create configmap
使用它并替换
kubectl get configmap nginx-cfg -o jsonpath="{.data.nginx\.conf}" >nginx.conf
sed -i '1 i\load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so' nginx.conf #Or whatever edits you need to make
kubectl create configmap --dry-run=client --from-file=nginx.conf nginx-cfg -o yaml | kubectl replace -f -
c) 使用一些管道进行编辑 in-line(仅在单行更改时有用。否则,值得执行上述操作之一)。这将获取 yaml,对其进行编辑 in-line,然后将其反馈给 kubectl 以替换现有的 configmap
kubectl get configmap nginx-cfg -o yaml | \
sed '/nginx\.conf.*/a \ \ \ \ load_module /usr/lib/nginx/modules/ngx_http_vhost_traffic_status_module.so' | \
kubectl replace -f -