掌握 Kubernetes 故障排除技巧:kubectl命令的基本指南

Seal软件發表於2024-03-15

Kubernetes 徹底改變了容器編排,簡化了應用程式的管理和擴充套件。然而,與任何複雜系統一樣,Kubernetes 叢集也會遇到問題,需要及時解決才能保持最佳效能和可靠性。在本文中,我們將深入探討必要的 kubectl 命令,這些命令是診斷和排除 Kubernetes 叢集問題不可或缺的工具。無論您是新手還是經驗豐富的 Kubernetes 使用者,掌握這些命令都將使您有能力駕馭錯綜複雜的容器編排,確保應用程式的健康。

檢視叢集記錄報告

排除 Kubernetes 叢集故障的第一步是檢查其中發生的事件。kubectl get events --all-namespaces 命令能全面檢視所有名稱空間的事件,讓您發現與 pod、節點和其他資源相關的錯誤、警告和問題。

NAMESPACE   LAST SEEN   TYPE      REASON              OBJECT                   MESSAGE
default     5m          Normal    Scheduled           pod/my-pod               Successfully assigned default/my-pod to node-1
default     4m          Normal    Pulling             pod/my-pod               Pulling image "my-image:latest"
default     4m          Normal    Pulled              pod/my-pod               Successfully pulled image "my-image:latest"
default     4m          Normal    Created             pod/my-pod               Created container my-container
default     4m          Normal    Started             pod/my-pod               Started container my-container
kube-system 15m         Normal    RegisteredNode      node/node-1              Node node-1 event: Registered Node node-1 in Controller
...

下面是輸出結果中各列的細目:

  • NAMESPACE:事件發生的名稱空間。
  • LAST SEEN:事件最後一次出現的時間。
  • TYPE:型別:事件型別(如 Normal 或 Warning)。
  • REASON:事件發生的原因。
  • OBJECT:與事件相關的 Kubernetes 資源(如 pod、節點)。
  • MESSAGE:與事件相關的描述或訊息。

排除 pod 初始化故障

假設您遇到了 pod 無法正確初始化的問題。您可以使用 kubectl get events --all-namespaces 來識別與 pod 初始化失敗相關的事件,幫助您找出根本原因。

檢查 pod 日誌

當出現應用程式級問題時,檢查 pod 日誌至關重要。使用 kubectl logs <pod-name> -n <namespace> 檢視給定名稱空間中特定 pod 的日誌。該命令對於識別應用程式程式碼中的錯誤、異常或問題非常有用。

kubectl logs my-pod -n my-namespace

在這個例子中:

  • my-pod 是要從中獲取日誌的 pod 的名稱。
  • my-namespace 是 pod 所在的名稱空間。

除錯應用程式錯誤

想象一下,在 my-namespace 中名為 my-pod 的 pod 中執行著一個應用程式。如果應用程式報錯,您可以使用 kubectl logs 檢索特定的錯誤資訊,從而幫助除錯和解決問題。

描述資源

kubectl describe 命令提供有關各種 Kubernetes 資源(如 pod、節點和部署)的詳細資訊。透過執行 kubectl describe <resource> <resource-name> -n <namespace>,您可以訪問大量資料,包括事件、條件和配置詳情,幫助您找出問題的根源。

kubectl describe pod my-pod -n my-namespace

在這個例子中:

  • pod 是資源型別。
  • my-pod 是要描述的特定 pod 的名稱。
  • my-namespace是 pod 所在的名稱空間。

執行此命令後,將顯示指定 pod 的詳細資訊。輸出將包括有關 pod 的後設資料、條件、事件等資訊的不同部分。下面是輸出結果的示例:

Name:         my-pod
Namespace:    my-namespace
...
Containers:
  my-container:
    Container ID:   container-id
    Image:          my-image:latest
    ...
Conditions:
  Type              Status
  ----              ------
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
...
Events:
  Type     Reason       Age                 From               Message
  ----     ------       ----                ----               -------
  Normal   Scheduled    3m                  default-scheduler  Successfully assigned my-namespace/my-pod to node-1
  Normal   Pulled       2m                  kubelet, node-1    Container image "my-image:latest" already present on machine
  Normal   Created      2m                  kubelet, node-1    Created container my-container
  Normal   Started      2m                  kubelet, node-1    Started container my-container
...

輸出將包含指定 pod 的詳細資訊,包括其後設資料、容器資訊、條件和事件。這些資訊對於排除 pod 的故障會非常有用,比如初始化問題、就緒問題或與其生命週期相關的事件。

獲取 pod 資訊

命令:

kubectl get pods -n <namespace>

說明

kubectl get pods 命令用於檢索 Kubernetes 叢集中執行的 pod 的資訊。

-n <namespace> 指定要列出 pod 的名稱空間。請將 <namespace> 替換為您感興趣的實際名稱空間名稱。

示例

假設您有一個包含多個名稱空間的 Kubernetes 叢集,您想檢查 my-namespace 名稱空間中 pod 的狀態。您可以使用以下命令:

kubectl get pods -n my-namespace

執行該命令時,輸出結果可能如下:

NAME        READY   STATUS      RESTARTS   AGE
app-pod-1   1/1     Running     0          2d
app-pod-2   1/1     Running     0          1d
app-pod-3   0/1     Pending     0          1h
app-pod-4   1/1     Running     0          30m

檢查節點狀態

節點是 Kubernetes 叢集的支柱。為確保一切執行順利,可執行 kubectl get nodes 檢視所有節點的狀態。

kubectl get nodes

執行此命令後,您將看到叢集中所有節點的列表及其當前狀態。狀態可以是以下其中之一:

  • Ready:這是理想狀態。這意味著節點是健康的,可以接受和執行容器。
  • NotReady:這種狀態表示節點無法正常執行,或者遇到了妨礙其執行容器的問題。處於這種狀態的節點可能存在資源限制、網路問題或其他問題。
  • SchedulingDisabled:這種狀態意味著節點被明確標記為不可排程,從而無法在其上排程新容器。這對於維護或故障排除很有用。
  • Unknown:在某些情況下,由於與 Kubernetes 控制平面的通訊問題,節點的狀態可能是未知的。

理想情況下,在一個健康的 Kubernetes 叢集中,所有節點都應處於 "Ready"狀態

示例

假設您執行 kubectl get nodes 並看到以下輸出:

NAME       STATUS     ROLES    AGE   VERSION
node-1     Ready      <none>   30d   v1.21.3
node-2     Ready      <none>   30d   v1.21.3
node-3     NotReady   <none>   5m    v1.21.3

在容器中執行

有時,除錯需要親自動手。透過 kubectl exec,您可以使用 /bin/bash 以互動方式進入容器。當您需要在容器內調查問題時,這一點尤其有用。

示例

假設在名稱空間 my-namespace 中有一個名為 my-pod 的 Kubernetes pod。在這個 pod 中,有一個名為 my-container 的容器。您懷疑這個容器中存在問題,並想進行互動式調查。

下面是使用 kubectl exec 的方法:

kubectl exec -it my-pod -n my-namespace -- /bin/bash

在該命令中:

  • -it 用於指定互動式終端,允許您與容器內的 shell 進行互動。
  • my-pod 是要訪問的 pod 的名稱。
  • -n my-namespace 指定 pod 所在的名稱空間。
  • -- /bin/bash 指定要在容器內執行的命令。在本例中,它是 /bin/bash,用於啟動 Bash shell。

執行命令後,您將進入容器的 shell。現在,您可以像登入到容器的作業系統一樣,互動式地執行命令、檢查檔案、檢視日誌和排除故障。

下面是一個會話的案例:

root@my-pod:/app# ls
file1.txt  file2.txt  file3.txt
root@my-pod:/app# cat file1.txt
Contents of file1.txt
root@my-pod:/app# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   1234   567 ?        Ss   Sep01   0:01 /my-app
...
root@my-pod:/app# exit

完成除錯或故障排除任務後,可以鍵入 exit 退出容器的 shell。這將返回本地終端。

使用 kubectl exec/bin/bash 是診斷和解決容器內問題的有力工具,在傳統除錯方法不充分的情況下尤為重要。

用於服務除錯的埠轉發

要除錯 pod 內執行的服務,可以使用 kubectl port-forward 將本地埠轉發到 pod 上的埠。這樣就能像訪問本地執行的服務一樣訪問這些服務,從而方便除錯和測試。

示例

假設您在名稱空間 my-namespace 中有一個名為 my-app-pod 的 Kubernetes pod,它在 8080 埠上託管了一個服務,您想訪問該服務進行除錯。

下面是使用 kubectl port-forward 將本地埠轉發到 pod 埠的方法:

kubectl port-forward my-app-pod -n my-namespace 8080:8080

在該命令中:

  • my-app-pod 是要將流量轉發到的 pod 的名稱。
  • -n my-namespace 指定 pod 所在的名稱空間。
  • 8080:8080 表示要將流量從本地計算機的 8080 埠轉發到 pod 的 8080 埠。

建立埠轉發後,您就可以透過連線本地計算機上的
http://localhost:8080 訪問 pod 內執行的服務。向本地 8080 埠發出的任何請求都將被轉發到 pod 上的相應埠。下面是一個案例:

Forwarding from 127.0.0.1:8080 -> 8080
Handling connection for 8080

現在,您可以開啟網路瀏覽器,或使用 curlwget 等工具訪問 pod 中的服務,就像它在本地執行一樣:

curl http://localhost:8080

這樣,您就可以直接檢查服務並與之互動、測試 API 端點或除錯問題,而無需將服務暴露在更廣泛的網路中。完成埠轉發後,可以在終端按下 Ctrl+C 停止埠轉發。

使用 kubectl port-forward 是除錯和測試 Kubernetes pod 中執行的服務的便捷方法,無需複雜的網路配置或將服務暴露在外部。

資源指標

kubectl top nodeskubectl top pods -n <namespace> 可實時瞭解 CPU 和記憶體的使用情況,幫助最佳化資源。

示例

假設您想監控 Kubernetes 叢集中節點和 pod 的 CPU 和記憶體使用情況。

節點指標

要檢視節點的資源使用指標,可以使用以下命令:

kubectl top nodes

下面是輸出結果的例子:

NAME       CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
node-1     100m         5%     1234Mi          40%
node-2     80m          4%     987Mi           32%

在該輸出中:

  • CPU(cores) 顯示以毫核為單位的 CPU 使用率。
  • CPU% 表示 CPU 使用率的百分比。
  • MEMORY(bytes) 以兆位元組為單位顯示記憶體使用情況。
  • MEMORY% 表示記憶體使用百分比。

您可以快速識別 CPU 或記憶體負載較高的節點,並採取相應措施,如縮放或調整資源分配。

Pod 指標

要檢視特定名稱空間中 pod 的資源使用指標,請使用以下命令:

kubectl top pods -n my-namespace

my-namespace替換為執行 pod 的實際名稱空間。下面是 pod 指標輸出的示例:

NAME          CPU(cores)   MEMORY(bytes)
my-pod-1      50m          128Mi
my-pod-2      30m          64Mi
my-pod-3      70m          256Mi

在該輸出中:

  • CPU(cores) 顯示 pod 的 CPU 使用情況,單位為毫核。
  • MEMORY(bytes) 以位元組為單位顯示 pod 的記憶體使用情況。

透過監控 pod 指標,您可以識別資源密集型 pod,最佳化資源分配,並就 pod 的擴充套件或資源請求和限制做出明智的決策。

kubectl top 命令提供的資源使用指標對於確保 Kubernetes 叢集中資源的有效使用、識別效能瓶頸以及最佳化應用程式的資源分配都很有價值。

檢查 API 伺服器健康狀況

Kubernetes API 伺服器對叢集執行至關重要。使用 kubectl get --raw=/healthz 查詢其健康狀況端點,可以快速評估其健康狀況。

在該輸出中:

 kubectl get --raw=/healthz
 ok

響應 “ok” 表示 API 伺服器正常執行。

如果 API 伺服器不健康或出現問題,您可能會收到錯誤資訊或非 “ok” 響應,這可能表明存在需要調查和解決的問題。

驗證版本

最後,確保 Kubernetes 客戶端和伺服器版本之間的相容性至關重要。使用 kubectl version 獲取兩個版本的資訊。

示例

要檢查客戶端和伺服器版本,只需執行:

kubectl version

輸出結果:

Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3", ...
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3", ...

在該輸出中:

  • Client Version 提供了本地 kubectl 客戶端的相關資訊。其中包括主版本、次版本和 GitVersion,後者指定了客戶端的確切版本。
  • Server Version 提供 kubectl 客戶端所連線的 Kubernetes API 伺服器的資訊。它包括伺服器的主版本、次版本和 GitVersion。

確保客戶端版本與伺服器版本匹配或相容。主要版本差異可能表示不相容,應加以解決。一般建議客戶端和伺服器版本儘量保持一致,以避免出現相容性問題。

檢查版本與 kubectl version 的相容性是確保 Kubernetes 環境穩定、執行良好的必要步驟。

結論

掌握 Kubernetes 故障排除是任何 Kubernetes 管理員或開發人員的一項重要技能。本文概述的 kubectl 命令是您診斷和解決叢集問題的盟友。請記住,有效的故障排除通常需要結合使用這些命令以及對應用程式和基礎架構的深入瞭解。此外,考慮實施 Prometheus 和 Grafana 等監控和可觀察性解決方案,以主動發現和解決問題,確保 Kubernetes 叢集的穩定性和效能。透過利用這些工具和技術,您可以自信地駕馭複雜的 Kubernetes 世界,並保持應用程式的平穩執行。

相關文章