您好,登錄后才能下訂單哦!
這篇文章給大家介紹k8s故障檢測與自愈的示例分析,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
組件故障
組件故障可以認為是節點故障的子類,只是故障來源是K8S基礎組件的一部分。
DNS故障:6個DNS Pod中的2個出現無法解析外部DNS名稱的情況。后果是大量線上業務因域名解析。
CNI故障:少數幾個節點的容器網絡和外部斷開,節點訪問自身的Pod IP沒有問題,但是其它節點無法訪問故障節點的Pod IP。這種情況下,Pod本機的健康檢查無效,導致故障實例持續存在,一定比例的業務請求失敗。
kubenurse會對ingress、dns、apiserver、kube-proxy進行網絡探測。
使用KubeNurse進行集群網絡監控
節點故障
硬件錯誤: CPU/Memory/磁盤故障
kernel問題: kernel deadlock/corrupted file systems
容器運行時錯誤: Docker假死
基礎設施服務故障: NTP故障
node-problem-detector
根源: 在kubernetes集群上,通常我們只是管制集群本身以及容器的穩定運行。但是這些穩定性都是強依賴節點node的穩定的。可是node的管理,在kubernetes是比較弱的,因為可能對于kubernetes的初始設計來說,這些應該是IaaS的事。但是隨著kubernetes的發展,它越來變成了一個操作系統,它管理的內容將越來越多,所以對于node的管理也將納入kuberntes里管理。所以延伸出了node problem detector這個項目。
Kubernetes支持兩種上報機制:
1、NodeCondition(節點狀況): 這是指永久性的錯誤,它將造成pod無法在這個節點運行。這個節點狀況只有在節點重啟后才會被重置
2、Event(事件): 影響節點的臨時性問題,但是它是對于系統診斷是有意義的。NPD就是利用kubernetes的上報機制,通過檢測系統的日志(例如centos中journal),把錯誤的信息上報到kuberntes的node上。
圖片故障節點上的事件,會記錄在宿主機的某些日志中。這些日志(例如內核日志)中噪音信息太多,NPD會提取其中有價值的信息,可以將這些信息報送給Prometheus,也會生成離線事件。這些信息可以推送到企業微信,人工處理。也可以對應到自愈系統的方法庫,自動恢復。在裸金屬K8S集群中,由于缺乏基礎設施的支撐,自動擴充節點可能無法實現,只能通過更加精細的自動化運維,治愈節點的異常狀態。
以CNI故障為例,可能的治愈流程如下:
鴻蒙官方戰略合作共建——HarmonyOS技術社區
查詢運維方法庫,如果找到匹配項,執行對應的運維動作
如果上述步驟無效,嘗試刪除節點上負責CNI的Pod,以重置節點的路由、Iptables配置
如果上述步驟無效,嘗試重啟容器運行時
告警,要求運維人員介入
部署NPD實踐你需要有一個k8s集群,必須有1個以上的worker節點。大家可以參考https://github.com/kubernetes/node-problem-detector。
主要參數: --prometheus-address: 默認綁定地址127.0.0.1,如果需要推送給promethues,需要修改。 --config.system-log-monitor: 節點問題檢測器將為每個配置啟動一個單獨的日志監視器.案例: config/kernel-monitor.json。 --config.custom-plugin-monito: 節點問題檢測器將為每個配置啟動一個單獨的自定義插件監視器。案例: config/custom-plugin-monitor.json
主要參數:
--prometheus-address: 默認綁定地址127.0.0.1,如果需要推送給promethues,需要修改。
--config.system-log-monitor: 節點問題檢測器將為每個配置啟動一個單獨的日志監視器.案例: config/kernel-monitor.json。
--config.custom-plugin-monito: 節點問題檢測器將為每個配置啟動一個單獨的自定義插件監視器。案例: config/custom-plugin-monitor.json
將代碼克隆到本地,按照自己的需求更改deployment文件中的DaemonSet,執行以下內容:
創建ConfigMap: kubectl create -f node-problem-detector-config.yaml 創建DaemonSet: kubectl create -f node-problem-detector.yaml
如何驗證NPD捕獲信息這部分,可以在測試集群的node幾點上做。
sudo sh -c "echo 'kernel: BUG: unable to handle kernel NULL pointer dereference at TESTING' >> /dev/kmsg" 可以在kubectl describe nodes x.x.x.x 中看到KernelOops事件的告警。 sudo sh -c "echo 'kernel: INFO: task docker:20744 blocked for more than 120 seconds.' >> /dev/kmsg" 可以在kubectl describe nodes x.x.x.x 中看到DockerHung事件的告警。
如果事件告警接到了promethues,可以配置策略,發送到微信。
關于k8s故障檢測與自愈的示例分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。