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
現在,您可以開啟網路瀏覽器,或使用 curl
或 wget
等工具訪問 pod 中的服務,就像它在本地執行一樣:
curl http://localhost:8080
這樣,您就可以直接檢查服務並與之互動、測試 API 端點或除錯問題,而無需將服務暴露在更廣泛的網路中。完成埠轉發後,可以在終端按下 Ctrl+C
停止埠轉發。
使用 kubectl port-forward
是除錯和測試 Kubernetes pod 中執行的服務的便捷方法,無需複雜的網路配置或將服務暴露在外部。
資源指標
kubectl top nodes
和 kubectl 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 世界,並保持應用程式的平穩執行。