通過NPD在kubernetes叢集上增強節點的錯誤檢測能力
根源
在kubernetes叢集上,通常我們只是管制叢集本身以及容器的穩定執行。但是這些穩定性都是強依賴節點node的穩定的。可是node的管理,在kubernetes是比較弱的,因為可能對於kubernetes的初始設計來說,這些應該是IaaS的事。但是隨著kubernetes的發展,它越來變成了一個作業系統,它管理的內容將越來越多,所以對於node的管理也將納入kuberntes裡管理。所以延伸出了node problem detector(參考1)這個專案。
Node的主要影響kuberntes穩定性的因素
硬體錯誤
- CPU壞了
- Memory壞了
- 磁碟壞了
kernel問題
- kernel deadlock (核心死鎖)
- corrupted file systems (檔案系統崩潰)
- unresponsive runtime daemons (系統執行後臺程序無響應)
docker問題
- unresponsive runtime daemons (docker後臺程序無響應)
- docker image error (docker檔案系統錯誤)
Node問題上報機制
Kubernetes支援兩種上報機制:
- NodeCondition(節點狀況): 這是指永久性的錯誤,它將造成pod無法在這個節點執行。這個節點狀況只有在節點重啟後才會被重置
- Event(時間): 影響節點的臨時性問題,但是它是對於系統診斷是有意義的
Node Problem Detector(NPD)
NPD就是利用kubernetes的上報機制,通過檢測系統的日誌(例如centos中journal),把錯誤的資訊上報到kuberntes的node上。
NPD的架構
(圖來源於mastering kubernetes)

NPD支援多種monitor來檢測不同的錯誤型別。然後它把對應的資訊上報給api server。
後面NPD也在計劃提供一個remedy controller(治療控制器),通過捕獲這些資訊作些補救的處理。例如在公有云可以將硬體錯誤的機器自動換掉等
部署NPD實踐
前提,你需要有一個k8s叢集,必須有1個以上的worker節點。有需要你可以在阿里雲的容器服務裡,幾分鐘內建立一個k8s叢集。
我將對應的內容放到了我的github上,大家可以參考,地址在:
https://github.com/vipdocker/npd-centos
因為官網的文件描述不是太清楚,以及對於centos journal的支援也是剛完成,所以文件還跟不上,也造成了我一些彎路
具體步驟參考上面github的README就可,這裡就不囉嗦了。
如何驗證NPD捕獲資訊
通常這些錯誤是比較難真實測試,只能通過傳送訊息到journal來模擬。
- 傳送一個kernel deadlock型別的condition:在對應的node節點上執行以下操作
echo "task docker:7 blocked for more than 300 seconds." |systemd-cat -t kernel
然後通過k8s控制檯,你可以看到對應的資訊:

- 傳送一個event
echo "Error trying v2 registry: failed to register layer: rename /var/lib/docker/image/test /var/lib/docker/image/ddd: directory not empty.*" |systemd-cat -t docker
然後通過以下命令來對應的event
kubectl describe node/xxxx
小結
通過NPD,我們可以看到一種node錯誤檢測的增強手段, 後面它也將提供更多的plugin的整合機制來整合其它的監控系統,例如nagios等。
我們或許會看到這樣的一個k8s,它已經包羅永珍,不在需要“依賴”其它就可以完成的管理好一個叢集,它將更像一個分散式的OS。
參考
- ofollow,noindex" target="_blank">https://kubernetes.io/docs/tasks/debug-application-cluster/monitor-node-health/
- https://github.com/fabric8io/kubernetes-model/blob/master/vendor/k8s.io/kubernetes/cluster/addons/node-problem-detector/npd.yaml