應(yīng)用程序故障排查(kubectl)

應(yīng)用程序故障排查(kubectl)

常見問題

故障診斷

--- 排查Pods的故障

  • Pod始終處于Pending狀態(tài)

  • Pod始終處于Waiting狀態(tài)

  • Pod一直崩潰或運(yùn)行不正常

--- 排查Replication Controllers的故障

--- 排查Services的故障

  • 服務(wù)沒有端點(diǎn)信息

故障診斷

故障排查的第一步是對(duì)故障進(jìn)行分類。一般來說,應(yīng)用程序的故障可以分為下面幾個(gè)方面:

  • Pods的故障
  • ReplicationControllers的故障
  • Services的故障

插入一些比較常用的命令:

Kubectl get nodes:獲取所有kubenetes的節(jié)點(diǎn)
Kubectl get namespace:獲取所有
kubectl –n testnm get svc:獲取namesapce為testnm下所有的service
Kubectl –n testnm get pods –o wide: 獲取namesapce為testnm下的所有的pod,并可現(xiàn)實(shí)pod實(shí)例化在哪個(gè)kubectl的節(jié)點(diǎn)上
Kubectl –n testnm get pods:獲取namesapce為testnm下的所有的pod
Kubectl –n testnm logs [podName]:查看pod的日志
Kubectl –n testnm logs –f [podName]:實(shí)時(shí)查看pod的日志
Kubectl –n testnm describe pod [podName]:查看pod的狀態(tài)
kubectl -n testnm exec -it [podName] /bin/bash:進(jìn)入到指定的容器內(nèi)

排查Pods的故障

檢查Pod的問題首先應(yīng)該了解Pod所處的狀況。下面這個(gè)命令能夠獲得Pod當(dāng)前的狀態(tài)和近期的事件列表:
$ kubectl describe pods ${POD_NAME}

確認(rèn)清楚在Pod以及其中每一個(gè)容器的狀態(tài),是否都處于Runing?通過觀察容器的已運(yùn)行時(shí)間判斷它是否剛剛才重新啟動(dòng)過?

根據(jù)不同的運(yùn)行狀態(tài),用戶應(yīng)該采取不同的調(diào)查措施。

注解:

  Name:容器的名稱

  Ready:1/1    前1為可用的有多少個(gè),后1為總共多少個(gè)

  Status:運(yùn)行狀態(tài)(pending,waiting,running…)

  Restarts:重啟的次數(shù)

  Age:?jiǎn)?dòng)的總時(shí)間

  Ip:容器的ip地址

  Node:容器在kubenetes的哪個(gè)節(jié)點(diǎn)上啟動(dòng)
  • Pod始終處于Pending狀態(tài)

如果Pod保持在Pending的狀態(tài),這意味著它無法被正常的調(diào)度到一個(gè)節(jié)點(diǎn)上。通常來說,這是由于某種系統(tǒng)資源無法滿足Pod運(yùn)行的需求。觀察剛才kubectl describe命令的輸出內(nèi)容,其中應(yīng)該包括了能夠判斷錯(cuò)誤原因的消息。常見的原因有以下這些:

系統(tǒng)沒有足夠的資源:你也許已經(jīng)用盡了集群中所有的CPU或內(nèi)存資源。對(duì)于這種情況,你需要清理一些不在需要的Pod,調(diào)整它們所需的資源量,或者向集群中增加新的節(jié)點(diǎn)。在計(jì)算資源文檔有更詳細(xì)的說明。

用戶指定了hostPort:通過hostPort用戶能夠?qū)⒎?wù)暴露到指定的主機(jī)端口上,但這樣會(huì)限制Pod能夠被調(diào)度運(yùn)行的節(jié)點(diǎn)。在大多數(shù)情況下,hostPort配置都是沒有必要的,用戶應(yīng)該采用Service的方式暴露其對(duì)外的服務(wù)。如果用戶確實(shí)必須使用hostPort的功能,那么此Pod最多只能部署到和集群節(jié)點(diǎn)相同的數(shù)目

  • Pod始終處于Waiting狀態(tài)

Pod處在Waiting的狀態(tài),說明它已經(jīng)被調(diào)度分配到了一個(gè)工作節(jié)點(diǎn),然而它無法在那個(gè)節(jié)點(diǎn)上運(yùn)行。同樣的,在剛才kubectl describe命令的輸出內(nèi)容中,應(yīng)該包含有更詳細(xì)的錯(cuò)誤信息。最經(jīng)常導(dǎo)致Pod始終Waiting的原因是無法下載所需的鏡像(譯者注:由于國內(nèi)特殊的網(wǎng)絡(luò)環(huán)境,這類問題出現(xiàn)得特別普遍)。用戶可以從下面三個(gè)方面進(jìn)行排查:

請(qǐng)確保正確書寫了鏡像的名稱

請(qǐng)檢查所需鏡像是否已經(jīng)推送到了倉庫中

手工的在節(jié)點(diǎn)上運(yùn)行一次docker pull <鏡像名稱>檢測(cè)鏡像能否被正確的拉取下來

  • Pod一直崩潰或運(yùn)行不正常

首先,查看正在運(yùn)行容器的日志。

$ kubectl logs <Pod名稱> <Pod中的容器名稱>

如果容器之前已經(jīng)崩潰過,通過以下命令可以獲得容器前一次運(yùn)行的日志內(nèi)容。

$ kubectl logs --previous <Pod名稱> <Pod中的容器名稱>

此外,還可以使用exec命令在指定的容器中運(yùn)行任意的調(diào)試命令。

$ kubectl exec <Pod名稱> -c <Pod中的容器名稱> -- <任意命令> <命令參數(shù)列表...>

Kubectl –n testnm exec -it [podName] /bin/bash 這條命令可以進(jìn)入到pod容器中

排查Replication Controllers的故障

Replication Controllers的邏輯十分直白,它的作用只是創(chuàng)建新的Pod副本,僅僅可能出現(xiàn)的錯(cuò)誤便是它無法創(chuàng)建正確的Pod,對(duì)于這種情況,應(yīng)該參考上面的『排查Pods的故障』部分進(jìn)行檢查。
也可以使用kubectl describe rc <控制器名稱>來顯示與指定Replication Controllers相關(guān)的事件信息。

排查Services的故障

Service為一系列后端Pod提供負(fù)載均衡的功能。有些十分常見的故障都可能導(dǎo)致Service無法正常工作,以下將提供對(duì)調(diào)試Service相關(guān)問題的參考。

首先,檢查Service連接的服務(wù)提供端點(diǎn)(endpoint),對(duì)于任意一個(gè)Service對(duì)象,apiserver都會(huì)為其創(chuàng)建一個(gè)端點(diǎn)資源(譯者注:即提供服務(wù)的IP地址和端口號(hào))。

這個(gè)命令可以查看到Service的端口資源:

$ kubectl get endpoints <Service名稱>
$ Kubectl –n testnm get pods –o wide
$ Kubectl –n testnm get endpoints [podName]

請(qǐng)檢查這個(gè)命令輸出端點(diǎn)信息中的端口號(hào)與實(shí)際容器提供服務(wù)的端口號(hào)是否一致。例如,如果你的Service使用了三個(gè)Nginx容器的副本(replicas),這個(gè)命令應(yīng)該輸出三個(gè)不同的IP地址的端點(diǎn)信息。

  • 服務(wù)沒有端點(diǎn)信息

如果剛剛的命令顯示Service沒有端點(diǎn)信息,請(qǐng)嘗試通過Service的選擇器找到具有相應(yīng)標(biāo)簽的所有Pod。假設(shè)你的Service描述選擇器內(nèi)容如下:

Kubectl –n testnm describe svc [svcName]

公共應(yīng)用技術(shù)部-內(nèi)部 > kubectl 常見問題排查方法 > image2019-1-23_9-48-5.png

可以使用以下命令找出相應(yīng)的Pod:

$ kubectl get pods --selector=name=nginx,type=frontend

找到了符合標(biāo)簽的Pod后,首先確認(rèn)這些被選中的Pod是正確,有無錯(cuò)選、漏選的情況。

如果被選中的Pod沒有問題,則問題很可能出在這些Pod暴露的端口沒有被正確的配置好。要是一個(gè)Service指定了containerPort,但被選中的Pod并沒有在配置中列出相應(yīng)的端口,它們就不會(huì)出現(xiàn)在端點(diǎn)列表中。

請(qǐng)確保所用Pod的containerPort與Service的containerPort配置信息是一致的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容