【踩坑記錄】Default backend 不存在致使ingress 機器CPU高載

背景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


image.png


ingress error.log 裏面能夠看到不斷有新的請求進來

image.png


這也是爲何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


image.png


思考

觸發須要2個條件,default backend 實例不存在 + 隨機訪問一個不存在的server_name (能進入default backend邏輯便可)

若是線上環境上default backend 容器掛掉,會不會一樣觸發該問題致使ingress機器單CPU 100% 問題?(待驗證)

相關文章
相關標籤/搜索