【智簡聯接,萬物互聯】華為云·云享專家董昕:Serverless和微服務下, IoT的變革蓄勢待發
1344
2025-04-04
一 前言
在云原生時代,有大量的節點問題可能會影響節點上運行的 pod,例如:
基礎設施守護進程問題:ntp 服務關閉;
硬件問題:CPU、內存或磁盤損壞;
內核問題:內核死鎖、文件系統損壞;
容器運行時問題:無響應的運行時守護進程;
目前,這些問題對于集群管理堆棧中的上游層來說是不可見的,因此 Kubernetes 將繼續將 Pod 調度到壞節點。
為了解決這個問題,我們引入了新的守護進程節點問題檢測器,從各個守護進程中收集節點問題,并使它們對上行層可見。一旦上游層對這些問題有了可見性,我們就可以討論補救系統。
Kubernetes 針對與部署的Node節點,需要有一款工具能夠對齊進行持續性的檢測,包括內核、內存、系統線程、文件系統描述符等,針對Node節點進行檢測第一時間發現異常,以保障集群安全穩定。
二 node-problem-detector簡介
2.1 NPD簡介
節點問題檢測器旨在使各種節點問題對集群管理堆棧的上行層可見。它是一個在每個節點上運行的守護進程,檢測節點問題并將其報告給服務器。Node-problem-detector 既可以作為 DaemonSet 運行,也可以獨立運行。現在它作為默認啟用的 Kubernetes Addon 在 GCE 集群中運行。用于監視和報告節點的健康狀況(包括內核死鎖、OOM、系統線程數壓力、系統文件描述符壓力等指標)。 節點問題檢測器從各種守護進程收集節點問題,并以NodeCondition和Event的形式報告給 API Server。
2.2 Problem API
node-problem-detector 使用 Event 和 NodeCondition 向 apiserver 報告問題。
NodeCondition:使節點對 pod 不可用的永久性問題應報告為 NodeCondition。
Event:對 pod 影響有限但提供信息的臨時問題應報告為事件。
2.3 Problem 守護進程(Monitor)
Problem Daemon(在代碼內部也叫Monitor)是NPD的子守護進程,每個PD監控一個特定類型的節點故障,并報告給NPD。目前PD以Goroutine的形式運行在NPD中,未來會支持在獨立進程(容器)中運行并編排為一個Pod。在編譯期間,可以通過相應的標記禁用每一類PD。
問題守護進程是 node-problem-detector 的子守護進程。它監視特定類型的節點問題并將它們報告給節點問題檢測器。
問題守護進程可能是:
為專用 Kubernetes 用例設計的小型守護程序。
與 node-problem-detector 集成的現有節點健康監控守護程序。
目前,一個問題守護進程在 node-problem-detector 二進制文件中作為 goroutine 運行。未來,我們會將 node-problem-detector 和問題守護進程分離到不同的容器中,并按照 pod 規范組合它們。
通過設置相應的構建標記,可以在編譯時禁用每一類問題守護進程。如果在編譯時禁用它們,那么它們的所有構建依賴項、全局變量和后臺 goroutine 都將從已編譯的可執行文件中刪除。
支持的問題守護進程類型列表:
2.4 Exporter
導出器是節點問題檢測器的一個組件。它向某些后端報告節點問題和/或指標。其中一些可以在編譯時使用構建標簽禁用。支持的出口商列表:
三 部署測試
3.1 集群內部署
利用helm進行部署,部署完成后可以看到npd是以daemonset方式存在,在每個節點上都有運行的具體pod。
$ helm repo add deliveryhero https://charts.deliveryhero.io/ $ helm install deliveryhero/node-problem-detector --generate-name NAME: node-problem-detector-1646190796 LAST DEPLOYED: Wed Mar 2 11:13:20 2022 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: To verify that the node-problem-detector pods have started, run: kubectl --namespace=default get pods -l "app.kubernetes.io/name=node-problem-detector,app.kubernetes.io/instance=node-problem-detector-1646190796"
3.2 單機獨立部署
Node-problem-detector也可以直接獨立啟動,需要指定k8s-apiserver的地址以及配置inClusterConfig 為false,詳細可以參考獨立部署
四 配置參數
system-log-monitor相關參數
–config.system-log-monitor: system log monitor配置文件路徑,多個文件用逗號分隔,如config/kernel-monitor.json,NPD會為每一個配置文件生成單獨的log monitor。你可以使用不同的log monitors來監控不同的系統日志。
system-stats-monitor相關參數
–config.system-stats-monitor: system status monitor配置文件路徑,多個文件用逗號分隔,如config/system-stats-monitor.json,NPD會為每一個配置文件生成單獨的status monitor。你可以使用不同的status monitors來監控系統的不同狀態。
custom-plugin-monitor相關參數
–config.custom-plugin-monitor:用戶自定義插件配置文件路徑,多個文件用逗號分隔,如config/custom-plugin-monitor.json,NPD會為每一個配置文件生成單獨的自定義插件監視器。你可以使用不同的自定義插件監視器來監控不同的系統問題。
Kubernetes exporter相關參數
–enable-k8s-exporter:是否開啟上報信息到API Server,默認為true–apiserver-override:一個URI參數,用于自定義node-problem-detector連接apiserver的地址。如果–enable-k8s-exporter為false,則忽略此內容。格式與Heapster的源標志相同。例如,要在沒有身份驗證的情況下運行,請使用以下配置:http://APISERVER_IP:APISERVER_ … false
請參閱heapster文檔以獲取可用選項的完整列表。–address:綁定NPD服務器的地址。–port:NPD服務端口,如果為0,表示禁用NPD服務。
Prometheus exporter相關參數
–prometheus-address:綁定Prometheus抓取端點的地址,默認為127.0.0.1–prometheus-port:綁定Prometheus抓取端點的端口,默認為20257,使用0禁用
Stackdriver exporter相關參數
–exporter.stackdriver:Stackdriver exporter程序配置文件的路徑,例如:config/exporter/stackdriver-exporter.json,默認為空字符串。 設置為空字符串以禁用。
五 模擬測試
sudo sh -c "echo 'kernel: BUG: unable to handle kernel NULL pointer dereference at TESTING' >> /dev/kmsg"
sudo sh -c "echo 'kernel: INFO: task docker:20744 blocked for more than 120 seconds.' >> /dev/kmsg"
六 其他
如果鏡像拉取異常,可以嘗試使用我的鏡像:
通過自定義配置健康Node節點的規則,可以在K8s Api-server的事件中獲取到具體的告警信息。
node-problem-detector是一個K8S加載項(Addon),目的是將節點故障暴露給集群管理的上層組件。NPD通常運行為DaemonSet,也可以作為獨立進程運行。NPD會檢測各種各樣的節點問題,NodeCondition:當遇到永久性的節點故障,導致其不可用時,設置節點的NodeCondition,Event:可能對Pod產生影響的臨時信息。
參考鏈接
http://dockone.io/article/2434546
https://github.com/kubernetes/node-problem-detector
https://blog.gmem.cc/problem-detection-and-auto-repairing-in-k8s
Kubernetes 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。