Kubernetes 徹底改變了容器編排,簡(jiǎn)化了應(yīng)用程序的管理和擴(kuò)展。然而,與任何復(fù)雜系統(tǒng)一樣,Kubernetes 集群也會(huì)遇到問(wèn)題,需要及時(shí)解決才能保持最佳性能和可靠性。在本文中,我們將深入探討必要的 kubectl
命令,這些命令是診斷和排除 Kubernetes 集群?jiǎn)栴}不可或缺的工具。無(wú)論您是新手還是經(jīng)驗(yàn)豐富的 Kubernetes 用戶,掌握這些命令都將使您有能力駕馭錯(cuò)綜復(fù)雜的容器編排,確保應(yīng)用程序的健康。
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-840185.html
查看集群記錄報(bào)告
排除 Kubernetes 集群故障的第一步是檢查其中發(fā)生的事件。kubectl get events --all-namespaces
命令能全面查看所有命名空間的事件,讓您發(fā)現(xiàn)與 pod、節(jié)點(diǎn)和其他資源相關(guān)的錯(cuò)誤、警告和問(wèn)題。
?
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
...
?
下面是輸出結(jié)果中各列的細(xì)目:
?
- NAMESPACE:事件發(fā)生的命名空間。
- LAST SEEN:事件最后一次出現(xiàn)的時(shí)間。
- TYPE:類(lèi)型:事件類(lèi)型(如 Normal 或 Warning)。
- REASON:事件發(fā)生的原因。
- OBJECT:與事件相關(guān)的 Kubernetes 資源(如 pod、節(jié)點(diǎn))。
- MESSAGE:與事件相關(guān)的描述或消息。
?
排除 pod 初始化故障
假設(shè)您遇到了 pod 無(wú)法正確初始化的問(wèn)題。您可以使用 kubectl get events --all-namespaces
來(lái)識(shí)別與 pod 初始化失敗相關(guān)的事件,幫助您找出根本原因。
?
檢查 pod 日志
當(dāng)出現(xiàn)應(yīng)用程序級(jí)問(wèn)題時(shí),檢查 pod 日志至關(guān)重要。使用 kubectl logs <pod-name> -n <namespace>
查看給定命名空間中特定 pod 的日志。該命令對(duì)于識(shí)別應(yīng)用程序代碼中的錯(cuò)誤、異?;騿?wèn)題非常有用。
?
kubectl logs my-pod -n my-namespace
?
在這個(gè)例子中:
?
-
my-pod
是要從中獲取日志的 pod 的名稱(chēng)。 -
my-namespace
是 pod 所在的命名空間。
?
調(diào)試應(yīng)用程序錯(cuò)誤
想象一下,在 my-namespace
中名為 my-pod
的 pod 中運(yùn)行著一個(gè)應(yīng)用程序。如果應(yīng)用程序報(bào)錯(cuò),您可以使用 kubectl logs
檢索特定的錯(cuò)誤信息,從而幫助調(diào)試和解決問(wèn)題。
?
描述資源
kubectl describe
命令提供有關(guān)各種 Kubernetes 資源(如 pod、節(jié)點(diǎn)和部署)的詳細(xì)信息。通過(guò)運(yùn)行 kubectl describe <resource> <resource-name> -n <namespace>
,您可以訪問(wèn)大量數(shù)據(jù),包括事件、條件和配置詳情,幫助您找出問(wèn)題的根源。
?
kubectl describe pod my-pod -n my-namespace
?
在這個(gè)例子中:
?
-
pod
是資源類(lèi)型。 -
my-pod
是要描述的特定 pod 的名稱(chēng)。 -
my-namespace
是 pod 所在的命名空間。
?
運(yùn)行此命令后,將顯示指定 pod 的詳細(xì)信息。輸出將包括有關(guān) pod 的元數(shù)據(jù)、條件、事件等信息的不同部分。下面是輸出結(jié)果的示例:
?
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 的詳細(xì)信息,包括其元數(shù)據(jù)、容器信息、條件和事件。這些信息對(duì)于排除 pod 的故障會(huì)非常有用,比如初始化問(wèn)題、就緒問(wèn)題或與其生命周期相關(guān)的事件。
?
獲取 pod 信息
命令:
?
kubectl get pods -n <namespace>
?
說(shuō)明
kubectl get pods
命令用于檢索 Kubernetes 集群中運(yùn)行的 pod 的信息。
?
-n <namespace>
指定要列出 pod 的命名空間。請(qǐng)將 <namespace>
替換為您感興趣的實(shí)際命名空間名稱(chēng)。
?
示例
假設(shè)您有一個(gè)包含多個(gè)命名空間的 Kubernetes 集群,您想檢查 my-namespace 命名空間中 pod 的狀態(tài)。您可以使用以下命令:
?
kubectl get pods -n my-namespace
?
運(yùn)行該命令時(shí),輸出結(jié)果可能如下:
?
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
?
檢查節(jié)點(diǎn)狀態(tài)
節(jié)點(diǎn)是 Kubernetes 集群的支柱。為確保一切運(yùn)行順利,可執(zhí)行 kubectl get nodes
查看所有節(jié)點(diǎn)的狀態(tài)。
?
kubectl get nodes
?
運(yùn)行此命令后,您將看到集群中所有節(jié)點(diǎn)的列表及其當(dāng)前狀態(tài)。狀態(tài)可以是以下其中之一:
?
- Ready:這是理想狀態(tài)。這意味著節(jié)點(diǎn)是健康的,可以接受和運(yùn)行容器。
- NotReady:這種狀態(tài)表示節(jié)點(diǎn)無(wú)法正常運(yùn)行,或者遇到了妨礙其運(yùn)行容器的問(wèn)題。處于這種狀態(tài)的節(jié)點(diǎn)可能存在資源限制、網(wǎng)絡(luò)問(wèn)題或其他問(wèn)題。
- SchedulingDisabled:這種狀態(tài)意味著節(jié)點(diǎn)被明確標(biāo)記為不可調(diào)度,從而無(wú)法在其上調(diào)度新容器。這對(duì)于維護(hù)或故障排除很有用。
- Unknown:在某些情況下,由于與 Kubernetes 控制平面的通信問(wèn)題,節(jié)點(diǎn)的狀態(tài)可能是未知的。
?
理想情況下,在一個(gè)健康的 Kubernetes 集群中,所有節(jié)點(diǎn)都應(yīng)處于 "Ready"狀態(tài)。
?
示例
假設(shè)您運(yùn)行 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
?
在容器中執(zhí)行
有時(shí),調(diào)試需要親自動(dòng)手。通過(guò) kubectl exec
,您可以使用 /bin/bash
以交互方式進(jìn)入容器。當(dāng)您需要在容器內(nèi)調(diào)查問(wèn)題時(shí),這一點(diǎn)尤其有用。
?
示例
假設(shè)在命名空間 my-namespace
中有一個(gè)名為 my-pod
的 Kubernetes pod。在這個(gè) pod 中,有一個(gè)名為 my-container
的容器。您懷疑這個(gè)容器中存在問(wèn)題,并想進(jìn)行交互式調(diào)查。
?
下面是使用 kubectl exec
的方法:
?
kubectl exec -it my-pod -n my-namespace -- /bin/bash
?
在該命令中:
?
-
-it
用于指定交互式終端,允許您與容器內(nèi)的 shell 進(jìn)行交互。 -
my-pod
是要訪問(wèn)的 pod 的名稱(chēng)。 -
-n my-namespace
指定 pod 所在的命名空間。 -
-- /bin/bash
指定要在容器內(nèi)運(yùn)行的命令。在本例中,它是/bin/bash
,用于啟動(dòng) Bash shell。
?
運(yùn)行命令后,您將進(jìn)入容器的 shell?,F(xiàn)在,您可以像登錄到容器的操作系統(tǒng)一樣,交互式地運(yùn)行命令、檢查文件、查看日志和排除故障。
?
下面是一個(gè)會(huì)話的案例:
?
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
?
完成調(diào)試或故障排除任務(wù)后,可以鍵入 exit
退出容器的 shell。這將返回本地終端。
?
使用 kubectl exec
和 /bin/bash
是診斷和解決容器內(nèi)問(wèn)題的有力工具,在傳統(tǒng)調(diào)試方法不充分的情況下尤為重要。
?
用于服務(wù)調(diào)試的端口轉(zhuǎn)發(fā)
要調(diào)試 pod 內(nèi)運(yùn)行的服務(wù),可以使用 kubectl port-forward
將本地端口轉(zhuǎn)發(fā)到 pod 上的端口。這樣就能像訪問(wèn)本地運(yùn)行的服務(wù)一樣訪問(wèn)這些服務(wù),從而方便調(diào)試和測(cè)試。
?
示例
假設(shè)您在命名空間 my-namespace
中有一個(gè)名為 my-app-pod
的 Kubernetes pod,它在 8080 端口上托管了一個(gè)服務(wù),您想訪問(wèn)該服務(wù)進(jìn)行調(diào)試。
?
下面是使用 kubectl port-forward
將本地端口轉(zhuǎn)發(fā)到 pod 端口的方法:
?
kubectl port-forward my-app-pod -n my-namespace 8080:8080
?
在該命令中:
?
-
my-app-pod
是要將流量轉(zhuǎn)發(fā)到的 pod 的名稱(chēng)。 -
-n my-namespace
指定 pod 所在的名稱(chēng)空間。 -
8080:8080
表示要將流量從本地計(jì)算機(jī)的 8080 端口轉(zhuǎn)發(fā)到 pod 的 8080 端口。
?
建立端口轉(zhuǎn)發(fā)后,您就可以通過(guò)連接本地計(jì)算機(jī)上的http://localhost:8080
訪問(wèn) pod 內(nèi)運(yùn)行的服務(wù)。向本地 8080 端口發(fā)出的任何請(qǐng)求都將被轉(zhuǎn)發(fā)到 pod 上的相應(yīng)端口。下面是一個(gè)案例:
?
Forwarding from 127.0.0.1:8080 -> 8080
Handling connection for 8080
?
現(xiàn)在,您可以打開(kāi)網(wǎng)絡(luò)瀏覽器,或使用 curl
或 wget
等工具訪問(wèn) pod 中的服務(wù),就像它在本地運(yùn)行一樣:
?
curl http://localhost:8080
?
這樣,您就可以直接檢查服務(wù)并與之交互、測(cè)試 API 端點(diǎn)或調(diào)試問(wèn)題,而無(wú)需將服務(wù)暴露在更廣泛的網(wǎng)絡(luò)中。完成端口轉(zhuǎn)發(fā)后,可以在終端按下 Ctrl+C
停止端口轉(zhuǎn)發(fā)。
?
使用 kubectl port-forward
是調(diào)試和測(cè)試 Kubernetes pod 中運(yùn)行的服務(wù)的便捷方法,無(wú)需復(fù)雜的網(wǎng)絡(luò)配置或?qū)⒎?wù)暴露在外部。
?
資源指標(biāo)
kubectl top nodes
和 kubectl top pods -n <namespace>
可實(shí)時(shí)了解 CPU 和內(nèi)存的使用情況,幫助優(yōu)化資源。
?
示例
假設(shè)您想監(jiān)控 Kubernetes 集群中節(jié)點(diǎn)和 pod 的 CPU 和內(nèi)存使用情況。
?
節(jié)點(diǎn)指標(biāo):
?
要查看節(jié)點(diǎn)的資源使用指標(biāo),可以使用以下命令:
?
kubectl top nodes
?
下面是輸出結(jié)果的例子:
?
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)
以兆字節(jié)為單位顯示內(nèi)存使用情況。 -
MEMORY%
表示內(nèi)存使用百分比。
?
您可以快速識(shí)別 CPU 或內(nèi)存負(fù)載較高的節(jié)點(diǎn),并采取相應(yīng)措施,如縮放或調(diào)整資源分配。
?
Pod 指標(biāo):
?
要查看特定命名空間中 pod 的資源使用指標(biāo),請(qǐng)使用以下命令:
?
kubectl top pods -n my-namespace
?
將 my-namespace
替換為運(yùn)行 pod 的實(shí)際名稱(chēng)空間。下面是 pod 指標(biāo)輸出的示例:
?
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)
以字節(jié)為單位顯示 pod 的內(nèi)存使用情況。
?
通過(guò)監(jiān)控 pod 指標(biāo),您可以識(shí)別資源密集型 pod,優(yōu)化資源分配,并就 pod 的擴(kuò)展或資源請(qǐng)求和限制做出明智的決策。
??
kubectl top
命令提供的資源使用指標(biāo)對(duì)于確保 Kubernetes 集群中資源的有效使用、識(shí)別性能瓶頸以及優(yōu)化應(yīng)用程序的資源分配都很有價(jià)值。
?
檢查 API 服務(wù)器健康狀況
Kubernetes API 服務(wù)器對(duì)集群運(yùn)行至關(guān)重要。使用 kubectl get --raw=/healthz
查詢(xún)其健康狀況端點(diǎn),可以快速評(píng)估其健康狀況。
?
在該輸出中:
?
kubectl get --raw=/healthz
ok
?
響應(yīng) “ok” 表示 API 服務(wù)器正常運(yùn)行。
?
如果 API 服務(wù)器不健康或出現(xiàn)問(wèn)題,您可能會(huì)收到錯(cuò)誤信息或非 “ok” 響應(yīng),這可能表明存在需要調(diào)查和解決的問(wèn)題。
?
驗(yàn)證版本
最后,確保 Kubernetes 客戶端和服務(wù)器版本之間的兼容性至關(guān)重要。使用 kubectl version
獲取兩個(gè)版本的信息。
?
示例
要檢查客戶端和服務(wù)器版本,只需運(yùn)行:
?
kubectl version
?
輸出結(jié)果:
?
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
客戶端的相關(guān)信息。其中包括主版本、次版本和 GitVersion,后者指定了客戶端的確切版本。 -
Server Version
提供kubectl
客戶端所連接的 Kubernetes API 服務(wù)器的信息。它包括服務(wù)器的主版本、次版本和 GitVersion。
?
確保客戶端版本與服務(wù)器版本匹配或兼容。主要版本差異可能表示不兼容,應(yīng)加以解決。一般建議客戶端和服務(wù)器版本盡量保持一致,以避免出現(xiàn)兼容性問(wèn)題。
?
檢查版本與 kubectl version
的兼容性是確保 Kubernetes 環(huán)境穩(wěn)定、運(yùn)行良好的必要步驟。
?
結(jié)論
掌握 Kubernetes 故障排除是任何 Kubernetes 管理員或開(kāi)發(fā)人員的一項(xiàng)重要技能。本文概述的 kubectl
命令是您診斷和解決集群?jiǎn)栴}的盟友。請(qǐng)記住,有效的故障排除通常需要結(jié)合使用這些命令以及對(duì)應(yīng)用程序和基礎(chǔ)架構(gòu)的深入了解。此外,考慮實(shí)施 Prometheus 和 Grafana 等監(jiān)控和可觀察性解決方案,以主動(dòng)發(fā)現(xiàn)和解決問(wèn)題,確保 Kubernetes 集群的穩(wěn)定性和性能。通過(guò)利用這些工具和技術(shù),您可以自信地駕馭復(fù)雜的 Kubernetes 世界,并保持應(yīng)用程序的平穩(wěn)運(yùn)行。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-840185.html
到了這里,關(guān)于掌握 Kubernetes 故障排除技巧:kubectl命令的基本指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!