集群故障处理之处理思路以及健康状态检查(三十三)
前言? ? ? ? ? ? ? ?
按照筆者的教程,大家應該都能夠比較順暢的完成k8s集群的部署,不過由于環(huán)境、配置以及對Linux、k8s的不了解會導致很多問題、異常和故障,這里筆者分享一些處理技巧和思路,以及部分常見的問題,以供大家參考和學習。
總之,出現(xiàn)問題不要慌,先根據(jù)異常、故障癥狀初步推敲問題的所在,然后結合相關命令、工具、日志推敲出具體問題。其中,具體的日志內(nèi)容是關鍵,請務必獲得相關異常的詳細日志進行診斷,而不是被表象所迷惑,或者根據(jù)表象問題(比如“XXXX”pod崩潰了)去猜、搜索或者請教他人。總體上,思路如下圖所示:
如果問題實在無法解決或者無法確定是哪里的配置以及操作不當引起的,可以試著重置節(jié)點以及重置集群。
如果出現(xiàn)問題,我們應該怎么去分析和解決問題呢?下面,筆者將分享一些思路和經(jīng)驗:
目錄
健康狀態(tài)檢查——初診
組件、插件健康狀態(tài)檢查
Kubernetes 組件異常分析
節(jié)點健康狀態(tài)檢查
Pod健康狀態(tài)檢查
健康狀態(tài)檢查——初診
首先,我們需要根據(jù)表象進行初步診斷,以便沿著線索按圖索驥。
組件、插件健康狀態(tài)檢查
使用命令:
kubectl get componentstatus
或
kubectl get cs
健康情況下如下圖所示:
Kubernetes組件(插件)部分默認基于systemd運行,比如kubelet、docker等,我們需要使用以下命令確保其處于活動(active)狀態(tài):
systemctl status kubelet docker
而大部分的Kubernetes的組件則運行在命名空間為“kube-system”的靜態(tài)Pod 之中(參見“kubeadm init”一節(jié)),我們可以使用以下命令來查看這些Pod 的狀態(tài):
kubectl get pods -o wide -n kube-system
Kubernetes 組件異常分析
k8s組件主要分為Master組件和節(jié)點組件,Master組件對集群做出全局性決策(比如調(diào)度), 以及檢測和響應集群事件。如果Master組件出現(xiàn)問題,可能會導致集群不可訪問,Kubernetes API 訪問出錯,各種控制器無法工作等等。而節(jié)點組件在每個節(jié)點上運行,維護運行的Pod并提供 Kubernetes運行時環(huán)境。如果節(jié)點組件出現(xiàn)問題,可能會導致該節(jié)點異常并且該節(jié)點Pod無法正常運行和結束。
因此,根據(jù)不同的組件,可能會出現(xiàn)不同的異常。
kube-apiserver對外暴露了Kubernetes API,如果kube-apiserver出現(xiàn)異常可能會導致:
集群無法訪問,無法注冊新的節(jié)點
資源(Deployment、Service等)無法創(chuàng)建、更新和刪除
現(xiàn)有的不依賴Kubernetes API的pods和services可以繼續(xù)正常工作
etcd用于Kubernetes的后端存儲,所有的集群數(shù)據(jù)都存在這里。保持穩(wěn)定的etcd集群對于Kubernetes集群的穩(wěn)定性至關重要。因此,我們需要在專用計算機或隔離環(huán)境上運行etcd集群以確保資源需求。當etcd出現(xiàn)異常時可能會導致:
kube-apiserver無法讀寫集群狀態(tài),apiserver無法啟動
Kubernetes API訪問出錯
kubectl操作異常
kubelet無法訪問apiserver,僅能繼續(xù)運行已有的Pod
kube-controller-manager和kube-scheduler分別用于控制器管理和Pod 的調(diào)度,如果他們出現(xiàn)問題,則可能導致:
相關控制器無法工作
資源(Deployment、Service等)無法正常工作
無法注冊新的節(jié)點
Pod無法調(diào)度,一直處于Pending狀態(tài)
kubelet是主要的節(jié)點代理,如果節(jié)點宕機(VM關機)或者kubelet出現(xiàn)異常(比如無法啟動),那么可能會導致:
該節(jié)點上的Pod無法正常運行,如果節(jié)點關機,則當前節(jié)點上所有Pod都將停止運行
已運行的Pod無法伸縮,也無法正常終止
無法啟動新的Pod
節(jié)點會標識為不健康狀態(tài)
副本控制器會在其它的節(jié)點上啟動新的Pod
Kubelet有可能會刪掉當前運行的Pod
CoreDNS(在1.11以及以上版本的Kubernetes中,CoreDNS是默認的DNS服務器)是k8s集群默認的DNS服務器,如果其出現(xiàn)問題則可能導致:
無法注冊新的節(jié)點
集群網(wǎng)絡出現(xiàn)問題
Pod無法解析域名
kube-proxy是Kubernetes在每個節(jié)點上運行網(wǎng)絡代理。如果它出現(xiàn)了異常,則可能導致:
該節(jié)點Pod通信異常
節(jié)點健康狀態(tài)檢查
我們可以使用以下命令來檢查節(jié)點狀態(tài):
kubectl get nodes
其中,“Ready”表示節(jié)點已就緒,為正常狀態(tài),反之則該節(jié)點出現(xiàn)異常。節(jié)點出現(xiàn)問題,則Pod無法無法調(diào)度到該節(jié)點。
Pod健康狀態(tài)檢查
如果是集群應用出現(xiàn)異常,我們需要檢查相關Pod是否運行正常,可以使用以下命令:
kubectl get pods -o wide
如果存在命名空間,需要使用-n參數(shù)指定命名空間。如上圖所示,Pod為“Running”狀態(tài)才是正常。
如果Pod運行正常,但是又無法訪問(集群內(nèi)部、外部),這時,我們需要檢查Service是否正常,可使用以下命令:
kubectl get svc -o wide
往期內(nèi)容
Docker+ Kubernetes已成為云計算的主流(二十六)
容器化之后如何節(jié)省云端成本?(二十七)
了解Kubernetes主體架構(二十八)
使用Minikube部署本地Kubernetes集群(二十九)
使用kubectl管理k8s集群(三十)
使用Kubeadm創(chuàng)建k8s集群之部署規(guī)劃(三十一)
使用Kubeadm創(chuàng)建k8s集群之節(jié)點部署(三十二)
總結
以上是生活随笔為你收集整理的集群故障处理之处理思路以及健康状态检查(三十三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET加水印/验证码的NuGet包
- 下一篇: 使用Kubeadm创建k8s集群之节点部