背景html
最近遇到一個問題,線上老集羣下線時,node節點所有下線,只剩下ingress的節點,流量已所有切走,理論上應該沒什麼請求量,但ingress常常負載飆高致使容器掛掉。node
分析過程nginx
出問題的時候,能夠看到nginx error.log 裏面有不少 connection refused 的請求web
2020/05/13 03:39:02 [error] 587#587: *5038285 connect() failed (111: Connection refused) while connecting to upstream, client:192.168.231.2 server: _, request: "POST /RPC2 HTTP/1.1", upstream: "http://127.0.0.1:8181/RPC2", host: "1.1.1.1:80"
統計發現請求均來自192.168.231.2 這個IP,經確認,這個IP是咱們安全團隊漏洞掃描機器IP,也就是說請求是安全團隊漏洞掃描機器發出來的ubuntu
ingress 終端運行日誌裏面發現default-http-backend 找不到active endpoints 的日誌,以下所示後端
W0513 07:26:38.211186 7 controller.go:353] service kube-system/default-http-backend does not have any active endpoints
問題復現安全
正常狀況下,若是nginx 後端upstream 不存在時,會當即返回502 並退出bash
root@web-02:~ # curl http://test.abc.com -x"127.0.0.1:80" -I HTTP/1.1 502 Bad Gateway
而ingress 中,因爲default backend 的存在,若是訪問一個不存在server_name,請求就會丟給ingress default-backend 這個handler 處理 curl
root@ubuntu:~ # curl http://testnotfound.abc.com/test.html -x "127.0.0.1:80" default backend - 404
default backend 不存在的狀況下,curl 訪問ingress 會不斷重試陷入無限循環(直到咱們本身執行ctrl+c 終端curl請求才會中止)ide
ingress error.log 裏面能夠看到不斷有新的請求進來
這也是爲何nginx 單個cpu 被打爆而其餘cpu 相對空閒的緣由,至關於客戶端跟nginx建了個長鏈接(同一個客戶端,源端口不變),不斷髮起請求
爲default backend 容器加上污點容忍,讓default backend 容器飄到ingress controller機器,正常調度後機器CPU負載恢復正常
root@ubuntu:~# kubectl -n kube-system edit deployment default-http-backend ... tolerations: - effect: NoSchedule key: node-role.kubernetes.io/ingress operator: Equal value: "true" ... root@ubuntu:/home/wuguihong1# kubectl -n kube-system get pod|grep default default-http-backend-5b6975cbf8-xthpv 1/1 Running 0 15s [root@ubuntu:~]$ curl http://10.70.2.190:30000/test default backend - 404
思考
觸發須要2個條件,default backend 實例不存在 + 隨機訪問一個不存在的server_name (能進入default backend邏輯便可)
若是線上環境上default backend 容器掛掉,會不會一樣觸發該問題致使ingress機器單CPU 100% 問題?(待驗證)