问题
线上某平台,通过Jenkins的API查询流水线的执行历史记录时,报错414.
排查
1.jenkins的访问,使用的为ingress的访问方式,414的返回码,可能是jenkins本身返回,也可能是ingress-controller返回(使用的为nginx-ingress-controller,版本为0.26.1)。于是同时对ingress-controller和jenkins的pod抓包,定位414返回码为ingress-controller返回(同时刻jenkins的pod未抓取到414的返回码),同时在nginx-ingress-controller的日志也显示414的错误;判定调用jenkins的API时,请求到nginx-ingress-controller时就被中止了。
如上图,在ingress-controller的上面抓包的414错误
2.排查Request—URI Too Large,为请求头参数过长的错误,解决办法为加大client_header_buffer_size 和large_client_header_buffers的配置。于是修改jenkins对应的ingress的annotation部分,检查nginx-ingress-controller的对应server段配置文件,配置已经生效。
3.在nginx-ingress-controller的server增加了上述配置后,发现查询流水线执行历史记录,仍然报错414.网上未搜索到配置不生效原因,于是尝试配置client_header_buffer_size,large_client_header_buffers到nginx-ingress-controller的configmap(nginx-ingress-controller会把configmap里面的配置注入到nginx.conf的http配置段),初始在configmap里面,client_header_buffer_size,large_client_header_buffers都是使用的下划线,发现一直无法注入到配置文件;后改成中划线后才注入成功,414问题才解决。
总结
1.client_header_buffer_size 和large_client_header_buffers必须配置到nginx-ingress-controller的configmap里面,进而注入到nginx.conf里面的http配置段覆盖默认值;通过ingress的annotation,虽然能单独配置client_header_buffer_size 和large_client_header_buffers,注入到nginx.conf的server段,但是优先级较低,系统仍以http的配置为主(查询nginx官网未找到此两点优先级的说明,待进一步调查)。
2.client_header_buffer_size 和large_client_header_buffers配置到nginx-ingress-controller的configmap里面时,必须改成中划线。