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

ingress controller負責k8s外部流量到k8s內部流量的轉發(fā)。
ingress會根據(jù)host判斷請求應該走哪個server(選擇nginx作為ingress controller的情況下)。
k8s內部服務之間的流量轉發(fā),推薦用service,別用dns解析到ingress的域名,避免導致無限循環(huán),少一次網(wǎng)絡轉發(fā),性能也更好。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Rainbond云原生部署開源社區(qū)Discourse的配置過程
這篇文章主要為大家介紹了Rainbond云原生部署開源社區(qū)Discourse配置過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04
kubernetes需要默認的serviceaccount的原因解析
這篇文章主要介紹了kubernetes為何需要默認的serviceaccount,ServiceAccount 是 Kubernetes 中的一種重要概念,它的實際使用場景包括很多,本文給大家講解的非常詳細,需要的朋友可以參考下2023-04-04

