K8S下http請求在ingress和nginx間無限循環(huán)的問題及解決
現(xiàn)象
應(yīng)用發(fā)布uat后,某個接口的請求一直報
400 Bad Request Request Header Or Cookie Too Large
排查過程
1 根據(jù)錯誤提示,按照網(wǎng)上的教程,在nginx的配置里增加對應(yīng)的配置
large_client_header_buffers 4 1M;
client_header_buffer_size 10M;
2 重啟nginx,再次請求,依然是這個報錯,但是nginx的日志明顯變長了
3 觀察nginx的日志,發(fā)現(xiàn)最后一個變量$http_x_forwarded_for特別的不正常,十分的長。觀察到請求在兩個服務(wù)器之間不斷的循環(huán),一直到header的長度被撐爆。這兩個服務(wù)器,一個是這臺nginx本身,另一個是ingress controller。
4 查看對應(yīng)的nginx的配置。proxy_pass轉(zhuǎn)發(fā)到的是域名,這個域名是解析到了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轉(zhuǎn)發(fā)的時候又會根據(jù)這個Host轉(zhuǎn)發(fā)到我的這臺nginx上,于是形成了一個無限循環(huán)。一直到X-Forwarded-For 變量的長度撐爆了請求頭。
PS, nginx是根據(jù)Host請求頭來把請求路由到對應(yīng)的server塊的,參考nginx官方文檔 https://nginx.org/en/docs/http/request_processing.html
6 proxy_set_header Host $http_host;去掉這個配置,重啟。問題修復(fù)
K8S網(wǎng)絡(luò)請求拓?fù)?/h2>

ingress controller負(fù)責(zé)k8s外部流量到k8s內(nèi)部流量的轉(zhuǎn)發(fā)。
ingress會根據(jù)host判斷請求應(yīng)該走哪個server(選擇nginx作為ingress controller的情況下)。
k8s內(nèi)部服務(wù)之間的流量轉(zhuǎn)發(fā),推薦用service,別用dns解析到ingress的域名,避免導(dǎo)致無限循環(huán),少一次網(wǎng)絡(luò)轉(zhuǎn)發(fā),性能也更好。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
kubernetes需要默認(rèn)的serviceaccount的原因解析
這篇文章主要介紹了kubernetes為何需要默認(rèn)的serviceaccount,ServiceAccount 是 Kubernetes 中的一種重要概念,它的實(shí)際使用場景包括很多,本文給大家講解的非常詳細(xì),需要的朋友可以參考下2023-04-04
Kubernetes應(yīng)用配置管理創(chuàng)建使用詳解
這篇文章主要為大家介紹了Kubernetes應(yīng)用配置管理創(chuàng)建使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
k8s+jenkins實(shí)現(xiàn)自動化部署應(yīng)用至k8s集群方式
本文詳細(xì)介紹了如何在Jenkins環(huán)境下配置和啟動Jenkins服務(wù),以及如何使用Jenkins進(jìn)行自動化部署Nginx應(yīng)用到Kubernetes集群,文章涵蓋了從環(huán)境準(zhǔn)備、項(xiàng)目配置、代碼上傳到部署和回滾的全過程,提供了一個完整的自動化部署解決方案2026-03-03
Kubernetes 1.28.2集群安裝過程中的關(guān)鍵步驟詳解(最新推薦)
Kubernetes K8s是Google開源的容器編排平臺,最初由Borg項(xiàng)目發(fā)展而來,K8s 1.28版本引入了非正常節(jié)點(diǎn)關(guān)閉恢復(fù)、內(nèi)置Sidecar容器支持、Job優(yōu)化、Proxy改進(jìn)和調(diào)度框架優(yōu)化等功能,本文介紹Kubernetes 1.28.2集群安裝過程中的關(guān)鍵步驟,感興趣的朋友一起看看吧2025-03-03
K8s集群中的DNS服務(wù)CoreDNS實(shí)戰(zhàn)案例詳解
在 Kubernetes(K8s)中,DNS 服務(wù)是實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和 Pod 通信的核心組件之一,用于解決集群內(nèi)資源通過域名而非 IP 地址進(jìn)行訪問的需求,本文將詳細(xì)解析 K8s DNS 服務(wù)的原理、組件、配置及應(yīng)用場景,感興趣的朋友一起看看吧2025-06-06

