Kubectl是Kubernetes的命令行工具,可以用于與Kubernetes集群進(jìn)行交互和操作。在開發(fā)和調(diào)試過程中,我們經(jīng)常需要使用Kubectl來診斷和解決節(jié)點(diǎn)的問題。本教程將介紹如何使用Kubectl來調(diào)試Kubernetes節(jié)點(diǎn)。
一、準(zhǔn)備
必須擁有一個(gè) Kubernetes 的集群,同時(shí)必須配置 kubectl 命令行工具與集群通信。 建議在至少有兩個(gè)不作為控制平面主機(jī)的節(jié)點(diǎn)的集群上運(yùn)行本教程。 如果還沒有集群,可以通過 Minikube 構(gòu)建一個(gè)自己的集群,或者可以使用下面的 Kubernetes 練習(xí)環(huán)境之一:
- Killercoda
- 玩轉(zhuǎn) Kubernetes
Kubernetes 服務(wù)器版本必須不低于版本 1.2. 要獲知版本信息,請輸入 kubectl version.
需要有權(quán)限創(chuàng)建 Pod 并將這些新 Pod 分配到任意節(jié)點(diǎn)。 還需要被授權(quán)創(chuàng)建能夠訪問主機(jī)上文件系統(tǒng)的 Pod。
二、調(diào)試節(jié)點(diǎn)
使用 kubectl debug node 命令將 Pod 部署到要排查故障的節(jié)點(diǎn)上,此命令在無法使用 SSH 連接節(jié)點(diǎn)時(shí)比較有用。 當(dāng) Pod 被創(chuàng)建時(shí),Pod 會(huì)在節(jié)點(diǎn)上打開一個(gè)交互的 Shell。 要在名為 “mynode” 的節(jié)點(diǎn)上創(chuàng)建一個(gè)交互式 Shell,運(yùn)行:
kubectl debug node/mynode -it --image=ubuntu
Creating debugging pod node-debugger-mynode-pdx84 with container debugger on node mynode. If you don't see a command prompt, try pressing enter. root@mynode:/#
調(diào)試命令有助于收集信息和排查問題。 可能使用的命令包括 ip、ifconfig、nc、ping 和 ps 等等。 還可以從各種包管理器安裝 mtr、tcpdump 和 curl 等其他工具。
這些調(diào)試命令會(huì)因調(diào)試 Pod 所使用的鏡像不同而有些差別,并且這些命令可能需要被安裝。
用于調(diào)試的 Pod 可以訪問節(jié)點(diǎn)的根文件系統(tǒng),該文件系統(tǒng)掛載在 Pod 中的 /host 路徑。 如果在 filesystem 名字空間中運(yùn)行 kubelet, 則正調(diào)試的 Pod 將看到此名字空間的根,而不是整個(gè)節(jié)點(diǎn)的根。 對于典型的 Linux 節(jié)點(diǎn),可以查看以下路徑找到一些重要的日志:
/host/var/log/kubelet.log:負(fù)責(zé)在節(jié)點(diǎn)上運(yùn)行容器的 kubelet 所產(chǎn)生的日志。 /host/var/log/kube-proxy.log:負(fù)責(zé)將流量導(dǎo)向到 Service 端點(diǎn)的 kube-proxy 所產(chǎn)生的日志。 /host/var/log/containerd.log:在節(jié)點(diǎn)上運(yùn)行的 containerd 進(jìn)程所產(chǎn)生的日志。 /host/var/log/syslog:顯示常規(guī)消息以及系統(tǒng)相關(guān)信息。 /host/var/log/kern.log:顯示內(nèi)核日志。
當(dāng)在節(jié)點(diǎn)上創(chuàng)建一個(gè)調(diào)試會(huì)話時(shí),需謹(jǐn)記:
- kubectl debug 根據(jù)節(jié)點(diǎn)的名稱自動(dòng)生成新 Pod 的名稱;
- 節(jié)點(diǎn)的根文件系統(tǒng)將被掛載在 /host;
- 盡管容器運(yùn)行在主機(jī) IPC、Network 和 PID 名字空間中,但 Pod 沒有特權(quán)。 這意味著讀取某些進(jìn)程信息可能會(huì)失敗,這是因?yàn)樵L問這些信息僅限于超級用戶 (superuser)。 例如,chroot /host 將失敗。如果需要一個(gè)有特權(quán)的 Pod,請手動(dòng)創(chuàng)建。
三、清理
當(dāng)使用正調(diào)試的 Pod 完成時(shí),將其刪除:
kubectl get pods
NAME READY STATUS RESTARTS AGE node-debugger-mynode-pdx84 0/1 Completed 0 8m1s
# 相應(yīng)更改 Pod 名稱 kubectl delete pod node-debugger-mynode-pdx84 --now
pod "node-debugger-mynode-pdx84" deleted
注意:如果節(jié)點(diǎn)停機(jī)(網(wǎng)絡(luò)斷開或 kubelet 宕機(jī)且無法啟動(dòng)等),則 kubectl debug node 命令將不起作用。 這種情況下請檢查調(diào)試關(guān)閉/無法訪問的節(jié)點(diǎn)。