線上叢集中,業務跑著跑著,突然發現有個Pod上出現大量錯誤日誌,其他的Pod是正常的,該如何處理呢?
- 直接刪除Pod?
這樣不便於保留現場,可能會影響判斷問題的根因
- 讓業務方忍一會,先排查下問題?
會被噴死
最好的方案是既讓Pod停止接收流量,又保留Pod
思路:
- 停止接收流量
停止接收流量這個動作是透過Pod的label來實現的,透過修改label來實現。其實本質就是把Pod從endpoint中移除,這樣無論是服務化,還是http都會把當前這個節點移除,不再轉發流量。
當然,這裡的前提是服務化和http的節點發現是基於k8s的endpoint來實現的(理論上大家都會這麼幹,不排除有黑科技)。
首先要主動呼叫服務下線的方法,理論上這個呼叫應該會配再Pod的prestop鉤子中,這樣Pod被刪除的時候,會先呼叫這個方法,然後再刪除Pod。
preStop:
exec:
command:
- /bin/sh
- -c
- /bin/stop.sh
- 將Pod從Workload中移除
呼叫下線完畢之後,再修改Pod的標籤,這個標籤的修改可以讓Pod脫離Workload的控制,變成孤兒Pod,注意修改Pod標籤也要讓service的selector選擇不到這個Pod,這樣Pod也就從endpoint中移除,服務發現也就感知不到這個節點了。
- 如果Pod是消費型業務,比如說 nsq worker,不具備主動發起下線怎麼辦?
這種情況,可以直接將Pod網路切斷,這樣Pod就無法接收流量了,切斷方式也很簡單,直接在Pod上加一個iptables規則,將流量全部丟棄即可。
/sbin/iptables -A INPUT -s {node_ip}/32 -j ACCEPT && // 允許節點訪問,避免kubelet liveness檢查失敗
/sbin/iptables -A OUTPUT -d {node_ip}/32 -j ACCEPT &&
/sbin/iptables -A OUTPUT -s localhost -d localhost -j ACCEPT &&
/sbin/iptables -A INPUT -s localhost -d localhost -j ACCEPT &&
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -j ACCEPT &&
/sbin/iptables -A OUTPUT -p tcp --tcp-flags RST RST -j ACCEPT &&
/sbin/iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset &&
/sbin/iptables -A OUTPUT -p tcp -j REJECT --reject-with tcp-reset"""