開發與維運

Kubernetes調整Node節點快速驅逐pod的時間

在高可用的k8s集群中,當Node節點掛掉,kubelet無法提供工作的時候,pod將會自動調度到其他的節點上去,而調度到節點上的時間需要我們慎重考量,因為它決定了生產的穩定性、可靠性,更快的遷移可以減少我們業務的影響性,但是有可能會對集群造成一定的壓力,從而造成集群崩潰。

Kubelet 狀態更新的基本流程:

  • 1.kubelet 自身會定期更新狀態到 apiserver,通過參數--node-status-update-frequency指定上報頻率,默認是 10s 上報一次。
  • 2.kube-controller-manager 會每隔--node-monitor-period時間去檢查 kubelet 的狀態,默認是 5s。
  • 3.當 node 失聯一段時間後,kubernetes 判定 node 為 notready 狀態,這段時長通過--node-monitor-grace-period參數配置,默認 40s。
  • 4.當 node 失聯一段時間後,kubernetes 判定 node 為 unhealthy 狀態,這段時長通過--node-startup-grace-period參數配置,默認 1m0s。
  • 5.當 node 失聯一段時間後,kubernetes 開始刪除原 node 上的 pod,這段時長是通過--pod-eviction-timeout參數配置,默認 5m0s。

kube-controller-manager 和 kubelet 是異步工作的,這意味著延遲可能包括任何的網絡延遲、apiserver 的延遲、etcd 延遲,一個節點上的負載引起的延遲等等。因此,如果--node-status-update-frequency設置為5s,那麼實際上 etcd 中的數據變化會需要 6-7s,甚至更長時間。

配置

對於這些參數的配置,需要根據不同的集群規模場景來進行配置。

社區默認的配置

參數
–node-status-update-frequency 10s
–node-monitor-period 5s
–node-monitor-grace-period 40s
–pod-eviction-timeout 5m

快速更新和快速響應

參數
–node-status-update-frequency 4s
–node-monitor-period 2s
–node-monitor-grace-period 20s
–pod-eviction-timeout 30s

在這種情況下,Pod 將在 50s 被驅逐,因為該節點在 20s 後被視為Down掉了,--pod-eviction-timeout在 30s 之後發生,但是,這種情況會給 etcd 產生很大的開銷,因為每個節點都會嘗試每 2s 更新一次狀態。

如果環境有1000個節點,那麼每分鐘將有15000次節點更新操作,這可能需要大型 etcd 容器甚至是 etcd 的專用節點。

如果計算嘗試次數,則除法將給出5,但實際上每次嘗試的 nodeStatusUpdateRetry 嘗試將從3到5。 由於所有組件的延遲,嘗試總次數將在15到25之間變化。

中等更新和平均響應

參數
–node-status-update-frequency 20s
–node-monitor-period 5s
–node-monitor-grace-period 2m
–pod-eviction-timeout 1m

這種場景下會 20s 更新一次 node 狀態,controller manager 認為 node 狀態不正常之前,會有 2m60⁄205=30 次的 node 狀態更新,Node 狀態為 down 之後 1m,就會觸發驅逐操作。

如果有 1000 個節點,1分鐘之內就會有 60s/20s*1000=3000 次的節點狀態更新操作。

低更新和慢響應

參數
–node-status-update-frequency 1m
–node-monitor-period 5s
–node-monitor-grace-period 5m
–pod-eviction-timeout 1m

Kubelet 將會 1m 更新一次節點的狀態,在認為不健康之後會有 5m/1m*5=25 次重試更新的機會。Node為不健康的時候,1m 之後 pod開始被驅逐。

可以有不同的組合,例如快速更新和慢反應以滿足特定情況。

也會有特殊情況,例如使用statefulset部署的有狀態應用宿主機宕機後應用高可用問題,參考文檔 https://www.infoq.cn/article/aMsCvWzhR1It5CxpDWXK

參考文檔:

https://github.com/kubernetes-sigs/kubespray/blob/master/docs/kubernetes-reliability.md
https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node/kubelet-eviction.md
https://www.qikqiak.com/post/kubelet-sync-node-status/
https://www.infoq.cn/article/aMsCvWzhR1It5CxpDWXK

Leave a Reply

Your email address will not be published. Required fields are marked *