新聞中心
調(diào)試 Pod
調(diào)試 Pod 的第一步是查看 Pod 信息。用如下命令查看 Pod 的當(dāng)前狀態(tài)和最近的事件:

10年的秭歸網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營銷網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整秭歸建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“秭歸網(wǎng)站設(shè)計(jì)”,“秭歸網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
kubectl describe pods ${POD_NAME}
查看一下 Pod 中的容器所處的狀態(tài)。這些容器的狀態(tài)都是 ?Running ?嗎?最近有沒有重啟過?
后面的調(diào)試都是要依靠 Pod 的狀態(tài)的。
Pod 停滯在 Pending 狀態(tài)
如果一個(gè) Pod 停滯在 ?Pending ?狀態(tài),表示 Pod 沒有被調(diào)度到節(jié)點(diǎn)上。通常這是因?yàn)?nbsp;某種類型的資源不足導(dǎo)致無法調(diào)度。 查看上面的 ?kubectl describe ...? 命令的輸出,其中應(yīng)該顯示了為什么沒被調(diào)度的原因。 常見原因如下:
- 資源不足: 你可能耗盡了集群上所有的 CPU 或內(nèi)存。此時(shí),你需要?jiǎng)h除 Pod、調(diào)整資源請(qǐng)求或者為集群添加節(jié)點(diǎn)。
- 使用了 ?
hostPort?: 如果綁定 Pod 到 ?hostPort?,那么能夠運(yùn)行該 Pod 的節(jié)點(diǎn)就有限了。 多數(shù)情況下,?hostPort?是非必要的,而應(yīng)該采用 Service 對(duì)象來暴露 Pod。 如果確實(shí)需要使用 ?hostPort?,那么集群中節(jié)點(diǎn)的個(gè)數(shù)就是所能創(chuàng)建的 Pod 的數(shù)量上限。
Pod 停滯在 Waiting 狀態(tài)
如果 Pod 停滯在 ?Waiting ?狀態(tài),則表示 Pod 已經(jīng)被調(diào)度到某工作節(jié)點(diǎn),但是無法在該節(jié)點(diǎn)上運(yùn)行。 同樣,?kubectl describe ...? 命令的輸出可能很有用。 ?Waiting ?狀態(tài)的最常見原因是拉取鏡像失敗。要檢查的有三個(gè)方面:
- 確保鏡像名字拼寫正確
- 確保鏡像已被推送到鏡像倉庫
- 嘗試手動(dòng)是否能拉取鏡像。例如,如果你在你的 PC 上使用 Docker,請(qǐng)運(yùn)行 ?
docker pull <鏡像>?。
Pod 處于 Crashing 或別的不健康狀態(tài)
一旦 Pod 被調(diào)度,就可以采用 調(diào)試運(yùn)行中的 Pod 中的方法來進(jìn)一步調(diào)試。
Pod 處于 Running 態(tài)但是沒有正常工作
如果 Pod 行為不符合預(yù)期,很可能 Pod 描述(例如你本地機(jī)器上的 ?mypod.yaml?)中有問題, 并且該錯(cuò)誤在創(chuàng)建 Pod 時(shí)被忽略掉,沒有報(bào)錯(cuò)。 通常,Pod 的定義中節(jié)區(qū)嵌套關(guān)系錯(cuò)誤、字段名字拼錯(cuò)的情況都會(huì)引起對(duì)應(yīng)內(nèi)容被忽略掉。 例如,如果你誤將 ?command ?寫成 ?commnd?,Pod 雖然可以創(chuàng)建,但它不會(huì)執(zhí)行 你期望它執(zhí)行的命令行。
可以做的第一件事是刪除你的 Pod,并嘗試帶有 ?--validate? 選項(xiàng)重新創(chuàng)建。 例如,運(yùn)行 ?kubectl apply --validate -f mypod.yaml?。 如果 ?command ?被誤拼成 ?commnd?,你將會(huì)看到下面的錯(cuò)誤信息:
I0805 10:43:25.129850 46757 schema.go:126] unknown field: commnd
I0805 10:43:25.129973 46757 schema.go:129] this may be a false alarm, see https://github.com/Kubernetes/kubernetes/issues/6842
pods/mypod接下來就要檢查的是 API 服務(wù)器上的 Pod 與你所期望創(chuàng)建的是否匹配 (例如,你原本使用本機(jī)上的一個(gè) YAML 文件來創(chuàng)建 Pod)。 例如,運(yùn)行 ?kubectl get pods/mypod -o yaml > mypod-on-apiserver.yaml?,之后 手動(dòng)比較 ?mypod.yaml? 與從 API 服務(wù)器取回的 Pod 描述。 從 API 服務(wù)器處獲得的 YAML 通常包含一些創(chuàng)建 Pod 所用的 YAML 中不存在的行,這是正常的。 不過,如果如果源文件中有些行在 API 服務(wù)器版本中不存在,則意味著 Pod 規(guī)約是有問題的。
調(diào)試副本控制器
副本控制器相對(duì)比較簡單直接。它們要么能創(chuàng)建 Pod,要么不能。 如果不能創(chuàng)建 Pod,請(qǐng)參閱上述說明調(diào)試 Pod。
你也可以使用 ?kubectl describe rc ${CONTROLLER_NAME}? 命令來檢視副本控制器相關(guān)的事件。
調(diào)試 Service
服務(wù)支持在多個(gè) Pod 間負(fù)載均衡。 有一些常見的問題可以造成服務(wù)無法正常工作。 以下說明將有助于調(diào)試服務(wù)的問題。
首先,驗(yàn)證服務(wù)是否有端點(diǎn)。對(duì)于每一個(gè) Service 對(duì)象,API 服務(wù)器為其提供 對(duì)應(yīng)的 ?endpoints ?資源。
通過如下命令可以查看 endpoints 資源:
kubectl get endpoints ${SERVICE_NAME}
確保 Endpoints 與服務(wù)成員 Pod 個(gè)數(shù)一致。 例如,如果你的 Service 用來運(yùn)行 3 個(gè)副本的 nginx 容器,你應(yīng)該會(huì)在 Service 的 Endpoints 中看到 3 個(gè)不同的 IP 地址。
服務(wù)缺少 Endpoints
如果沒有 Endpoints,請(qǐng)嘗試使用 Service 所使用的標(biāo)簽列出 Pod。 假定你的服務(wù)包含如下標(biāo)簽選擇算符:
...
spec:
- selector:
name: nginx
type: frontend你可以使用如下命令列出與選擇算符相匹配的 Pod,并驗(yàn)證這些 Pod 是否歸屬于創(chuàng)建的服務(wù):
kubectl get pods --selector=name=nginx,type=frontend
驗(yàn)證 Pod 的 ?containerPort ?與服務(wù)的 ?targetPort ?是否匹配。
分享文章:創(chuàng)新互聯(lián)kubernetes教程:Kubernetes調(diào)試Pod
文章分享:http://m.fisionsoft.com.cn/article/cddcpej.html


咨詢
建站咨詢
