K8s任務 應用故障排查

2022-09-07 12:15:09 字數 2147 閱讀 7765

故障排查的第一步是先給問題分類。問題是什麼?是關於 pods、replication controller 還是 service?

除錯 pod 的第一步是檢視 pod 資訊。用如下命令檢視 pod 的當前狀態和最近的事件:

kubectl describe pods $
檢視一下 pod 中的容器所處的狀態。這些容器的狀態都是 running 嗎?最近有沒有重啟過?

後面的除錯都是要依靠 pod 的狀態的。

如果乙個 pod 停滯在 pending 狀態,表示 pod 沒有被排程到節點上。通常這是因為 某種型別的資源不足導致無法排程。 檢視上面的 kubectl describe ... 命令的輸出,其中應該顯示了為什麼沒被排程的原因。 常見原因如下:

如果 pod 停滯在 waiting 狀態,則表示 pod 已經被排程到某工作節點,但是無法在該節點上執行。 同樣,kubectl describe ... 命令的輸出可能很有用。 waiting 狀態的最常見原因是拉取映象失敗。要檢查的有三個方面:

如果 pod 行為不符合預期,很可能 pod 描述(例如你本地機器上的 mypod.yaml)中有問題, 並且該錯誤在建立 pod 時被忽略掉,沒有報錯。 通常,pod 的定義中節區巢狀關係錯誤、欄位名字拼錯的情況都會引起對應內容被忽略掉。 例如,如果你誤將 command 寫成 commnd,pod 雖然可以建立,但它不會執行 你期望它執行的命令列。

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

pods/mypod

接下來就要檢查的是 api 伺服器上的 pod 與你所期望建立的是否匹配 (例如,你原本使用本機上的乙個 yaml 檔案來建立 pod)。 例如,執行 kubectl get pods/mypod -o yaml > mypod-on-apiserver.yaml,之後 手動比較 mypod.yaml 與從 api 伺服器取回的 pod 描述。 從 api 伺服器處獲得的 yaml 通常包含一些建立 pod 所用的 yaml 中不存在的行,這是正常的。 不過,如果如果原始檔中有些行在 api 伺服器版本中不存在,則意味著 pod 規約是有問題的。

副本控制器相對比較簡單直接。它們要麼能建立 pod,要麼不能。 如果不能建立 pod,請參閱上述說明除錯 pod。

你也可以使用 kubectl describe rc $ 命令來檢視副本控制器相關的事件。

服務支援在多個 pod 間負載均衡。 有一些常見的問題可以造成服務無法正常工作。 以下說明將有助於除錯服務的問題。

首先,驗證服務是否有端點。對於每乙個 service 物件,api 伺服器為其提供 對應的 endpoints 資源。

通過如下命令可以檢視 endpoints 資源:

kubectl get endpoints $
確保 endpoints 與服務成員 pod 個數一致。 例如,如果你的 service 用來執行 3 個副本的 nginx 容器,你應該會在服務的 endpoints 中看到 3 個不同的 ip 位址。

如果沒有 endpoints,請嘗試使用 service 所使用的標籤列出 pod。 假定你的服務包含如下標籤選擇算符:

...

spec:

- selector:

name: nginx

type: frontend

你可以使用如下命令列出與選擇算符相匹配的 pod,並驗證這些 pod 是否歸屬於建立的服務:

kubectl get pods --selector=name=nginx,type=frontend
驗證 pod 的 containerport 與服務的 targetport 是否匹配。

如果上述方法都不能解決你的問題,請按照 除錯服務文件中的介紹, 確保你的 service 處於 running 態,有 endpoints 被建立,pod 真的在提供服務; dns 服務已配置並正常工作,iptables 規則也以安裝並且 kube-proxy 也沒有異常行為。

你也可以訪問故障排查文件來獲取更多資訊。

k8s 執行應用

kubect建立deployment deployment 建立replicaset 根據replicaset 建立pod 命名方式 relicaset 的命名方式 deployment名稱 隨機數 pod命名方式 relicaset 隨機數 1 通過kubetcl 建立 kubectl run n...

K8s部署prometheus監控K8s細節

prometheus 一些配置檔案可以再github上找到。部署 root kube prometheus manifests 目錄下所有檔案 部署 root kube prometheus manifests setup 目錄下所有檔案 要注意的是自己要建立乙個工作空間 如果報錯執行下面語句 部署...

k8s 多租戶 k8s 基礎介紹

備註 1 每乙個pod裡執行著乙個特殊的容器 pause容器,其他容器都是業務容器,這些業務容器共享pause容器的網路棧和volume 邏輯卷 掛載卷。因此他們之間的通訊和資料交換更為高效。2 k8s設計了pod物件,將每個服務程序包裝到相應的pod中,使其成為pod中執行的乙個容器 contai...