Ingress-nginx历险记
2023-06-08 17:33:45 0 举报
AI智能生成
生产环境Ingress-nginx问题解决
作者其他创作
大纲/内容
前言:客户现场反馈了什么问题,以及自己核查的现象
排查过程
1、通过kubectl logs -f | grep 500
经过多次测试发现,当POST到服务器端的数据比较小时,
请求可以正常流转到后端服务,但是当请求的数据比较大时,
请求链路直接断了,向服务器返回了500
请求可以正常流转到后端服务,但是当请求的数据比较大时,
请求链路直接断了,向服务器返回了500
还是无法确认问题的真正原因
2、通过kubectl logs -f|grep doDeploy
从这个图上可以看到更加明显的问题,即当接收到的请求数据过大时,
其会将数据先写入临时目录 /tmp/nginx/client-body 下,但是在写入
的过程中,由于权限问题(Permission denied)无法正常写入,此时
nginx就直接向客户端返回500,而不会将请求继续向后端转。
其会将数据先写入临时目录 /tmp/nginx/client-body 下,但是在写入
的过程中,由于权限问题(Permission denied)无法正常写入,此时
nginx就直接向客户端返回500,而不会将请求继续向后端转。
使用 Bito AI 工具进行反查,以找到是什么参数来控制的
从反馈的结果可以看到,是通过 client_body_buffer_size 来控制,是否参加 client_body_buffer_size 的大小,先来解决生产问题
3、第一次解决
修改 ingress-nginx 的configmap 文件,在其中增加 client_body_buffer_size 参数,如图
远程去截图
修改保存完毕之后,静静的等待配置项重新加载生效
4、新的问题产生:配置文件无法正常生成,报错如下图所示:
本打算通过直接修改 client_body_buffer_size 来饶过/tmp/nginx/client-body 目录没有权限的问题来解决生产问题,以用户立即可以正常使用的,
5、第二次解决
抱着侥幸心理,重启ingress-nginx-controller容器,使用产生新的容器实例是否即可解决这个问题
6、新的问题产生:服务无法正常启动
通过kubectl logs -f ingress-nginx-controller-d8b478f7d-j6qgm -n ingress-nginx
从错误日志上看,说nginx的80端口被占用了,但是,Ingress-nginx使用的是Pod方式启动,
也为设置与主机共享网络,并且主机网络也不存在80端口占用,比较奇怪的问题,不科学,
因为无法解释得通,新的Pod,怎么会报80端口被占用呢?除非官方代码存在问题,报错信息
不是正在的问题。
也为设置与主机共享网络,并且主机网络也不存在80端口占用,比较奇怪的问题,不科学,
因为无法解释得通,新的Pod,怎么会报80端口被占用呢?除非官方代码存在问题,报错信息
不是正在的问题。
7、查官方代码
从ingress-nginx的github上找到当前版本的源代码
https://github.com/kubernetes/ingress-nginx/blob/controller-v1.3.1/cmd/nginx/main.go
点击之后,从新打开新的源代码
继续向下跟踪,找到 IsPortAvailable 方法
从源代码上可以看到,这边进行了端口绑定测试,如果绑定失败了,就返回false,最终会输出 port xxx ......
但,其实绑定失败除了端口被占用之外,如果当前用户没有权限,其绑定端口同样也是失败的,所以此部分的
错误提示信息是有问题的。再结合之前出现的 /tmp/nginx/client-body 目录没有权限的情况一致,整个问题的
根源是 当前Pod中默认的用户没有权限不足导致的。
但,其实绑定失败除了端口被占用之外,如果当前用户没有权限,其绑定端口同样也是失败的,所以此部分的
错误提示信息是有问题的。再结合之前出现的 /tmp/nginx/client-body 目录没有权限的情况一致,整个问题的
根源是 当前Pod中默认的用户没有权限不足导致的。
8、根源问题:ingress-nginx中的用户权限不足,引起了一系列的问题
K8S中权限有问题,一般与deployment中的securityContext有关
可以看到,runAsUser的值是101,也就是使用uid为101的用户启动容器,101用户ingress-nginx对应的用户为www-data。
下面只需要将runAsuser的值为0,保存退出,再次静静等待容器重启完成。
下面只需要将runAsuser的值为0,保存退出,再次静静等待容器重启完成。
9、后记
到目前为止,在公司产品落地的过程中,也只出现过这一次,虽然生产环境的问题已经解决了,系统也可以正常使用,但问题的根因还未找到。事后,到ingress-nginx的github上搜索了一下,找到类似的Isssue,地址为:https://github.com/kubernetes/ingress-nginx/issues/3858,其中主要的观点为 在 nginx-ingress-controller 镜像中,某一层中,文件的扩展属性信息没有被正确复制而导致的。
参考地址:
1、https://github.com/opencontainers/image-spec/blob/master/layer.md
2、https://www.man7.org/linux/man-pages/man7/xattr.7.html
10、疑问
初次安装Ingress-nginx时,为什么没有报权限不足呢?
收藏
0 条评论
下一页