K8S下http请求在ingress和nginx间无限循环的问题及解决

 更新时间:2025年07月10日 08:53:42   作者:bruce128  
文章描述了UAT环境中因Nginx与IngressController代理循环导致400错误的排查过程,发现proxy_set_header Host配置引发Host头携带Nginx域名,导致请求反复转发,最终X-Forwarded-For头溢出,解决方法是移除该配置

现象

应用发布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日志备份解决ELK中日志丢失问题

    kubernetes日志备份解决ELK中日志丢失问题

    这篇文章主要为大家介绍了kubernetes日志备份方案的细节探究分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Rainbond云原生部署开源社区Discourse的配置过程

    Rainbond云原生部署开源社区Discourse的配置过程

    这篇文章主要为大家介绍了Rainbond云原生部署开源社区Discourse配置过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • Rancher通过界面管理K8s平台的图文步骤详解

    Rancher通过界面管理K8s平台的图文步骤详解

    这篇文章主要为大家介绍了Rancher通过界面管理K8s平台通过详细的图文进行步骤讲解,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • kubernetes需要默认的serviceaccount的原因解析

    kubernetes需要默认的serviceaccount的原因解析

    这篇文章主要介绍了kubernetes为何需要默认的serviceaccount,ServiceAccount 是 Kubernetes 中的一种重要概念,它的实际使用场景包括很多,本文给大家讲解的非常详细,需要的朋友可以参考下
    2023-04-04
  • kubernetes-1.25.6二进制部署方式

    kubernetes-1.25.6二进制部署方式

    这篇文章主要介绍了kubernetes-1.25.6二进制部署方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • CentOS 8.2 k8s 基础环境配置

    CentOS 8.2 k8s 基础环境配置

    这篇文章主要介绍了CentOS 8.2 k8s 基础环境配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • 如何给k8s集群里的资源打标签

    如何给k8s集群里的资源打标签

    k8s集群,节点如果有多个角色,需要标记出来,可以给对应的节点打上标签,方便后续了解节点的功能,这篇文章主要介绍了如何给k8s集群里的资源打标签,需要的朋友可以参考下
    2023-02-02
  • 关于k8s中subpath的使用详解

    关于k8s中subpath的使用详解

    这篇文章主要介绍了k8s中subpath的使用,文章介绍分为两种情况给大家详细讲解,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • K8s解决主机重启后kubelet无法自动启动问题(推荐)

    K8s解决主机重启后kubelet无法自动启动问题(推荐)

    在安装配置好Kubernetes后,正常情况下服务器关机重启,kubelet也会自动启动的,如何解决这个问题呢,下面小编给大家带来了K8s解决主机重启后kubelet无法自动启动问题,感兴趣的朋友一起看看吧
    2022-08-08
  • 不同k8s集群间服务如何相互访问实现详解

    不同k8s集群间服务如何相互访问实现详解

    这篇文章主要为大家介绍了不同k8s集群间服务如何相互访问实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04

最新评论