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的域名,避免导致无限循环,少一次网络转发,性能也更好。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • K8s PV和PVC持久化存储详解

    K8s PV和PVC持久化存储详解

    Kubernetes PV由管理员创建,支持多种存储类型,提供生命周期管理,PVC请求PV资源,需匹配大小、存储类和访问模式,并在同一命名空间,回收策略包括Retain、Delete和Recycle,生产环境建议使用NAS而非NFS
    2025-08-08
  • k8s中容器创建的全过程实践

    k8s中容器创建的全过程实践

    这篇文章主要介绍了k8s中容器创建的全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • k8s之yaml文件的使用及说明

    k8s之yaml文件的使用及说明

    这篇文章主要介绍了YAML文件在Kubernetes中的使用,包括YAML文件的格式、创建资源对象、创建Service服务、查看和测试Service、解释Kubernetes中的port概念以及如何使用`kubectl`命令生成和修改YAML模板,同时,文章也简要介绍了如何编写和访问MySQL的YAML文件
    2025-11-11
  • kubernetes需要默认的serviceaccount的原因解析

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

    这篇文章主要介绍了kubernetes为何需要默认的serviceaccount,ServiceAccount 是 Kubernetes 中的一种重要概念,它的实际使用场景包括很多,本文给大家讲解的非常详细,需要的朋友可以参考下
    2023-04-04
  • Kubernetes应用配置管理创建使用详解

    Kubernetes应用配置管理创建使用详解

    这篇文章主要为大家介绍了Kubernetes应用配置管理创建使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • k8s+jenkins实现自动化部署应用至k8s集群方式

    k8s+jenkins实现自动化部署应用至k8s集群方式

    本文详细介绍了如何在Jenkins环境下配置和启动Jenkins服务,以及如何使用Jenkins进行自动化部署Nginx应用到Kubernetes集群,文章涵盖了从环境准备、项目配置、代码上传到部署和回滚的全过程,提供了一个完整的自动化部署解决方案
    2026-03-03
  • Kubernetes 1.28.2集群安装过程中的关键步骤详解(最新推荐)

    Kubernetes 1.28.2集群安装过程中的关键步骤详解(最新推荐)

    Kubernetes K8s是Google开源的容器编排平台,最初由Borg项目发展而来,K8s 1.28版本引入了非正常节点关闭恢复、内置Sidecar容器支持、Job优化、Proxy改进和调度框架优化等功能,本文介绍Kubernetes 1.28.2集群安装过程中的关键步骤,感兴趣的朋友一起看看吧
    2025-03-03
  • 云原生技术kubernetes(K8S)简介

    云原生技术kubernetes(K8S)简介

    这篇文章主要介绍了云原生技术kubernetes的相关资料,帮助大家更好的理解和学习使用K8S,感兴趣的朋友可以了解下
    2021-03-03
  • K8s集群中的DNS服务CoreDNS实战案例详解

    K8s集群中的DNS服务CoreDNS实战案例详解

    在 Kubernetes(K8s)中,DNS 服务是实现服务发现和 Pod 通信的核心组件之一,用于解决集群内资源通过域名而非 IP 地址进行访问的需求,本文将详细解析 K8s DNS 服务的原理、组件、配置及应用场景,感兴趣的朋友一起看看吧
    2025-06-06
  • K8S中五种控制器的介绍以及使用

    K8S中五种控制器的介绍以及使用

    这篇文章主要给大家介绍了关于K8S中五种控制器及使用的相关资料,控制器 又称之为工作负载,本文通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2021-12-12

最新评论