解决kubernetes中ingress-nginx配置问题,


HTTP(S)负载均衡器-ingress

Ingress是kubernetes API的标准资源类型之一,其本质就是一组基于DNS名称(host)或URL路径把请求转发至指定的Service资源的规则,用于将集群外的请求流量转发至集群内部完成服务发布

Ingress控制器(Ingress Controller)可以由任何具有反向代理(HTTP/HTTPS)功能的服务程序实现,如Nginx、Envoy、HAProxy、Vulcand和Traefik等。Ingress控制器本身也作为Pod对象与被代理的运行为Pod资源的应用运行于同一网络中。我们在这里选择了NGINX Ingress Controller,由于对NGINX的配置较为熟悉,同时我们使用的kubernetes是linuxboy的容器服务,构建集群的时候,容器服务会自带NGINX Ingress Controller。

image

根据实际情况Ingress调优


解决400 Request Header Or Cookie Too Large问题

现象:微信小程序需要调用后端接口,需要在header中传一段很长的token参数,直接使用浏览器访问该端口可以访问通,但是在加上token访问之后,会报“400 Request Header Or Cookie Too Large”

  <html>
      <head>
          <title>400 Request Header Or Cookie Too Large</title>
      </head>
      <body>
          <center>
              <h1>400 Bad Request</h1>
          </center>
          <center>Request Header Or Cookie Too Large</center>
          <hr>
          <center>nginx/1.15.6</center>
      </body>
  </html>

问题定位:直接修改Service使用nodeport的形式访问,则没有报错,初步定位需要在ingress中nginx配置客户端的请求头,进入Ingress Controller的Pod查询配置,果然是请求头空间不足。

    www-data@nginx-ingress-controller-5vx7x:/etc/nginx$ cat nginx.conf | grep client_header_buffer_size
        client_header_buffer_size       1k;
    www-data@nginx-ingress-controller-5vx7x:/etc/nginx$ cat nginx.conf | grep large_client_header_buffers
        large_client_header_buffers     4 8k;

解决方法:在ingress中添加注释

    nginx.ingress.kubernetes.io/server-snippet: client_header_buffer_size 2046k;

Server snippet
Using the annotation nginx.ingress.kubernetes.io/server-snippet it is possible to add custom configuration in the server configuration block.
该注释是将自定义配置加入nginx的server配置中

解决请求超时问题

现象:有一个数据导出功能,需要将大量数据进行处理,然后以Excel格式返回,在导出一个大约3W条数据的时候,出现访问超时情况。

image

解决方法:调整proxy_read_timeout,连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理
在ingress中添加注释

    nginx.ingress.kubernetes.io/proxy-read-timeout: 600

这里需要注意的事该注释的value需要时number类型,不能加s,否则将不生效

总结

使用NGINX ingress controller的好处就是对于nginx配置相对比较熟悉,性能也不差。相关nginx配置的对应的ingress可以在 https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/ 上查到。

相关内容