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是阿里云的容器服务,构建集群的时候,容器服务会自带NGINX Ingress Controller。
根据实际情况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 annotationnginx.ingress.kubernetes.io/server-snippet
it is possible to add custom configuration in the server configuration block.
该注释是将自定义配置加入nginx的server配置中
解决请求超时问题
现象:有一个数据导出功能,需要将大量数据进行处理,然后以Excel格式返回,在导出一个大约3W条数据的时候,出现访问超时情况。
解决方法:调整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/ 上查到。