K8S下http请求在ingress和nginx间无限循环的问题及解决
现象
应用发布uat后,某个接口的请求一直报
400 Bad Request Request Header Or Cookie Too Large
排查过程
1 根据错误提示,按照网上的教程,在nginx的配置里增加对应的配置
large_client_header_buffers 4 1M;
client_header_buffer_size 10M;
2 重启nginx,再次请求,依然是这个报错,但是nginx的日志明显变长了
3 观察nginx的日志,发现最后一个变量$http_x_forwarded_for特别的不正常,十分的长。观察到请求在两个服务器之间不断的循环,一直到header的长度被撑爆。这两个服务器,一个是这台nginx本身,另一个是ingress controller。
4 查看对应的nginx的配置。proxy_pass转发到的是域名,这个域名是解析到了ingress controller 的ip上的。
location ~ ^/workflow-alogrithm/ {
proxy_set_header Host $http_host;
client_max_body_size 20M;
proxy_set_header X-Real-IP $http_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://***-uat.***.com;
}
5 由于配置了 proxy_set_header Host $http_host;,请求ingress的时候请求头Host携带的是这台nginx挂的域名,ingress转发的时候又会根据这个Host转发到我的这台nginx上,于是形成了一个无限循环。一直到X-Forwarded-For 变量的长度撑爆了请求头。
PS, nginx是根据Host请求头来把请求路由到对应的server块的,参考nginx官方文档 https://nginx.org/en/docs/http/request_processing.html
6 proxy_set_header Host $http_host;去掉这个配置,重启。问题修复
K8S网络请求拓扑

ingress controller负责k8s外部流量到k8s内部流量的转发。
ingress会根据host判断请求应该走哪个server(选择nginx作为ingress controller的情况下)。
k8s内部服务之间的流量转发,推荐用service,别用dns解析到ingress的域名,避免导致无限循环,少一次网络转发,性能也更好。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
kubernetes需要默认的serviceaccount的原因解析
这篇文章主要介绍了kubernetes为何需要默认的serviceaccount,ServiceAccount 是 Kubernetes 中的一种重要概念,它的实际使用场景包括很多,本文给大家讲解的非常详细,需要的朋友可以参考下2023-04-04
Kubernetes 1.28.2集群安装过程中的关键步骤详解(最新推荐)
Kubernetes K8s是Google开源的容器编排平台,最初由Borg项目发展而来,K8s 1.28版本引入了非正常节点关闭恢复、内置Sidecar容器支持、Job优化、Proxy改进和调度框架优化等功能,本文介绍Kubernetes 1.28.2集群安装过程中的关键步骤,感兴趣的朋友一起看看吧2025-03-03


最新评论