如何正确修补配置映射?

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 -