從Workload中優雅隔離Pod

leason001發表於2024-09-05

線上叢集中,業務跑著跑著,突然發現有個Pod上出現大量錯誤日誌,其他的Pod是正常的,該如何處理呢?

  • 直接刪除Pod?

這樣不便於保留現場,可能會影響判斷問題的根因

  • 讓業務方忍一會,先排查下問題?

會被噴死

最好的方案是既讓Pod停止接收流量,又保留Pod

思路:

  1. 停止接收流量

停止接收流量這個動作是透過Pod的label來實現的,透過修改label來實現。其實本質就是把Pod從endpoint中移除,這樣無論是服務化,還是http都會把當前這個節點移除,不再轉發流量。
當然,這裡的前提是服務化和http的節點發現是基於k8s的endpoint來實現的(理論上大家都會這麼幹,不排除有黑科技)。

首先要主動呼叫服務下線的方法,理論上這個呼叫應該會配再Pod的prestop鉤子中,這樣Pod被刪除的時候,會先呼叫這個方法,然後再刪除Pod。

preStop:
    exec:
      command:
      - /bin/sh
      - -c
      - /bin/stop.sh
  1. 將Pod從Workload中移除

呼叫下線完畢之後,再修改Pod的標籤,這個標籤的修改可以讓Pod脫離Workload的控制,變成孤兒Pod,注意修改Pod標籤也要讓service的selector選擇不到這個Pod,這樣Pod也就從endpoint中移除,服務發現也就感知不到這個節點了。

  1. 如果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"""

相關文章