iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 23
0
DevOps

從題目中學習k8s系列 第 23

【從題目中學習k8s】-【Day23】TrobleShooting 概念


title: 【從題目中學習k8s】-【Day23】TrobleShooting 概念
description: 以無比的恆毅力堅持30天鍊成鐵人--連續30天,一天發表一篇IT技術文章

【從題目中學習k8s】-【Day23】TrobleShooting 概念

tags: DevOps CICD K8s Docker

前言

到今天為止,我們已經練習了14題基本題了,也介紹了很多物件和觀念。接下來筆者想介紹一些進階的Trobleshooting問題。這類考題通常會提供一個 K8s 集群環境,在環境中有一些bug,例如 Pod 無法新增、kube-apiserver 故障或路徑問題等等,要求你解決這些問題。今天筆者想介紹一些Trobleshooting的技巧,包含常用指令和問題分析等等,之後幾天也會介紹一連串Trobleshooting的考題,會搭配前面學過的東東一起使用哦~ 所以前面介紹過的東西要把握住才行~

因為讀者們沒有這樣的"有bug的集群環境",可能沒辦法自己練習,會缺少一點帶入感,比較可惜。所以筆者會盡量講的詳細一點,讓大家能夠只用看的就能了解,希望大家包容><


Trobleshooting方法

為了追蹤和找出 K8s 集群中執行的容器應用出現的問題,經常透過以下這些查錯方法:

  1. 檢視 K8s 目前執行的階段資訊,特別是與物件連接的Event事件。這些事件紀錄了相關主題、發生時間、最近發生時間、發生次數及事件原因等,對於Trobleshooting很有幫助。此外,透過檢視物件的執行階段資料,我們還可以發現參數錯誤、連結錯誤、狀態例外等問題
  2. 對於服務、容器方面的問題,可能需要深入容器內部進行診斷,此時可以透過檢視容器的執行記錄檔來找出問題
  3. 對於某些複雜問題,例如 Pod 調度排程這類的問題,涉及到整個集群的節點,因此可能需要查找節點內的服務紀錄檔來debug。例如蒐集 Control Plane 上的kube-apiserverkube-schedulekube-controler-managerNode 上的 kubeletkube-proxy 等等物件的log。

透過綜合判斷各種資訊,就能找到問題所在了


Trobleshooting常用指令

  • 檢視物件列表
$ kubectl get <resource-objects>
  • 詳細描述物件資訊
$ kubectl describe <resource-objects> <object-name>

通常kubectl describe命令就可以看出物件有bug的地方,可以顯示出 Pod 的設定、狀態、最近的Event等,非常有用~

  • 查看Pod log資訊
$ kubectl logs <Pod-name>
## -f 參數是讓log不停輸出最新的event
$ kubectl logs -f <pod-name>
## 若Pod內有兩個以上的container,要在指令後方加上 container name,否則會發生error
$ kubectl logs -f <pod-name> <container-name>

以上三個指令看起來非常簡單,而且像廢話,但是要確實把握做到,常常系統已經列出問題所在了,但筆者粗心沒看到,因此就浪費了很多時間debug,要特別注意喔~

查找問題的時候,建議一開始先 kubectl get all -A,找出無法運行的元件,比較快找出問題所在

  • 檢視服務紀錄檔
    因為一般 K8s 集群是 based on Linux,是將 K8s 安裝在Linux主機上,並且使用systemd系統管理 K8s 服務,那麼systemdjournal系統會接管服務程式的輸出紀錄檔。在這種環境中,可以透過使用systemd statusjournalctl工具來檢視系統服務的紀錄檔。例如:
$ systemctl status kubelet
$ systemctl status kube-controller-manager -l
$ journalctl -u kube-controller-manager
$ journalctl -u kubelet

通常Node狀態是NotReady,都是因為 kubelet 發生問題,這時要先ssh到節點內,再透過journalctl -u kubelet命令查找問題

  • 檢視Control Plane和Service的Address
$ kubectl cluster-info

常見問題

筆者整理了一些常見的問題,還有可能的解決方法 (但不是一定,還是要視情況而定,畢竟每個集群環境不同)

  • Control Plane Failure
    這類問題包含 Pod 無法調度、認證沒通過,找不到目標檔案等等。建議解決方法可透過:
    • 檢查kube-system的物件
    • 檢查static pod路徑

要如何確認 Pod 運行在哪個Node上,可以透過kubectl get po -o wide命令,或看 Pod 名子,名子後面有接 master 的,通常代表運行在Control Plane上,可從Control Plane下手

  • Pod 處於 Pending STATUS
    可能是image不存在,檢查image的Server (如Docker Hub)是否正常運行,或是網路狀況等等
  • Service
    通常是 Service 的Port mapping沒設定好,或是 Service 沒選取到Pod,可以檢查 Pod 的 label 和 Service 的 Selector
  • NetworkPolicy
    檢查NetworkPolicy的ingress和egress IP是否設定正確

要有耐心可以查文件


結論

今天做了 Trobleshooting 的前導介紹,以及一些常見的問題,做這類的題目切記:要有耐心,耐心非常重要,一定要慢慢查找問題,不要著急,要記得考試時是可以查找官方文件的哦~ 好啦,今天就到這囉~ 謝謝大家~

參考資料

kubectl Cheat Sheet
Troubleshoot Clusters
journalctl︰查詢 systemd 日誌

Thank you!

You can find me on

  • george4908090@gmail.com

上一篇
【從題目中學習k8s】-【Day22】第十四題 - ConfigMap
下一篇
【從題目中學習k8s】-【Day24】第十五題 - TroubleShooting 1
系列文
從題目中學習k8s31

尚未有邦友留言

立即登入留言