按照筆者的教程,你們應該都可以比較順暢的完成k8s集羣的部署,不過因爲環境、配置以及對Linux、k8s的不瞭解會致使不少問題、異常和故障,這裏筆者分享一些處理技巧和思路,以及部分常見的問題,以供你們參考和學習。html
總之,出現問題不要慌,先根據異常、故障症狀初步推敲問題的所在,而後結合相關命令、工具、日誌推敲出具體問題。其中,具體的日誌內容是關鍵,請務必得到相關異常的詳細日誌進行診斷,而不是被表象所迷惑,或者根據表象問題(好比「XXXX」pod崩潰了)去猜、搜索或者請教他人。整體上,思路以下圖所示:node
若是問題實在沒法解決或者沒法肯定是哪裏的配置以及操做不當引發的,能夠試着重置節點以及重置集羣。docker
若是出現問題,咱們應該怎麼去分析和解決問題呢?下面,筆者將分享一些思路和經驗:後端
健康狀態檢查——初診api
組件、插件健康狀態檢查服務器
Kubernetes 組件異常分析網絡
節點健康狀態檢查架構
Pod健康狀態檢查ide
首先,咱們須要根據表象進行初步診斷,以便沿着線索按圖索驥。工具
使用命令:
kubectl get componentstatus
或
kubectl get cs
健康狀況下以下圖所示:
Kubernetes組件(插件)部分默認基於systemd運行,好比kubelet、docker等,咱們須要使用如下命令確保其處於活動(active)狀態:
systemctl status kubelet docker
而大部分的Kubernetes的組件則運行在命名空間爲「kube-system」的靜態Pod 之中(參見「kubeadm init」一節),咱們可使用如下命令來查看這些Pod 的狀態:
kubectl get pods -o wide -n kube-system
k8s組件主要分爲Master組件和節點組件,Master組件對集羣作出全局性決策(好比調度), 以及檢測和響應集羣事件。若是Master組件出現問題,可能會致使集羣不可訪問,Kubernetes API 訪問出錯,各類控制器沒法工做等等。而節點組件在每一個節點上運行,維護運行的Pod並提供 Kubernetes運行時環境。若是節點組件出現問題,可能會致使該節點異常而且該節點Pod沒法正常運行和結束。
所以,根據不一樣的組件,可能會出現不一樣的異常。
kube-apiserver對外暴露了Kubernetes API,若是kube-apiserver出現異常可能會致使:
集羣沒法訪問,沒法註冊新的節點
資源(Deployment、Service等)沒法建立、更新和刪除
現有的不依賴Kubernetes API的pods和services能夠繼續正常工做
etcd用於Kubernetes的後端存儲,全部的集羣數據都存在這裏。保持穩定的etcd集羣對於Kubernetes集羣的穩定性相當重要。所以,咱們須要在專用計算機或隔離環境上運行etcd集羣以確保資源需求。當etcd出現異常時可能會致使:
kube-apiserver沒法讀寫集羣狀態,apiserver沒法啓動
Kubernetes API訪問出錯
kubectl操做異常
kubelet沒法訪問apiserver,僅能繼續運行已有的Pod
kube-controller-manager和kube-scheduler分別用於控制器管理和Pod 的調度,若是他們出現問題,則可能致使:
相關控制器沒法工做
資源(Deployment、Service等)沒法正常工做
沒法註冊新的節點
Pod沒法調度,一直處於Pending狀態
kubelet是主要的節點代理,若是節點宕機(VM關機)或者kubelet出現異常(好比沒法啓動),那麼可能會致使:
該節點上的Pod沒法正常運行,若是節點關機,則當前節點上全部Pod都將中止運行
已運行的Pod沒法伸縮,也沒法正常終止
沒法啓動新的Pod
節點會標識爲不健康狀態
副本控制器會在其它的節點上啓動新的Pod
Kubelet有可能會刪掉當前運行的Pod
CoreDNS(在1.11以及以上版本的Kubernetes中,CoreDNS是默認的DNS服務器)是k8s集羣默認的DNS服務器,若是其出現問題則可能致使:
沒法註冊新的節點
集羣網絡出現問題
Pod沒法解析域名
kube-proxy是Kubernetes在每一個節點上運行網絡代理。若是它出現了異常,則可能致使:
該節點Pod通訊異常
咱們可使用如下命令來檢查節點狀態:
kubectl get nodes
其中,「Ready」表示節點已就緒,爲正常狀態,反之則該節點出現異常。節點出現問題,則Pod沒法沒法調度到該節點。
若是是集羣應用出現異常,咱們須要檢查相關Pod是否運行正常,可使用如下命令:
kubectl get pods -o wide
若是存在命名空間,須要使用-n參數指定命名空間。如上圖所示,Pod爲「Running」狀態纔是正常。
若是Pod運行正常,可是又沒法訪問(集羣內部、外部),這時,咱們須要檢查Service是否正常,可以使用如下命令:
kubectl get svc -o wide